Docs & Support

Learn about all the Formidable features and get support from our amazing customer success team.

Add-onseCommerce
PayPal Form

PayPal Form

Want to collect PayPal payments on your WordPress site? Formidable Forms gives you two ways to do it, so you can start taking payments in just a few minutes. In this guide, we'll show you how to set up PayPal payments using both PayPal Commerce and PayPal Standard.

Info: There are two PayPal integrations. PayPal Commerce is the newer option and the one we recommend for all new setups. PayPal Standard is the legacy integration.

PayPal Commerce

PayPal Commerce lets you collect PayPal payments right on your WordPress site. Buyers can pay with PayPal, a credit card, and other wallets without leaving your form. It's available in Formidable Forms, including the free version, Formidable Forms Lite.

Note: If you use PayPal Commerce with Formidable Forms Lite, Expired, Basic, or Plus license, an application fee of 3% will be charged in addition to the PayPal fees. PayPal handles all of this, and no additional steps are required from the customer.
To avoid paying the extra 3% charge, upgrade to Formidable Forms Business or Elite. Note that fees are only collected for US merchants, and only for one-time payments.

Formidable Forms makes advanced site building simple. Launch forms, directories, dashboards, and custom WordPress apps faster than ever before.

Set up PayPal Commerce integration

Before you can take payments, connect your PayPal account to Formidable Forms.

  1. Go to Formidable → Global Settings and click the Payments tab.
  2. Click the PayPal button at the top of the page.
  3. Under PayPal Settings, find the Live panel and click the Connect button. If a Test account is already connected, scroll down the Live panel to find its Connect button.

    PayPal Commerce Global Settings
  4. PayPal opens in the same browser tab. Log in to your PayPal account, or click Sign Up to create one.

    PayPal login
  5. Once you're done, PayPal shows a "You're ready to get paid with PayPal on Formidable Forms!" message. Click Return to Formidable Forms.
  6. Back in your settings, the Live panel now shows a green Connected badge along with your connected account and Merchant ID. To unlink the account later, click the Disconnect button.

Set up PayPal Commerce form to collect payments

Now that your account is connected, build a form and add the PayPal Commerce action.

  1. Go to Formidable → Forms and click Add New. Then click Create a blank form.
  2. The new form opens with the title "(no title)". To name it, go to Settings → General and type a name in the Form Title box. Click Save to save the title. On a form you saved before, this button is Update. Next, click Build to go back to the fields.
  3. From the Pricing Fields section, add a Product field, a Quantity field, and a Total field. Set the price for each product. The Total field adds everything up for you.

    Pricing fields
  4. Add a Name field and an Email field. You map them to the billing information in the PayPal Commerce action.
  5. Add a Payment field below your other fields. This is the field buyers use to choose how they pay, so they fill out the form first and then pay. If you skip this step, Formidable adds the field when you save the PayPal Commerce action.

    Add Fields panel with the Payment field circled
  6. Click Update to save the form. Then go to form Settings → Actions & Notifications. If you leave the builder without saving, the browser asks to leave the page and the product price you set is lost.
  7. Hover over the PayPal Commerce card and click the Add button that appears. Make sure you pick PayPal Commerce, not the separate PayPal (Legacy) action.

    PayPal Commerce action - Add button on the action card
  8. The Collect a Payment action opens. Give the action an Action Name for easy reference. This name is only seen on the back end.
  9. Confirm PayPal is selected as the gateway. The choices are Stripe, Square, and PayPal.
  10. Set the Payment Type:
    • One-time Payment: Collect a single payment.
    • Recurring: Collect payments on a repeating schedule.
  11. (Optional) Add a Description to attach to the payment. Type it in, or click the field picker icon to pull it from a form field.
  12. Set the Amount to charge. Type in an amount, or click the field picker icon and select a form field, usually your Total field. Picking a field inserts its ID (like [344]). Amount is required, so payments won't work without it.
  13. Choose your Currency.

    Collect a Payment action with numbered circles 8 to 13 on Action Name, PayPal, Payment Type, Description, Amount and Currency
  14. Under PayPal Settings, set the following:
    • Layout: Choose Card and checkout buttons, Checkout buttons only, or Card only.
    • Pay Later: Choose Automatic, Turn off messaging, or Always Disable.
    • Order Sync: PayPal requires that any changes a buyer makes in the PayPal window update the entry data. So if someone types one email on your form but pays with a different email, the entry's email gets overwritten. This setting controls how that's handled:
      • Overwrite entry data: The data from PayPal replaces what the buyer entered on the form.
      • Create new order data fields: Instead of overwriting, Formidable adds hidden fields for name, email, and address, then stores the PayPal data there. That way you keep a record of both what was entered on the form and what came from PayPal.
    • Shipping Preference: Choose Use PayPal Account Data or No Shipping.
  15. Under PayPal Button Settings, set the button style:
    • Color: Choose Use Defaults, Gold, Blue, Silver, White, or Black. The PayPal button shows Silver, White, or Black. With the other choices, it keeps PayPal's standard gold color. Gold and Blue also style the Pay Later button, and Blue styles the Venmo button.
    • Label: Choose PayPal, PayPal Checkout, Buy Now, or Pay with PayPal.
    • Border Radius: Set the roundness of the button corners in pixels.

      PayPal Settings and PayPal Button Settings sections marked 14 and 15
  16. Under Billing Information, click the field picker icon in the Email box and select your Email field. Then choose your Name field's first name in the First Name dropdown and its last name in the Last Name dropdown.
  17. Click Update to save your form.
  18. Publish the form on a page, so buyers can fill it out and pay. Learn more about how to publish a form.
