WordPress Plugins
Free Tools
Claude Skills
Pricing Blog Switch to Royal Plugin Graveyard Support My Account Cart
Support / FormForge / Stripe Payment Integration

Stripe Payment IntegrationPRO

This page teaches you how to accept credit card payments through FormForge Pro forms using Stripe. You’ll get your API keys from the Stripe dashboard, enter them in FormForge Integrations, add a Product field to your form, enable payments per form, configure the webhook, and test everything with Stripe’s Test Mode before switching to live keys.

You’ll need

A free Stripe account and administrator access to your WordPress site. Setup takes about 15 minutes end-to-end, including testing in Test Mode before going live.

How Stripe payments work in FormForge

FormForge does not process card details itself. When a visitor submits a form with a payment field, three things happen in sequence:

  1. Stripe’s JavaScript renders a card input on your form. The visitor’s card details are sent directly to Stripe from their browser, never to your WordPress site.
  2. Stripe creates a Payment Intent for the amount FormForge tells it to charge (based on the Product or Total field in the form) and returns a client secret to the browser.
  3. On successful payment authorization, the form is submitted to FormForge with a reference to the Payment Intent. FormForge verifies with Stripe that the payment succeeded before saving the entry.

This means your WordPress database never stores card numbers. PCI compliance stays entirely on Stripe’s side. It also means that a form entry in FormForge > Entries always corresponds to a successful payment. Failed payments never leave orphan entries behind.

Stripe pricing (as of 2026)

Stripe charges 2.9% + 30¢ per successful US card charge, with adjustments for international cards and business type. FormForge adds no fees on top of Stripe’s. Verify current pricing at stripe.com/pricing before launching.

Step 1: Get your Stripe API keys

Stripe issues two pairs of keys for every account: a Test pair (for development) and a Live pair (for real payments). You’ll enter both into FormForge and toggle between them with a single checkbox.

Sign in to the Stripe Dashboard

Go to dashboard.stripe.com/apikeys. If you don’t have a Stripe account yet, sign up first at stripe.com. Signup is free and takes about 5 minutes.

Copy the Test keys

On the API Keys page, look for the Standard keys section. You’ll see a Publishable key starting with pk_test_ and a Secret key starting with sk_test_. Click Reveal on the secret key and copy both values.

Copy the Live keys

Toggle the Test mode switch in the Stripe dashboard (top right) to OFF. The keys shown will change to Live keys: pk_live_... and sk_live_.... Copy both. You’ll enter all four keys into FormForge in Step 2 so switching between Test and Live later is a single checkbox flip.

Use Standard keys, not Restricted keys

Stripe also offers Restricted keys with scoped permissions. Those do not work with FormForge because the integration needs to create Payment Intents and retrieve their status. Use the Standard keys shown at the top of the API Keys page. Do not create a Restricted key.

Step 2: Enable Stripe in FormForge Integrations

Open FormForge Integrations

In your WordPress admin, go to FormForge > Integrations. The Payments tab opens by default with Stripe as the first option.

Check Enable Stripe payments

Under the Stripe section, tick the Enable Stripe payments checkbox. This activates the Stripe gateway globally. It will not yet do anything until you enter keys and enable payments on individual forms.

Enable Test Mode

Tick the Enable test mode (no real charges) checkbox in the Test Mode row. In Test Mode, FormForge uses your test keys and Stripe processes payments against a sandbox that never moves real money. Leave this ON while you set up and verify. You’ll turn it off in the “Switching to Live payments” section below.

Paste all four API keys

Fill in the four fields under Test API Keys and Live API Keys:

  • Test Publishable Key: paste your pk_test_... value
  • Test Secret Key: paste your sk_test_... value
  • Live Publishable Key: paste your pk_live_... value
  • Live Secret Key: paste your sk_live_... value

Entering both key pairs up front means you can flip between Test and Live later with just the Test Mode checkbox, without re-entering keys.

Save Payment Settings

Click Save Payment Settings at the bottom of the page. FormForge will show a Connected status next to Stripe if the keys are valid.

Step 3: Add a Product field to your form

Stripe needs to know how much to charge. FormForge determines the charge amount from a Product field in your form. If your form has no Product (or Total) field, Stripe won’t render on the front end even with everything else configured.

