# Stripe Payment Integration

> Accept Stripe payments through FormForge Pro forms: get API keys, enter them in Integrations, add product fields, enable payments per form, set up webhooks.

- Canonical: <https://royalplugins.com/support/formforge/stripe-integration/>
- Last updated: 2026-09-17
- HTML version: <https://royalplugins.com/support/formforge/stripe-integration/>

---

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](https://stripe.com/) 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](https://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](https://dashboard.stripe.com/apikeys). If you don’t have a Stripe account yet, sign up first at [stripe.com](https://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](https://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](https://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.

[Setting Up reCAPTCHA](https://royalplugins.com/support/formforge/recaptcha-setup/)
[Understanding Entries](https://royalplugins.com/support/formforge/understanding-entries/)