When you save the action, Formidable automatically adds a Payment field to your form if one isn't there already. This is the field buyers use to choose how they pay, so leave it in place. Don't delete it, or payments won't go through.

Set up a recurring PayPal Commerce payment

Want to bill buyers on a repeating schedule instead of once? Set the Payment Type to recurring inside your Collect a Payment action, then fill in the recurring settings below.

Recurring Payment Settings with numbered circles 3 to 7 on Product Name, Product Type, Repeat, Recurring Payment Limit and Trial Period
  1. Go to form Settings → Actions & Notifications and open your PayPal Commerce action.
  2. Set the Payment Type to Recurring. A Recurring Payment Settings section appears, and the Layout setting is hidden. Buyers pay recurring payments with the PayPal checkout buttons. The card fields, Google Pay, and Apple Pay don't appear on the form.
  3. Set the Product Name. This is required. Type in the name of what you're selling, or click the field picker icon to pull it from a form field.
  4. Choose the Product Type: Service, Digital, or Physical.
  5. Set Repeat to control how often the payment repeats. Enter a number, then choose the unit, such as 1 and month(s).
  6. Set the Recurring Payment Limit to cap the number of recurring payments. Type in a number, or click the field picker icon to pull it from a form field.
  7. Set the Trial Period to the number of trial day(s) before billing starts. Use 0 for no trial.
  8. Click Update to save your form.
— Premium Feature —

These options are available on the Basic, Plus, Business, and Elite licenses.

The paid version adds more options to the Collect a Payment action:
Billing Information with the Address dropdown marked 1 and the Shipping Information section marked 2

  • Map an Address in Billing Information (1), plus a full Shipping Information section (2) where you map the Email, Address, First Name, and Last Name.
  • A third Shipping Preference option, Use Address Field Data, which sends your form's address to PayPal.
  •  Add Conditional Logic to control when the action runs.
  • Add more than one PayPal Commerce action to a form, and use conditional logic to choose which one runs. Formidable Forms Lite runs one payment action per form.

Set up PayPal Commerce test payment integration

You can test payments before you accept real ones.

  1. Go to Formidable → Global Settings → Payments and click the PayPal button (1).
  2. Check the Use the PayPal test mode box (2).
  3. In the Test panel, click the Connect button and connect a PayPal sandbox account. The Test panel shows a green Connected badge (3) once it's linked.
PayPal payment settings with numbered circles on the PayPal button, the test mode box and the Test panel Connected badge

How the PayPal Commerce flow works

Here's what your buyers see when they pay through PayPal Commerce.

  1. On your published form, the buyer fills out the fields, then chooses how to pay in the Payment section. The options can include Credit Card (Visa, Mastercard, American Express, and Discover), PayPal, Venmo, Pay Later, Google Pay, and Apple Pay. The methods a buyer sees depend on what's available on your PayPal account.
  2. When they choose PayPal, a PayPal checkout popup opens. There they can pick how to pay (such as Pay in full, Pay in 4, or PayPal Credit), select a funding source, and click Pay.
  3. After paying, the buyer returns to your site and sees a success message with the payment source, such as Card. When the buyer pays with a PayPal account, the message also shows who made the payment and their address.
With PayPal Commerce, the payment options and card fields appear right on your form, so buyers can pay without being redirected away to another site. After they confirm, they land back on your page with a success message.

Set up Apple Pay for PayPal Commerce

Apple Pay shows on your form only after Apple has verified your domain. It also needs a page that uses HTTPS and a one-time payment. Recurring payments don't offer Apple Pay.

Buyers see the Apple Pay button on Apple devices that support it.

In the PayPal Commerce action, set the Layout to Card and checkout buttons or Checkout buttons only. Apple Pay is one of the checkout buttons, so the Card only layout doesn't show it.

When you connect PayPal, Formidable registers your WordPress site's domain with PayPal for Apple Pay. This happens separately for Live and Test. Apple verifies the domain with a file on your site, so add the file before you connect:

  1. Download the domain association file from PayPal. Use the live file for real payments, or the sandbox file while you use test mode. Only one file fits on your site, so replace the sandbox file with the live file when you start taking real payments.
  2. Upload the file to a folder named .well-known in your site's root folder, the same folder as wp-config.php. Use your host's file manager or FTP, and create the folder if it isn't there. Folders that start with a dot can be hidden, so turn on hidden files if you don't see it. Keep the file name apple-developer-merchantid-domain-association with no file extension.
  3. Check that the file opens at https://yourdomain.com/.well-known/apple-developer-merchantid-domain-association without redirecting. If you get a "not found" error or a redirect, ask your host to allow the .well-known folder over HTTPS.
  4. Connect your PayPal account, as shown in Set up PayPal Commerce integration. Formidable registers your domain for the mode you connect.
  5. Register a domain yourself if your PayPal account was connected before the file was in place. Do the same if your form appears on a different domain or subdomain than your WordPress site, such as forms.example.com. Log in to your PayPal Business account and go to Account Settings → Payment methods → Manage Apple Pay. Add the domain there. It then shows in your list of Apple Pay domains. Register every domain and subdomain that shows your form, and upload the file to each one.
  6. To check the setup, open the published form on an Apple device that supports Apple Pay. The Apple Pay option appears with the other payment methods.