Open the form in the builder

Go to FormForge > All Forms, click the form name to open the builder. Or create a new form.

Drag a Product field onto the canvas

In the field palette on the left, find the Product field (money icon). Drag it into your form. Place it above your Submit button.

Pick the Product Type

Click the Product field on the canvas to open its settings. The Product Type dropdown offers five options:

  • Single Product: one fixed-price item (for example, “Yearly Coaching” for $497).
  • Dropdown: multiple products in a select menu; the visitor picks one.
  • Radio Buttons: multiple products as radio options; visually clearer than a dropdown for 2-4 items.
  • User Defined Price: the visitor enters the amount (donations, pay-what-you-want).
  • Hidden: fixed price applied silently, not shown to the visitor.

Fill in product details

For Single Product or Hidden, enter a Product Name and Price. For Dropdown or Radio Buttons, click + Add Product Option to add each name/price pair. For User Defined Price, optionally set a Minimum Price to prevent zero or micro-payments.

Save the form

Click Save Form. The form now knows what to charge.

Step 4: Enable payments on the form

Global Stripe setup prepares the credentials; per-form payment enablement decides which forms actually collect payment. This lets you have contact forms and payment forms in the same install without every form trying to charge money.

Open the form builder’s Settings tab

Still in the form builder, click the Settings tab in the top navigation. Scroll to the Payment Collection section.

Check Enable payments for this form

Tick Enable payments for this form. A payment indicator appears in the form canvas showing which gateway is active (“Gateway: Stripe ✓”). If it says “None”, go back to Step 2 and confirm Stripe is enabled.

Save the form again

Save. The form is now configured to collect payment on submit. The next time this form renders on the front end, FormForge will inject the Stripe card element above the submit button.

Which gateway if you have multiple?

FormForge Pro supports Stripe, PayPal, Square, Mollie, and Authorize.net simultaneously. If more than one is enabled globally, the form uses whichever is set as the active gateway in the form’s Settings. Most sites enable only one at a time.

Step 5: Configure the Stripe webhook (recommended)

Webhooks let Stripe notify FormForge of asynchronous payment events (a customer disputes a charge, an authenticated payment completes minutes after the initial authorization, a refund is issued from the Stripe dashboard). FormForge fires WordPress action hooks on receipt, which you or developers can wire to custom notifications, CRM syncs, or accounting integrations.

Webhooks are not strictly required for simple one-time payments, because FormForge verifies the payment status inline before saving the entry. But configuring the webhook is recommended so events that happen after the initial submit (chargebacks, delayed 3DS confirmation) are still processed.

Find your webhook URL

Your webhook URL is https://yourdomain.com/wp-admin/admin-ajax.php?action=rfp_stripe_webhook (replace yourdomain.com with your actual site domain). Copy this URL.

Add the endpoint in Stripe

In the Stripe Dashboard, go to Developers > Webhooks. Click Add endpoint. Paste your webhook URL into the Endpoint URL field. Under Events to send, select at minimum payment_intent.succeeded and payment_intent.payment_failed. Click Add endpoint.

Copy the Signing secret

After creating the endpoint, Stripe shows a Signing secret starting with whsec_.... Click Reveal and copy it.

Paste the signing secret into FormForge

Back in FormForge > Integrations > Payments > Stripe, paste the whsec_... value into the Webhook Secret field. Save Payment Settings.

Test the webhook

In the Stripe Dashboard on your webhook’s detail page, click Send test webhook. Pick payment_intent.succeeded and send. Stripe should show a green “200 OK” response. If you see 400 or another error, your webhook secret is wrong or the URL is unreachable; see Troubleshooting below.

Signature verification is enforced

FormForge rejects any webhook whose signature doesn’t match the signing secret you configured. This prevents attackers from forging fake payment_intent.succeeded events to trigger downstream actions without paying. If webhooks stop working after you rotate keys in Stripe, verify the signing secret in FormForge matches the current one shown on the webhook’s detail page in Stripe.

Step 6: Test a payment with Stripe’s test card

Before switching to Live mode, run a full end-to-end test with the Stripe test card. This verifies that keys, form, product field, and webhook are all wired correctly.

Open the form on the front end

