Form Forge integrates with Stripe to let you collect credit card payments directly within your forms. This is the right solution for order forms, donation forms, service bookings, event registrations with fees, and any situation where you need to charge visitors at the time of submission. The payment field is powered by Stripe Elements, which means card data is entered into Stripe’s secure iframe and never touches your WordPress server.
Stripe is trusted by millions of businesses worldwide. Form Forge takes no commission on payments — 100% goes to your Stripe account (minus Stripe’s standard processing fees). You control everything from your Stripe dashboard.
What You Need Before Starting
- A Stripe account (sign up free at stripe.com if you do not have one)
- Your Stripe Publishable Key and Secret Key (found in your Stripe dashboard)
- Your Stripe Webhook Signing Secret (created during setup)
Setup Walkthrough
- Log in to your Stripe Dashboard at dashboard.stripe.com.
- Click the Developers menu, then API Keys.
- You will see two keys: Publishable Key (starts with
pk_) and Secret Key (starts withsk_). Start with your Test mode keys to verify the setup works before going live. - Copy both keys.
- In WordPress, go to Form Forge > Settings > Stripe.
- Paste the Publishable Key into the first field.
- Paste the Secret Key into the second field.
- Make sure the Mode toggle is set to Test (since you are using test keys).
- Now set up the webhook. In Stripe, go to Developers > Webhooks and click Add Endpoint.
- Enter the webhook URL shown on the Form Forge Stripe settings page (it will look like
https://yourdomain.com/wp-json/formforge/v1/stripe-webhook). - Under “Events to send,” select
payment_intent.succeeded,payment_intent.payment_failed, andcharge.refunded. - Click Add Endpoint, then copy the Webhook Signing Secret that Stripe generates.
- Back in Form Forge settings, paste the Webhook Signing Secret into the corresponding field.
- Click Save Settings.
Adding a Payment Field to Your Form
- Open your form in the builder.
- Drag the Payment (Stripe) field from the PRO fields section into your form. Place it near the bottom, typically as the last field before the submit button.
- Click the pencil icon on the payment field to open the right-hand Field Settings panel. The Payment (Stripe) section there has these controls:
– Amount (when Fixed) — type the price in major currency units, like 49.99. Stripe’s minimum is 0.50.
– Linked Calculation field (when Dynamic) — pick the Calculation field whose result should become the charge. The displayed amount on the form updates live as the visitor changes inputs that feed the calculation.
– Currency — USD, EUR, GBP, CAD, AUD, JPY, RUB, CNY, INR, BRL, or MXN.
– Mode — normally leave on “Inherit from global Stripe settings” so the form uses your global Test/Live toggle. Use Test or Live to force a specific mode for this one field (rare; useful for staging a single live form on an otherwise test site).
– Description — shown on the visitor’s Stripe receipt and recorded in your Stripe dashboard. Keeps your accounting tidy (“Premium subscription monthly”, “Conference 2026 ticket”, etc.).
- Save the form. The payment field does not expose the generic Placeholder setting because Stripe’s Card Element does not support a normal text-input placeholder.
Dynamic payment amounts are validated twice: the browser blocks values below Stripe’s minimum before creating a PaymentIntent, and the server recomputes the amount from the submitted Calculation field before sending it to Stripe. If the calculated amount is missing, negative, below the minimum, or does not match the client-sent amount, no charge is created.
Testing with Stripe Test Cards
Always test before going live. Stripe provides test card numbers:
| Card number | What it simulates |
|---|---|
| 4242 4242 4242 4242 | Successful payment |
| 4000 0000 0000 0002 | Declined card |
| 4000 0025 0000 3155 | Requires 3D Secure authentication |
Use any future expiration date (like 12/30) and any three-digit CVC (like 123) with test cards.
Going Live
Once testing is complete:
- In your Stripe dashboard, switch to Live mode and copy your live Publishable Key and Secret Key.
- In Form Forge settings, replace the test keys with live keys.
- Toggle the Mode to Live.
- Create a new webhook endpoint in Stripe for live mode (using the same URL) and update the Webhook Signing Secret.
- Save settings.
Troubleshooting Stripe
| Problem | Most likely cause | Solution |
|---|---|---|
| Payment field does not appear | Stripe keys not saved or mode mismatch | Verify keys in Settings and check the Mode toggle |
| Payment field is locked in the builder | Free plan | Activate Form Forge PRO; crafted saves are also downgraded server-side |
| Dynamic amount stays at 0.00 | Linked Calculation field not selected, formula has no inputs, or stale frontend JS | Select the Calculation field, test the formula in Live preview, then hard-refresh cached pages |
| “Payment amount must be at least…” | The fixed or calculated amount is below Stripe’s minimum | Raise the fixed amount or correct the Calculation formula before testing |
| “Card declined” on test card | Using the wrong test card number | Use 4242 4242 4242 4242 for a successful test payment |
| Payment status does not update after refund/failure | Webhook not configured correctly | Verify the webhook URL in Stripe and the Signing Secret in Form Forge |
| “Unauthorized” error in console | Secret Key is invalid or expired | Regenerate keys in Stripe and update Form Forge settings |
| Payments work in Test but not Live | Using test keys in live mode (or vice versa) | Make sure you switched both keys and the Mode toggle |
Optional Email field says pi_... is missing an @ after payment | Older Stripe runtime wrote the PaymentIntent ID into the wrong visible input when field IDs collided | Update Form Forge and clear page/script cache |
> Tip: Start in Test Mode, submit several test payments, verify they show up in your Stripe Test Dashboard, then switch to Live Mode keys only when you are confident everything works correctly.
> Good to know: Form Forge takes no commission on payments. Without PRO, the Payment field is not available. Card data is handled entirely by Stripe through their secure embedded form element and never stored on your WordPress server. Form Forge validates the submission before charging the card; reCAPTCHA, required-field, Calendar Picker, map-address, or server validation errors stop before Stripe capture. If Stripe declines the card, Form Forge shows the Stripe error only and does not save a successful submission. During payment/submission processing, conversational forms disable the visible submit button and show a loading label just like standard forms. Successful payments are stored with payment_status = succeeded, while webhooks can later update the status to failed or refunded.
[Screenshot: The Stripe settings page in Form Forge showing fields for Publishable Key, Secret Key, Webhook Signing Secret, and the Test/Live mode toggle]
—