If your PayPal Business account doesn't accept a subdomain, then add it from the PayPal Developer Dashboard instead. Log in there with the same PayPal account.

For the full requirements, see PayPal's Apple Pay integration guide.

View and manage PayPal Commerce payments

Keep track of every payment from one place, and issue refunds when you need to.

  1. Go to Formidable → Payments to open the Payments dashboard.
  2. The list shows the Customer, Receipt ID, Entry, Form, Amount, Subscription, Begin Date, Expire Date, Status, Date, and Processor. Use the form dropdown and the Filter button to narrow the list. The list is wide, so it's shown here in two parts.

    Payments list filter and the Customer, Receipt ID, Entry, Form, Amount and Subscription columns for two PayPal payments

    The same payments in the Begin Date, Expire Date, Status, Date and Processor columns
  3. Hover over a payment's receipt ID and click View to see its Status, User, Entry, Receipt, Amount, and Mode.
  4. To refund a payment, click the Refund link in the Payment Details panel. When the "Are you sure you want to refund that payment?" prompt appears, click Confirm. The Refund link changes to a green Refunded message. Reload the page to see the Status change to Refunded too.

    PayPal payment View page with the Payment details and an arrow on the Refund link

You'll also see payment info on the entry itself. Go to Formidable → Entries, open an entry, and check the Payment Details block for the Amount, Status, and Total Paid.

Troubleshooting PayPal Commerce

The Apple Pay button doesn't show

The form shows the Apple Pay button only when all of these are true:

  • The page uses HTTPS.
  • The payment is a one-time payment. Recurring payments don't offer Apple Pay.
  • The buyer is on an Apple device that supports Apple Pay.
  • Apple Pay is available on your PayPal account in your country.
  • The PayPal Commerce action's Layout is Card and checkout buttons or Checkout buttons only.
  • No custom code on your site turns off Apple Pay with the frm_include_google_pay_apple_pay or frm_paypal_commerce_include_apple_pay hook.

The Apple Pay payment sheet closes or the payment fails

Apple rejects Apple Pay payments from a domain it hasn't verified. If the payment sheet closes or the payment fails, check the domain setup in Set up Apple Pay for PayPal Commerce:

  • The domain association file opens at https://yourdomain.com/.well-known/apple-developer-merchantid-domain-association without redirecting.
  • The file matches your mode: the live file for real payments, or the sandbox file in test mode.
  • The exact domain or subdomain your form is on is in the list of Apple Pay domains in your PayPal account.

Additional customizations for PayPal Commerce

Learn where to put the code when adding a custom PHP function to your site.

Customize or remove the extra success message text

This hook lets you customize or remove the extra success message text that's added after a PayPal payment.
https://formidableforms.com/knowledgebase/frm_paypal_message/

Remove specific funding sources

This hook lets you customize the query args added to the PayPal SDK script URL before it's loaded. Use it to remove specific funding sources (like Venmo) from the front end, or override values like buyer country for testing.
https://formidableforms.com/knowledgebase/frm_paypal_sdk_url_query_args/

Turn off Google Pay and Apple Pay

Return false to stop Google Pay and Apple Pay from showing.
https://formidableforms.com/knowledgebase/frm_include_google_pay_apple_pay/

PayPal Standard Legacy

Note: PayPal Standard is the legacy integration. This integration's action is labeled PayPal (Legacy) under Settings → Actions & Notifications.

The PayPal forms plugin allows you to add PayPal to your website and collect PayPal payments using Formidable Forms. Send users and a total directly to PayPal after submitting a Formidable form. Your users do NOT need to have a PayPal account in order to pay with PayPal.

Download and install

To access this add-on, ensure you have the Business license or above.
  1. If you haven't already, install and activate the current version of Formidable Forms Premium on your WordPress site.
  2. After confirming your Formidable Forms license, proceed to the Formidable → Add-Ons page and toggle on the PayPal Legacy add-on (the WordPress PayPal Standard legacy plugin).
Install the PayPal Legacy add-on

Set up the PayPal add-on

Now that the PayPal forms plugin is activated, set up Formidable Forms to integrate with your PayPal account. To add PayPal to your website, connect your PayPal account and set up instant payment notifications.

Connect your PayPal account

  1. Now that the PayPal form plugin is activated, go to Formidable → Global Settings → Payments and click the PayPal button. The add-on's settings are under PayPal Standard (Legacy) Settings.
  2. Insert your PayPal email address and update any other settings. For live sites, make sure the PayPal environment is set to Live. Otherwise, users will be prompted to set up new PayPal accounts.
    PayPal forms plugin Global Settings

Set up instant payment notifications

Your PayPal account must be set up to automatically send payment notifications to ensure your received payments are accurately recorded as paid. Follow the directions below to get started.

  1. Log in to your PayPal Business account.
  2. Hover over your name at the top right section of the page, then select Account Settings from the dropdown menu.

    Access PayPal Business account settings
  3. Navigate to Account Settings → Notifications → Instant payment notifications and click the Update link.

    Configure the PayPal Instant Payment Notifications IPN
  4. Click the Choose IPN Settings button.

    Choose the PayPal IPN Settings
  5. Specify the notification URL and select Receive IPN messages (Enabled). Click the Save button to save your changes. The notification URL input in the specified field will be irrelevant since Formidable PayPal will override it.

    Enter notification URL in PayPal Instant Payment Notification (IPN) settings


    Learn more about PayPal instant payment notifications (IPN).