In a browser (ideally incognito to avoid caching), open the page where your form is embedded. You should see a card input labelled “Pay with Card” above the Submit button, plus a “Test mode” notice reminding you no real charges happen.

Fill in the form and enter the test card

Fill in the other fields normally. In the card input, enter:

  • Card number: 4242 4242 4242 4242
  • Expiration: any future date (for example, 12/30)
  • CVC: any three digits (for example, 123)
  • ZIP: any valid postal code

Submit the form

Click Submit. FormForge shows the “Processing payment...” state briefly, Stripe authorizes the test card, and the form displays your success message. If you see “Payment failed. Please try again.”, jump to the Troubleshooting section.

Verify the entry in FormForge

Go to FormForge > Entries. Your test submission should be at the top with the payment amount displayed. Open the entry to see the Stripe transaction ID (pi_...) recorded in the payment log.

Verify the payment in Stripe

Open your Stripe Dashboard (in Test mode). Go to Payments. Your test payment should appear with the exact amount, the metadata field containing the FormForge form_id, and status “Succeeded”. If it’s not there, FormForge didn’t hand off to Stripe correctly.

Other test cards

Stripe provides test cards to simulate specific outcomes: 4000 0000 0000 0002 for a generic decline, 4000 0025 0000 3155 for 3D Secure authentication required, 4000 0000 0000 9995 for insufficient funds. Full list at stripe.com/docs/testing. Use these to verify your form gracefully handles declined payments.

Switching to Live payments

Once you’ve verified the test flow works end-to-end, switching to real payments is a one-checkbox change.

Un-check Test Mode

In FormForge > Integrations > Payments > Stripe, un-check the Enable test mode (no real charges) checkbox. Because you entered your Live keys back in Step 2, FormForge immediately starts using them.

Add a Live webhook in Stripe

Test Mode webhooks and Live webhooks are separate in Stripe. Repeat Step 5 with Test Mode toggled OFF in the Stripe dashboard to create a Live webhook. Copy the new whsec_... signing secret and update FormForge’s Webhook Secret field.

Save Payment Settings

Save. FormForge is now live.

Run one real transaction

Submit the form with a real card, for a small amount you can refund. Verify the entry lands in FormForge and the payment appears in your Live Stripe dashboard. Then refund the test transaction from Stripe. This confirms everything works end-to-end before you announce the form to customers.

Test Mode notice appears on the form

While Test Mode is ON, FormForge shows a visible “Test mode” notice to every visitor with the message “Test mode - use card 4242 4242 4242 4242”. This is intentional to prevent visitors from entering real card details into a test-mode form. If you see this notice on your live form, Test Mode is still enabled. Un-check it before promoting the form.

Troubleshooting

Card element does not render on the form

You see the form on the front end but the card input area is missing. Check in order:

  1. Payments enabled globally: FormForge > Integrations > Payments > Stripe must have the Enable Stripe payments checkbox ticked.
  2. Keys entered: whichever key pair matches Test Mode’s state must be filled in. Test Mode ON requires Test keys; Test Mode OFF requires Live keys.
  3. Payments enabled on the form: the form’s Settings tab must have “Enable payments for this form” ticked.
  4. Product or Total field present: the form must have a Product field (or Total) so FormForge knows what amount to charge. Without one, the card element won’t render.

“Payment failed. Please try again.” on every test submission

The card details are valid but FormForge/Stripe rejected the transaction. Common causes:

  1. Wrong keys for the mode: Test Mode is ON but you pasted Live keys (or vice versa). Verify the Test Publishable Key starts with pk_test_ and the Test Secret Key starts with sk_test_.
  2. Server can’t reach Stripe: FormForge POSTs to api.stripe.com. If your host blocks outbound HTTPS to Stripe, payment intent creation fails. Contact your host to allow outbound requests to stripe.com.
  3. Restricted key in use: Restricted keys don’t have permission to create Payment Intents. Use a Standard key from the API Keys page top section.

Webhook test returns 400 or 401 in Stripe Dashboard

