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.
Upgrade your WordPress site with powerful, flexible forms.
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.
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.
From Idea to Reality in Minutes. Build Powerful Forms, Dashboards, Apps and More.
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.
- Go to Formidable → Global Settings and click the Payments tab.
- Click the PayPal button at the top of the page.
- 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 opens in the same browser tab. Log in to your PayPal account, or click Sign Up to create one.

- Once you're done, PayPal shows a "You're ready to get paid with PayPal on Formidable Forms!" message. Click Return to Formidable Forms.
- 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.
- Go to Formidable → Forms and click Add New. Then click Create a blank form.
- 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.
- 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.

- Add a Name field and an Email field. You map them to the billing information in the PayPal Commerce action.
- 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.

- 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.
- 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.

- The Collect a Payment action opens. Give the action an Action Name for easy reference. This name is only seen on the back end.
- Confirm PayPal is selected as the gateway. The choices are Stripe, Square, and PayPal.
- Set the Payment Type:
- One-time Payment: Collect a single payment.
- Recurring: Collect payments on a repeating schedule.
- (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.
- 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.
- Choose your Currency.

- 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.
- 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.

- 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.
- Click Update to save your form.
- Publish the form on a page, so buyers can fill it out and pay. Learn more about how to publish a form.
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.

- Go to form Settings → Actions & Notifications and open your PayPal Commerce action.
- 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.
- 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.
- Choose the Product Type: Service, Digital, or Physical.
- Set Repeat to control how often the payment repeats. Enter a number, then choose the unit, such as 1 and month(s).
- 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.
- Set the Trial Period to the number of trial day(s) before billing starts. Use 0 for no trial.
- Click Update to save your form.
These options are available on the Basic, Plus, Business, and Elite licenses.
The paid version adds more options to the Collect a Payment action:

- 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.
- Go to Formidable → Global Settings → Payments and click the PayPal button (1).
- Check the Use the PayPal test mode box (2).
- 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.

How the PayPal Commerce flow works
Here's what your buyers see when they pay through PayPal Commerce.
- 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.
- 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.
- 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.
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:
- 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.
- Upload the file to a folder named
.well-knownin your site's root folder, the same folder aswp-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 nameapple-developer-merchantid-domain-associationwith no file extension. - Check that the file opens at
https://yourdomain.com/.well-known/apple-developer-merchantid-domain-associationwithout redirecting. If you get a "not found" error or a redirect, ask your host to allow the.well-knownfolder over HTTPS. - Connect your PayPal account, as shown in Set up PayPal Commerce integration. Formidable registers your domain for the mode you connect.
- 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. - 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.
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.
- Go to Formidable → Payments to open the Payments dashboard.
- 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.


- Hover over a payment's receipt ID and click View to see its Status, User, Entry, Receipt, Amount, and Mode.
- 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.

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_payhook.
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-associationwithout 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
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
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
- If you haven't already, install and activate the current version of Formidable Forms Premium on your WordPress site.
- 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).

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
- 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.
- 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.

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.
- Log in to your PayPal Business account.
- Hover over your name at the top right section of the page, then select Account Settings from the dropdown menu.

- Navigate to Account Settings → Notifications → Instant payment notifications and click the Update link.

- Click the Choose IPN Settings button.

- 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.

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.
- 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.

- Give your PayPal form action an Action Name for easy reference. This name will only be seen on the back-end.

- 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.
- Insert the email associated with your PayPal account. The PayPal Email box starts with the email from your PayPal Standard (Legacy) global settings.
- Set an Amount for the online payment. Click the Set Amount link if you want a specific value used in the transaction.

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.
You can then select this field in your PayPal form action. - 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.

- Select the Currency that will be used.
- 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.
- 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.
- 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.
- 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.
- Go into editing a form that has a PayPal action included.
- Add a dropdown field. Set the field label as Payment status and add the options Pending and Completed. Select Pending as the default value.

- To hide the field from the user, open the Advanced section in the field options. Set Visibility to Administrator. Then click Update.

- 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.

- Scroll down to the After Payment section. Click the Add button.

- 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.

- 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:
- Set up your WordPress form to take PayPal payments.
- Under Payment type, select Subscription.

- In the Repeat Every section, select how often the payment will recur.
- 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.
- 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.
- 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.
- 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.

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

- In the Action Name field, insert Non-Recurring Payments.

- 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.
- In the Amount section, select Set Amount. In the box, type in the amount of the non-recurring payment.
- In the Payment Type, select One-time Payment.
- 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.

- Go to the form Settings → Actions & Notifications, hover over the PayPal (Legacy) card and click + Add to add another PayPal (Legacy) form action.

- In the Action Name field, insert Recurring Payments.

- 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.
- In the Amount section, select Set Amount. In the box, type in the amount of the recurring payment.
- In the Payment Type, select Subscription. In the Repeat Every section, select how often the recurring payment will occur.
- 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).

- 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.
- Set up your form to take PayPal payments.
- Add a Radio button or Dropdown field in your form with options for users to select their preferred currency payment.

- 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).

- 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).

- (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.
- Set up your form to take recurring and non-recurring payments.
- Add a Radio button or Dropdown field in your form with options for users to select their preferred currency payment.

- 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)

- 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)

- 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.
- If you still need to, sign up for a personal and PayPal Business account.
- Once logged into your account, ensure you have configured the instant payment notifications (IPN) in your PayPal Business account.
- Open a separate window on your browser and go to the Sandbox Account Dashboard at https://developer.paypal.com/dashboard/accounts.
- 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.

- 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.

- 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.

- Insert the Business Sandbox email into the PayPal email field of the form action.

- Run a test transaction and pay using your Personal Sandbox email, which you can find in your PayPal Sandbox account.
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.
- Go to your form Settings → Actions & Notifications and open the action that you want to trigger after a PayPal payment is completed.
- In the Trigger this action when dropdown, select Successful PayPal payment. Several triggers can be checked at once.
- Uncheck Entry is created, so the action only runs after the payment is complete. It's checked by default.

- 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.
- Set up your form to take a PayPal payment.
- Add a Create posts action.
- 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.
- Select Draft as the default value in your new Status field. Click the field, then click the circle beside Draft under Dropdown Options.

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. - Click Update.
- 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.

- 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.
- Log into your PayPal account.
- Hover over your name at the top right of the page and select Account Settings.

- Click Seller tools in the left menu. Some accounts call it My selling tools.
- On the Seller tools page, select Website preferences.

- 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.

- 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.
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.
- Double-check that instant payment notifications are enabled in your PayPal account.
- 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.
- 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
- 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.
- 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.
- 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.
- 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.
- 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.
- Log into your PayPal account.
- Hover over your name at the top right of the page and select Account Settings.

- Click Seller tools in the left menu. Some accounts call it My selling tools.
- On the Seller tools page, select Website preferences.

- 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.

Additional customizations for PayPal Standard Legacy
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 );
}
}
}Insert a link for payment
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;
}















































How to Setup Recurring Payments for Memberships in WordPress Without Coding
Authorize.net vs PayPal: The Best Features, Pricing, and More
How To Create a PayPal Payment Form in WordPress
How To Make a WordPress Form with Payment Gateways
Is Stripe Better than PayPal for a Business?
How to Accept Payments on WordPress for Free
PayPal vs Stripe for Nonprofits in WordPress
How To Set Up Recurring Donations in WordPress
The Best WordPress PayPal Plugin (3 Ways to Sell)
How to Create a Donation Form in WordPress [4 Easy Steps!]