Set up a form to take PayPal payments

Once the PayPal Forms plugin is activated, connect your PayPal account and set up instant payment notifications. After doing so, set up a form for collecting payments. Follow the directions below to collect PayPal payments with a Formidable form.

  1. Go to the form you want to use with PayPal. Go to form Settings → Actions & Notifications. Hover over the PayPal (Legacy) card and click + Add.

    Actions & Notifications cards with the PayPal (Legacy) card hovered and its + Add button circled
  2. Give your PayPal form action an Action Name for easy reference. This name will only be seen on the back-end.

    PayPal (Legacy) action with numbered circles 2 to 5 on Action Name, Item Name, PayPal Email and Amount
  3. Set the Item Name. The item name will appear on the PayPal page and the PayPal receipt. You can either type in a static product name or select a field from your form if it will change depending on your user's selection.
  4. Insert the email associated with your PayPal account. The PayPal Email box starts with the email from your PayPal Standard (Legacy) global settings.
  5. Set an Amount for the online payment. Click the Set Amount link if you want a specific value used in the transaction.

    PayPal form set amount


    If you want the PayPal amount to change based on a field in the form, enable separate values in a dropdown or radio button field, then enter the amount for each option in the Saved Value column.

    PayPal form separate values


    You can then select this field in your PayPal form action.
  6. Set the Payment Type:

    • One-time Payment: Collect a one-time payment.

    • Donation: Collect a one-time donation.

    • Subscription: Use this option to set up recurring payments. Check out Set up a recurring payment for more instructions.


    PayPal form action settings
  7. Select the Currency that will be used.
  8. In the Return URL box, insert the URL you want to send the user to after processing their online payment. In the Cancel URL box, insert the URL you want to send the user to if they cancel the transaction. Both boxes start with the URLs from your Formidable Global Settings → Payments → PayPal settings. Change them to send this form's buyers to different pages. Keep a URL in each box: if you clear a box and save, no URL is sent to PayPal for it, and the global URL isn't used instead.
  9. In the After Payment section, you may change the value of a field when the status of a payment has changed. Use this setting to save the payment status in a field. Click Update to save a new action before you add After Payment rows. Rows added before the action's first save aren't kept.
  10. If you want to conditionally send users to PayPal after form submission, you will need to add Conditional Logic. Conditional Logic needs Formidable Forms Pro.
  11. Hit Update so these settings will be saved.

Save payment status in a field

If you want to save the status of a payment in a field in your form, follow the instructions below.

  1. Go into editing a form that has a PayPal action included.
  2. Add a dropdown field. Set the field label as Payment status and add the options Pending and Completed. Select Pending as the default value.

    Payment status dropdown options with Pending selected as the default value
  3. To hide the field from the user, open the Advanced section in the field options. Set Visibility to Administrator. Then click Update.

    PayPal form Visibility Admin

For extra security and to prevent malicious users from changing the values of the payment status field, use the frm_validate_field_entry filter to set the value to pending only for a new entry.
  1. Go to your form Settings → Actions & Notifications. Under Current Actions, click your PayPal (Legacy) action to open it. Don't add a new one. If you just added the action, click Update first, so the After Payment row you add next is saved.
    Current Actions list with an arrow on the saved PayPal (Legacy) action
  2. Scroll down to the After Payment section. Click the Add button.
    After Payment section of the PayPal (Legacy) action, below the Return URL and Cancel URL boxes, with an arrow on + Add
  3. In the Payment Status column, select Completed. In the Field column, select your Payment status field. In the Value column, type Completed, spelled exactly like the option in your Payment status field.
    After Payment row with Completed, the Payment status field and the value Completed
  4. Hit Update. Now when a form payment is successfully completed, the payment status field will switch to Completed to reflect the status of the PayPal payment. If the payment status is not updating properly, please review the IPN troubleshooting steps.

Set up a recurring payment

If you want to set up a PayPal form action to take recurring payments, follow the steps below:

  1. Set up your WordPress form to take PayPal payments.
  2. Under Payment type, select Subscription.

    PayPal form Recurring payment
  3. In the Repeat Every section, select how often the payment will recur.
  4. You may include a trial period before the actual subscription begins. If you want to include a trial period, select Start this subscription with a trial. Input how much the Trial amount will be, then select how long the Trial Length will be.
  5. If you want to retry a failed recurring payment, select Retry a failed payment for a subscription. A failed PayPal payment is considered to be a subsequent payment in a recurring profile that doesn't go through. This does not include failing to complete the first payment once sent to PayPal.
  6. Click Update. Now when a user submits the form, they will be taken to PayPal to make the first payment of the recurring series. PayPal will automatically bill the user at intervals determined by your Repeat Every setting.

Set up a recurring and non-recurring payment

