PayPal is the built-in payment provider included in the free Fundations plugin. No Pro license is required. It uses the PayPal Orders v2 REST API and redirects donors to PayPal’s hosted checkout before returning them to your site.
Why use PayPal
PayPal is the quickest provider to activate. If you have a PayPal Business account, you can accept donations in minutes with no additional software. It works for donors with a PayPal account and for those who prefer to pay by card through PayPal’s hosted page.
What it does
When a donor submits a donation form with PayPal selected:
- Fundations creates a PayPal Order via the REST API.
- The donor is redirected to the PayPal-hosted checkout page.
- The donor approves the payment.
- PayPal redirects the donor back to your site.
- Fundations captures the approved order, marks the donation as paid, updates the fundraiser total, and sends the confirmation email.
PayPal also sends an asynchronous webhook to your site to confirm the payment. This handles cases where the donor closes the browser before the return redirect completes.
How to set up PayPal
Step 1: Create a PayPal Business account
If you do not already have one, sign up at paypal.com/business and complete business verification.
Step 2: Create a REST app and get credentials
- Go to developer.paypal.com and sign in.
- Navigate to Apps & Credentials.
- Select the Live tab (or Sandbox for testing).
- Click Create App, give it a name (for example, “Fundations”), and click Create App again.
- Copy the Client ID and Secret shown on the app detail page.

Step 3: Configure in WordPress
- In your WordPress admin, go to Fundations → Settings → Donation Form.
- Open the PayPal tab.
- Check Enable PayPal.
- Paste your Live Client ID and Live Secret.
- If you want to test first, also paste the Sandbox Client ID and Sandbox Secret, then set mode to Test.
- Optionally upload a custom logo to display on the donation form’s PayPal option.
- Click Save Changes.

Step 4: Set up the webhook (recommended)
The webhook lets PayPal notify your site when a payment completes, even if the donor does not return to your site. Without it, donations can stay in a pending state if the donor closes the browser after paying.
- In the PayPal Developer Dashboard, open your app and scroll to Webhooks.
- Click Add Webhook.
- Enter your webhook URL:
https://yoursite.com/wp-json/get-fund/v1/paypal-webhook - Select at minimum these events:
CHECKOUT.ORDER.APPROVED,PAYMENT.CAPTURE.COMPLETED. - Save the webhook.
> Note about webhook verification: By default, Fundations accepts all incoming PayPal webhooks without verifying the signature. If you add the PayPal Webhook ID to the WordPress options table (get_fund_paypal_live_webhook_id for live, get_fund_paypal_test_webhook_id for test), Fundations will verify every webhook signature against the PayPal API. There is currently no UI field for the webhook ID — see the developer section below.
Step 5: Test your setup
- Set PayPal to Test mode in Fundations settings.
- In the PayPal Developer Dashboard, go to Sandbox → Accounts and note the buyer test account.
- Make a donation on your site and complete it with the sandbox buyer credentials.
- Check Fundations → Donations to confirm the donation shows as paid.
- Switch to Live mode when everything looks correct.
Settings reference
| Option | Description |
|---|---|
| Enable PayPal | Turns PayPal on or off on the donation form. |
| Mode | Switch between Test (sandbox) and Live. |
| Live Client ID | From PayPal Developer Dashboard, live app. |
| Live Secret | Secret for the live app. |
| Test Client ID | From the sandbox app. |
| Test Secret | Secret for the sandbox app. |
| Logo | URL of an image to show next to the PayPal option on the donation form. Optional. |
What you can and cannot do
PayPal supports payments via the PayPal wallet, PayPal Pay Later, and card payments through PayPal’s hosted page. You can use test mode to verify the full flow before going live, run PayPal alongside Mollie or Stripe at the same time, and customize the logo shown next to the PayPal option on the form.
There are a few things PayPal does not support in Fundations. Recurring donations are currently disabled across all providers. PayPal’s Smart Payment Buttons cannot be shown inline on your page; Fundations redirects to PayPal’s hosted checkout instead. Webhook signature verification cannot be configured from the WordPress admin UI — it requires a manual database entry. PayPal also cannot charge donors automatically without their interaction.
Troubleshooting
Donations stay in “pending” after the donor returns from PayPal. This usually means the capture step failed. Check that your site is reachable over HTTPS and that the PayPal credentials are correct for the mode (sandbox vs live). Also confirm the webhook URL is publicly accessible.
“Invalid credentials” error when saving. Verify that you copied the Client ID and Secret from the correct app and the correct mode tab (Sandbox or Live) in the PayPal Developer Dashboard. Sandbox and live credentials are completely different.
Donations are not marked paid when the donor closes the browser after paying. Without a configured webhook, Fundations cannot receive PayPal’s asynchronous payment confirmation. Follow Step 4 above to add the webhook.
Test donations show as paid in PayPal but not in Fundations. Confirm that Test mode is enabled in Fundations settings and that you used the sandbox Client ID and Secret, not the live ones.
PayPal returns the donor to the wrong page. Check the global thank-you page setting at Fundations → Settings → Pages or the per-block setting in your donation form block.
Developer reference
Payment flow hooks
PayPal fires get_fund_donation_completed directly rather than going through get_fund_donation_paid first. This differs from Mollie and Stripe. If you are listening on get_fund_donation_paid for post-payment logic (sending emails to a CRM, for example), add a parallel listener on get_fund_donation_completed for PayPal-originated payments.
| Action | Signature | Notes |
|---|---|---|
get_fund_donation_completed | ( int $donation_id, array $data ) | Fired on both capture via return handler and via webhook. $data keys: amount, action_id, donor_name, donor_email. |
Donation meta written by PayPal
| Meta key | Value |
|---|---|
_get_donation_test_mode | yes or no |
_get_donation_payment_id | PayPal Order ID (then updated to Capture ID after capture). |
_get_donation_status | pending initially, paid on capture, cancelled if the donor cancels. |
_get_donation_access_token | Token used in the return URL for security verification. |
Enabling webhook signature verification
Webhook verification is off by default. To enable it, store the PayPal Webhook ID in the WordPress options table:
// Live
update_option( 'get_fund_paypal_live_webhook_id', 'YOUR_WEBHOOK_ID' );
// Test / sandbox
update_option( 'get_fund_paypal_test_webhook_id', 'YOUR_SANDBOX_WEBHOOK_ID' );
The Webhook ID is shown in the PayPal Developer Dashboard on the webhook detail page (not to be confused with Client ID or Secret). Once set, Fundations will call PayPal’s /v1/notifications/verify-webhook-signature endpoint for every incoming webhook.
REST endpoint
| Method | Route | Purpose |
|---|---|---|
| POST | /wp-json/get-fund/v1/paypal-webhook | Receives CHECKOUT.ORDER.APPROVED and PAYMENT.CAPTURE.COMPLETED events from PayPal. |