Stripe successfully reached your site but got an error response. Common causes:

  1. Signing secret mismatch: the whsec_... value in FormForge’s Webhook Secret field doesn’t match the one Stripe generated for this endpoint. Re-copy from Stripe’s endpoint detail page and paste again.
  2. Test vs Live secret mixed up: Test Mode webhooks use a different signing secret than Live Mode webhooks. If you switched modes, update the secret in FormForge.
  3. Webhook URL blocked: some hosts or security plugins block admin-ajax.php requests from unauthenticated sources. Check your firewall or security plugin’s block log for the request from Stripe’s IPs and allowlist them.

Payments succeed in Stripe but the FormForge entry is missing

The card was charged but the entry never landed in FormForge > Entries. This is rare but possible if the visitor closes the tab between successful Stripe authorization and FormForge’s save step. Recovery:

  1. Find the payment in Stripe Dashboard > Payments. Note the Payment Intent ID (pi_...) and the amount.
  2. If the webhook is configured (Step 5), Stripe will retry the payment_intent.succeeded event for 3 days. In practice, this is what the webhook exists to handle. Verify your webhook in Stripe shows successful (200) delivery for that event.
  3. If webhooks are not set up, manually reach out to the customer to reconcile. Consider refunding the payment through Stripe and having the customer re-submit the form.

“Your card was declined” on the test card

The default test card 4242 4242 4242 4242 should always succeed. If it’s being declined, you may be in Live Mode with a real card that’s failing. Check that Test Mode is ticked in FormForge Integrations, then reload the form and try again. Live Mode + 4242... = decline because the card doesn’t exist in the real world.

FAQ

Do I need a Stripe account before I can accept payments?

Yes. Sign up for free at stripe.com. FormForge does not process payments itself; it hands the card details off to Stripe, which handles authorization, PCI compliance, and the money movement. Your Stripe account holds the funds and is where you set up bank payouts, refunds, and tax reporting.

Can I test payments before going live?

Yes. Enable Test Mode in FormForge > Integrations > Payments > Stripe. Test Mode uses your Stripe test API keys, which look like pk_test_... and sk_test_.... Real money is never moved in Test Mode. Use the test card number 4242 4242 4242 4242 with any future expiration date and any three-digit CVC to simulate a successful payment. Stripe provides other test cards to simulate declined payments, requires-authentication, and other flows.

Does FormForge support subscriptions or only one-time payments?

FormForge Pro’s Stripe integration currently supports one-time payments only. When a form is submitted with a Product or Total field, FormForge creates a Stripe Payment Intent for that amount and charges the card once. Recurring subscription payments require Stripe’s Subscriptions API and are not part of the current FormForge Pro integration.

What happens if a payment fails?

If Stripe declines the card or the payment intent fails to complete, the form entry is not saved and the visitor sees a validation error explaining the payment failed. This means every entry in FormForge > Entries corresponds to a successful payment. Failed payments never leave behind orphan entries. If you configured a webhook, Stripe also sends a payment_intent.payment_failed event which FormForge fires as a WordPress action hook for custom logging.

What currencies does FormForge support?

Any currency your Stripe account supports. Stripe defaults to USD, but you can charge in EUR, GBP, AUD, and dozens of others depending on your Stripe account settings. FormForge passes the currency code through when creating the payment intent, so the currency displayed on the customer’s bank statement matches your Stripe account’s default.

Can I offer PayPal alongside Stripe?

Yes. FormForge Pro supports Stripe, PayPal, Square, Mollie, and Authorize.net in parallel through the same Integrations page. Enable each gateway you want, enter its credentials, and configure the form to use one of them as its active gateway. Most sites pick one primary gateway to reduce complexity.

Is card data ever stored on my WordPress site?

No. Stripe.js sends card details directly from the visitor’s browser to Stripe’s servers, bypassing your WordPress database entirely. FormForge only ever handles the Payment Intent ID (a reference like pi_...) and never touches the raw card number, CVC, or expiration. This is why using Stripe means you don’t become PCI-scoped for handling card data.

Can I refund payments from FormForge?

Refunds are handled entirely on the Stripe side. Log in to dashboard.stripe.com, find the payment in the Payments list, and click Refund. The FormForge entry stays in place (the form was still submitted), but you can add an admin note or use the entry’s status field to mark it as refunded internally. If webhooks are configured, Stripe fires charge.refunded which developers can hook into for custom entry status updates.