If you want to set up a WordPress form that allows a user to select a recurring payment or a non-recurring payment, follow the instructions below.

  1. Create a new form or edit an existing form that takes payments. Add a Radio Button or Dropdown field. Add options for the user to select a recurring or non-recurring payment.

    PayPal form Radio Buttons
  2. Click Update.
  3. Go to the form Settings → Actions & Notifications. Hover over the PayPal (Legacy) card and click + Add to add a PayPal form action.

    Actions & Notifications cards with the PayPal (Legacy) card hovered and its + Add button circled
  4. In the Action Name field, insert Non-Recurring Payments.

    PayPal Non-Recurring Payments
  5. In the Item Name box, click the field picker icon and select the radio button field. This inserts the field ID in brackets, like [25]. The value submitted in the form then appears on the PayPal page.
  6. In the Amount section, select Set Amount. In the box, type in the amount of the non-recurring payment.
  7. In the Payment Type, select One-time Payment.
  8. Scroll down and turn on Add Conditional Logic (1). Leave Do and Any selected. Set the condition to your radio button field equals the non-recurring option (2). Long option names are shortened in the dropdown.

    Conditional logic turned on (1) with the condition Membership equals Annual Membership (2)
  9. Go to the form Settings → Actions & Notifications, hover over the PayPal (Legacy) card and click + Add to add another PayPal (Legacy) form action.

    Actions & Notifications cards with the PayPal (Legacy) card hovered and its + Add button circled
  10. In the Action Name field, insert Recurring Payments.

    PayPal Recurring Payments
  11. In the Item Name box, click the field picker icon and select the radio button field. This inserts the field ID in brackets, like [25]. The value submitted in the form then appears on the PayPal page.
  12. In the Amount section, select Set Amount. In the box, type in the amount of the recurring payment.
  13. In the Payment Type, select Subscription. In the Repeat Every section, select how often the recurring payment will occur.
  14. Scroll down and turn on Add Conditional Logic (1). Leave Do and Any selected. Set the condition to your radio button field equals the recurring option (2).

    Conditional logic turned on (1) with the condition Membership equals Monthly Membership (2)
  15. Click Update. Now when the user submits a form, they will be charged depending on their selection of either the recurring or non-recurring option.

Set up two different currencies

If you want to set up a form that allows a user to select between two different currencies (e.g. US Dollars (USD) and Canadian Dollars (CAD)), follow the instructions below.

  1. Set up your form to take PayPal payments.
  2. Add a Radio button or Dropdown field in your form with options for users to select their preferred currency payment.

    PayPal Two different currency payments
  3. Add a PayPal form action and set its Currency to U.S. Dollar (USD). Then turn on Add Conditional Logic (1) and set the condition to Currency equals US Dollars (USD) (2).

    Conditional logic turned on (1) with the condition Currency equals US Dollars (USD) (2)
  4. Add another PayPal form action and set its Currency to Canadian Dollar (CAD). Then turn on Add Conditional Logic (1) and set the condition to Currency equals Canadian Dollars (CAD) (2).

    Conditional logic turned on (1) with the condition Currency equals Canadian Dollars (CAD) (2)
  5. (Optional) For the other PayPal form action using Canadian Dollars (CAD) currency, you can change the Return URL and Cancel URL to that of your separate PayPal Canadian account. These are the URLs used for PayPal to send users after purchase or if they cancel the transaction.

If you want to accept recurring and non-recurring payments for both currencies, follow the steps below instead.

  1. Set up your form to take recurring and non-recurring payments.
  2. Add a Radio button or Dropdown field in your form with options for users to select their preferred currency payment.

    PayPal Two different currency payments
  3. In the Recurring Payments form action with US Dollars (USD) currency, turn on Add Conditional Logic (1) and select All (2). Then set two conditions. Click Add Condition (3) to add the second row. The second condition uses your recurring or non-recurring field, here called Membership. Long option names are shortened in the dropdown.

    • Currency equals US Dollars (USD)

    • Membership equals Monthly Membership (Recurring)


    Conditional logic turned on (1), All selected (2) and two conditions joined by AND: Currency equals US Dollars (USD) and Membership equals Monthly Membership (Recurring), with Add Condition (3)
  4. In the Non-Recurring Payments form action with US Dollars (USD) currency, turn on Add Conditional Logic (1) and select All (2). Then set two conditions. Click Add Condition (3) to add the second row. Long option names are shortened in the dropdown.

    • Currency equals US Dollars (USD)

    • Membership equals Annual Membership (Non-recurring)


    Conditional logic turned on (1), All selected (2) and two conditions joined by AND: Currency equals US Dollars (USD) and Membership equals Annual Membership (Non-recurring), with Add Condition (3)
  5. Repeat steps 3 and 4 to create the form actions for the Canadian Dollars (CAD) currency payments.

How to use PayPal testing mode

If you have a new website and want to test accepting payments through PayPal, you can set up a sandbox account to do the testing without using your personal PayPal account. Follow the instructions below to get started.

  1. If you still need to, sign up for a personal and PayPal Business account.
  2. Once logged into your account, ensure you have configured the instant payment notifications (IPN) in your PayPal Business account.
  3. Open a separate window on your browser and go to the Sandbox Account Dashboard at https://developer.paypal.com/dashboard/accounts.
  4. On the PayPal Sandbox Accounts page, you will see that your first Business and Personal Sandbox account was created when you signed up for a developer account on the developer site. Copy the Business Sandbox email, as this is the email address you will use in your Formidable PayPal settings.

    Access the PayPal Sandbox Account page.
  5. Go back to your WordPress site. In the Formidable → Global Settings → Payments → PayPal, select Testing as the PayPal environment and set the PayPal email to the email address from your Business Sandbox test account. Click the Update button to save your changes.

    Configure the Formidable PayPal Settings.
  6. To check if the PayPal testing environment is working properly, go to the form you want to use with PayPal and go to form Settings → Actions & Notifications. Hover over the PayPal (Legacy) card and click + Add.

    Actions & Notifications cards with the PayPal (Legacy) card hovered and its + Add button circled
  7. Insert the Business Sandbox email into the PayPal email field of the form action.

    Insert the PayPal email in the form action.
  8. Run a test transaction and pay using your Personal Sandbox email, which you can find in your PayPal Sandbox account.
The Hold email notifications until payment is received option doesn't trigger when PayPal is in test mode.

Trigger an action after payment is complete

Trigger an action after a PayPal payment is completed. Send a payment notification email, subscribe a user to MailChimp, send a text, or register a user only after a successful PayPal payment. Please note that any actions you want to trigger after a completed payment must be included in the same form.

  1. Go to your form Settings → Actions & Notifications and open the action that you want to trigger after a PayPal payment is completed.
  2. In the Trigger this action when dropdown, select Successful PayPal payment. Several triggers can be checked at once.
  3. Uncheck Entry is created, so the action only runs after the payment is complete. It's checked by default.

    Trigger this action when dropdown with Successful PayPal payment checked (2) and Entry is created unchecked (3)
  4. Click Update. Now when the user submits a payment in PayPal, and your site is notified by PayPal of the payment completion, the action will be triggered. The action will not be triggered until the PayPal notification is received. If the actions are not triggering after a complete payment, please review the IPN troubleshooting steps.

Publish a post on complete payment

If you want to publish a post only after collecting a PayPal form payment, follow the steps below.

  1. Set up your form to take a PayPal payment.
  2. Add a Create posts action.
  3. Add a post status field to your form, if you don't have one already. In the Create Post action, set Post Status to Create New Dropdown Field. This adds a Status field to your form.
  4. Select Draft as the default value in your new Status field. Click the field, then click the circle beside Draft under Dropdown Options.

    Status field Dropdown Options with an arrow on the default dot beside Draft


    If you do not want the user to have access to changing the status of this field you can set the field to Read Only. You can also hide the whole field from the user by changing the Visibility to Administrator.
  5. Click Update.
  6. Go into the form's PayPal action. In the After Payment section, click Add. If the section already has a row, click the + icon at the end of that row to add another. Then fill in the new row:

    • Set the dropdown in the Payment Status column to Completed.

    • Set the dropdown in the Field column to your Status field.

    • Type publish in the Value column.


    PayPal After Payment Publish
  7. Click Update and Publish your form on a page. Now when a user creates a post and submits the form, they will be taken to PayPal so they can submit a payment. The post will not be published until the PayPal payment notification is received.

Enable guest checkout

If you want to allow users to checkout without having to sign up for a PayPal account, follow the instructions below. Please note that users with PayPal accounts will still have the option to sign in.

  1. Log into your PayPal account.
  2. Hover over your name at the top right of the page and select Account Settings.

    PayPal name menu open with an arrow on Account Settings
  3. Click Seller tools in the left menu. Some accounts call it My selling tools.
  4. On the Seller tools page, select Website preferences.

    PayPal Website Payments
  5. You will then be redirected to the Website payment preferences page. Scroll down to PayPal account optional and make sure the PayPal account optional is turned on.

    PayPal Account Optional
  6. Now, when the user checks out, they can either sign in to their account or check out as a guest.. Please note that if the user chooses to check out as a guest, they can sign up for a PayPal account after checkout.
Visit the PayPal page for more instruction on enabling guest checkout.

Troubleshooting

Not sending to PayPal on submit

If you're not sent to PayPal when your form is submitted, you may have one of the following problems:

  • The 'Total' amount is 0. You must have a Total greater than 0 in order to be sent to PayPal.
  • You may have conditional logic on your PayPal action that is preventing it from firing.

If this does not help solve the problem, please create a ticket in our help desk.

Instant payment notifications

If PayPal is not notifying your site when a payment is complete, please go through each of the steps below.

  1. Double-check that instant payment notifications are enabled in your PayPal account.
  2. Check if you have a firewall plugin that may prevent PayPal from reaching your site. If you're not sure, visit yoursite.com/wp-admin/admin-ajax.php?action=frm_payments_paypal_ipn while logged out. If you see a blank page, that's good. If you are running a firewall plugin that may be blocking the IPN data, please disable that plugin and submit a new payment.
  3. If you are implementing any Access Control List (ACL) or filters on IP addresses for the IPNs received from PayPal, you need to add or whitelist the following PayPal IP Addresses. Doing so will help avoid missing IPNs from PayPal.
    • 66.211.170.66, 173.0.81.1, 173.0.81.0/24, 173.0.81.33, 173.0.81.65, 173.0.81.140
  4. If your PayPal environment is set to 'Testing', try switching to 'Live'. You can switch from Testing to Live in your Formidable → Global Settings → Payments → PayPal.
  5. Check to see if you have any custom code on your site that might interfere. If you have custom code that uses the frm_payment_paypal_ipn hook or that modifies any entry values in the PayPal form, please remove the code and submit a new payment.
  6. Turn on the debug log. Go into Formidable → Global Settings → Payments → PayPal and check the 'Log results from IPN notifications' option. Hit Update. Then submit a new payment and open the debug log. Create a new ticket in our help desk and paste the log data in the ticket.
  7. If you see 'IPN Response from PayPal Server: INVALID' in your debug log, please log into your PayPal account and review your IPN history page. Check if there are any notifications logged there and check their status. Report your findings in a help desk ticket.
  8. If you see pending_reason=unilateral in your debug log, check if you have verified your email address. The payment is pending because it was made to an email address that is not yet confirmed or registered. Report your findings in a help desk ticket.

PayPal emails not being sent

While it is possible to trigger an email on successful payments, PayPal only sends out a Payment Failure notice on recurring payments. It gets fired when a subscription payment attempts to charge and fails. It doesn’t fire, however, on initial or one-time payments that aren’t completed or even new payments that fail.

As a workaround, use the Form Action Automation add-on to send a reminder 30 mins after purchase. Then add conditional logic to the email notification based on your Paid status. If the payment status field is not updated to Paid, then the email sends out.

Things don't appear to be working at the moment

If you're seeing an error message Things don’t appear to be working at the moment in your PayPal checkout page, you may need to unblock the non-encrypted websites to make payments. To resolve this, follow the instructions below.

  1. Log into your PayPal account.
  2. Hover over your name at the top right of the page and select Account Settings.

    PayPal name menu open with an arrow on Account Settings
  3. Click Seller tools in the left menu. Some accounts call it My selling tools.
  4. On the Seller tools page, select Website preferences.

    PayPal Website Payments
  5. You will then be redirected to the Website payment preferences page. Scroll down to Encrypted website payments and select Off next to Block Non-encrypted Website Payment.

    PayPal Encrypted Website Payments

Additional customizations for PayPal Standard Legacy

Learn where to put the code when adding a custom PHP function to your site.

Add a currency

If you need to take a payment in a currency that is not included in the PayPal action's currency options, you may add a currency using the frm_currencies hook.

Send user info to PayPal

When a visitor fills in details on your site, save them time by passing this information along to PayPal. This prefills the field values over at PayPal. A full list of allowed values is kept in the PayPal docs.

add_filter( 'formidable_paypal_url', 'frm_send_user_info_to_paypal', 10, 3 );

function frm_send_user_info_to_paypal( $paypal_url, $entry_id, $form_id ) {

if ( $form_id == 5 ) { //change 5 to the ID of your form

$entry = FrmEntry::getOne( $entry_id, true );

$paypal_url .= '&first_name=' . urlencode( $entry->metas[25] ); // change 25 to your first name field ID

$paypal_url .= '&last_name=' . urlencode( $entry->metas[26] ); // change 26 to your last name field ID

$paypal_url .= '&email=' . urlencode( $entry->metas[27] ); // change 27 to your email field ID

$address_field_id = 28; // change 28 to your address field ID

$address_meta = $entry->metas[$address_field_id];

$paypal_url .= '&address1=' . urlencode( $address_meta['line1'] );

$paypal_url .= '&address2=' . urlencode( $address_meta['line2'] );

$paypal_url .= '&city=' . urlencode( $address_meta['city'] );

$paypal_url .= '&zip=' . urlencode( $address_meta['zip'] );

$paypal_url .= '&state=' . urlencode( $address_meta['state'] );

$paypal_url .= '&country=' . urlencode( $address_meta['country'] );

}

return $paypal_url;

}

Limit number of recurring payments

Setting an end date for recurring payments is not currently an option, but you may use the code below to only have a certain number of recurring payments. Replace 5 with your form ID. Replace 4 with the number of recurring payments that you want to take.

add_filter( 'formidable_paypal_url', 'set_recurring_payment_limit', 10, 3 );

function set_recurring_payment_limit( $paypal_url, $entry_id, $form_id ) {

if ( $form_id == 5 ) { //change 5 to the ID of your form

$paypal_url .= '&srt=4';

}

return $paypal_url;

}

Change the user role after payment

Use the following example to change a user's role after they make a PayPal payment. Change 'contributor' to the role you want to set after a payment is completed. Change 123 to your form ID.

add_action('frm_payment_paypal_ipn', 'change_paid_user_role');

function change_paid_user_role($args){

if ( $args['entry']->form_id != 123 ) {

return;

}

$new_role = 'contributor'; //change this to the role paid users should have

if(!$args['pay_vars']['completed']) {

return; //don't continue if the payment was not completed

}

if(!$args['entry']->user_id or !is_numeric($args['entry']->user_id)) {

return; //don't continue if not linked to a user

}

$user = get_userdata($args['entry']->user_id);

if(!$user) {

return; //don't continue if user doesn't exist

}

$updated_user = (array) $user;

// Get the highest/primary role for this user

$user_roles = $user->roles;

$user_role = array_shift($user_roles);

if ( $user_role == 'administrator' ) {

return; //make sure we don't downgrade any admins

}

$updated_user['role'] = $new_role;

wp_update_user($updated_user);

}

Save transaction ID in field

If you want to save the transaction ID in a field after the payment is complete, you may use the code below. You can add it to a child theme's functions.php file or the Code Snippets plugin. Replace 10 with the ID of your form and replace 123 with the ID of the field that will store the transaction ID. Make sure the field is blank by default or you will get extra data added to your database when this code is triggered.

The $vars includes three keys:

  • pay_vars: an array that includes the data from the frm_payments table, so it has id, meta_value, receipt_id, invoice_id, sub_id, item_id, action_id, amount, status, begin_date, expire_date, paysys, created_at, completed.
  • payment: the raw object version of pay_vars.
  • entry: the entry object that was just created.
add_action('frm_payment_paypal_ipn', 'save_frmpaypal_transaction_id');

function save_frmpaypal_transaction_id( $vars ){

if ( ! $vars['pay_vars']['completed'] ) {

return; //don't change value if the payment was not completed

}

if ( $vars['entry']->form_id == 10 ) {

$field_id = 123;

$transaction_id = $vars['pay_vars']['receipt_id'];

if ( $transaction_id ) {

FrmEntryMeta::add_entry_meta( $vars['entry']->id, $field_id, null, $transaction_id );

}

}

}

If the one-time payment fails the first time, you can generate a link to allow users to pay again without filling out the form a second time. This shortcode can be used in a number of different ways. The most likely use is in a view where you can add filters like "User ID equals current user", and the shortcode is [pay_again id=[id]]. You can also set a specific entry id here if you want [pay_again id=60].

Note: This isn't set up to work with recurring payments. The shortcode uses the PayPal (Legacy) action listed first under Current Actions in the form's settings. Actions are listed by Action Name, A to Z. The link uses that action's amount, item name, Return URL and Cancel URL, but the PayPal email and currency from your global PayPal settings. On a form with one action per currency, every link uses the global currency.

add_shortcode('pay_again', 'pay_frm_again');

function pay_frm_again($atts) {

if ( ! class_exists('FrmPaymentsController') ) {

return;

}

$atts = shortcode_atts(array('id' => '', 'form_id' => ''), $atts);

$entry_id = $atts['id'];

$entry = FrmEntry::getOne($entry_id, true);

if ( empty($atts['form_id']) ) {

$atts['form_id'] = $entry->form_id;

}

$form = FrmForm::getOne($atts['form_id']);

$action_control = FrmFormActionsHelper::get_action_for_form($form->id, 'paypal', 1);

if ( ! $action_control ) {

return;

}

$settings = $action_control->post_content;

$amount_field = isset($settings['paypal_amount_field']) ? $settings['paypal_amount_field'] : '';

if ( $amount_field ) {

$_POST['item_meta'][$amount_field] = $entry->metas[$amount_field]; // set the POST for the amount

}

$amount = FrmPaymentsController::get_amount($form, $settings);

if ( empty($amount) ) {

return;

}

global $wpdb;

$invoice = $wpdb->get_var($wpdb->prepare('SELECT id FROM '. $wpdb->prefix .'frm_payments WHERE item_id=%d AND amount=%s AND paysys=%s', $entry_id, (float) $amount, 'paypal'));

if ( ! $invoice ) {

return;

}

$frm_payment_settings = new FrmPaymentSettings();

$paypal_url = 'https://www.paypal.com/cgi-bin/webscr/';

$paypal_url .= '?cmd='. (( isset($settings['paypal_type']) && ! empty($settings['paypal_type']) ) ? $settings['paypal_type'] : '_xclick');

$paypal_url .= '&' . 'notify_url='. FrmPaymentsHelper::format_for_url(admin_url('admin-ajax.php') . "?action=frm_payments_paypal_ipn");

$paypal_url .= '&business='. FrmPaymentsHelper::format_for_url($frm_payment_settings->settings->business_email);

$paypal_url .= '&' . 'currency_code='. FrmPaymentsHelper::format_for_url($frm_payment_settings->settings->currency);

$paypal_url .= '&return='. FrmPaymentsHelper::format_for_url( FrmPaymentsHelper::get_action_setting( 'return_url', array( 'settings' => $settings ) ) );

$paypal_url .= '&cancel_return='. FrmPaymentsHelper::format_for_url( FrmPaymentsHelper::get_action_setting( 'cancel_url', array( 'settings' => $settings ) ) );

$paypal_url .= '&invoice='. FrmPaymentsHelper::format_for_url($invoice .'-'. FrmPaymentsHelper::get_rand(3));

$paypal_url .= '&custom='. $entry_id.'|'. wp_hash($entry_id);

$paypal_url .= '&amount='. urlencode($amount);

if ( defined('ICL_LANGUAGE_CODE') ) {

$paypal_url .= '&lc='. FrmPaymentsHelper::format_for_url(ICL_LANGUAGE_CODE);

}

$item_name = apply_filters('frm_content', $settings['paypal_item_name'], $form, $entry_id);

$paypal_url .= "&item_name=". urlencode($item_name);

return '<a href="'. $paypal_url .'">Pay Now</a>';

}

The link in this snippet always goes to live PayPal (www.paypal.com). To test it with a sandbox account, change the address in the $paypal_url line to https://www.sandbox.paypal.com/cgi-bin/webscr/.

Change return URL

Since version 3.0, the PayPal (Legacy) action has its own Return URL box, so most sites don't need this snippet. The snippet adds a second return address after the one from the action's Return URL box.

add_filter('formidable_paypal_url', 'formidable_paypal_url', 10, 3);

function formidable_paypal_url($paypal_url, $entry_id, $form_id){

if($form_id == 5) //change 5 to the ID of your form

$paypal_url .= '&return='. urlencode('http://example.com');

return $paypal_url;

}
Was this article helpful? *

This article may contain affiliate links. Once in a while, we earn commissions from those links. But we only recommend products we like, with or without commissions.

In this article

    We have a small, but amazing team of dedicated people who are committed to helping you achieve your goals and project requirements.


    Copyright © 2026 Strategy11, LLC. Formidable Forms® is a registered trademark Strategy11, LLC.

    Complete your purchase
    Don't forget your purchase!
    Complete Purchase
    Join 400,000+ using Formidable Forms to create form-focused solutions fast. Get Formidable Forms