Stripe is a global payment provider available with Fundations Pro. It uses Stripe Checkout Sessions to redirect donors to a Stripe-hosted payment page. A Pro license with an active subscription is required to process payments.
Why use Stripe
Stripe is a good fit for campaigns where donors primarily pay by card and are located outside Europe, or where you need a globally trusted checkout experience. Stripe handles PCI compliance, 3D Secure authentication, and currency conversion automatically.
What it does
When a donor selects Stripe and submits the donation form:
- Fundations Pro creates a Stripe Checkout Session via the Stripe API.
- The donor is redirected to Stripe’s hosted checkout page.
- The donor enters card details and completes payment.
- Stripe sends a webhook to your site confirming the outcome.
- On a successful webhook, Fundations marks the donation as paid, updates the fundraiser total, and sends the confirmation email.
- Stripe also redirects the donor back to your thank-you page.
How to set up Stripe
Step 1: Create a Stripe account
Sign up at stripe.com and complete account activation. Stripe will ask for business information before enabling live payments.
Step 2: Get API keys
- In the Stripe Dashboard, go to Developers → API Keys.
- Copy the Publishable key (
pk_live_...) and the Secret key (sk_live_...). - For testing, also copy the test keys (
pk_test_...andsk_test_...).

Step 3: Configure in WordPress
- In your WordPress admin, go to Fundations → Settings → Stripe.
- Paste the Live Publishable key, Live Secret key, Test Publishable key, and Test Secret key.
- Set mode to Test while you verify the setup.
- Click Save Changes.

Step 4: Set up the webhook
The Stripe webhook URL is:
https://yoursite.com/wp-json/get-fund/v1/stripe-webhook
To register it with Stripe:
- In the Stripe Dashboard, go to Developers → Webhooks → Add endpoint.
- Paste the URL above.
- Select these events:
checkout.session.completed,checkout.session.expired,payment_intent.payment_failed. - Click Add endpoint.
> Webhook signature verification: Stripe provides a signing secret (whsec_...) that Fundations can use to verify that webhook requests genuinely come from Stripe. There is currently no field in the Fundations settings UI to store this secret. To enable signature verification, store the value directly in the WordPress options table (see the developer section below). Without it, Fundations accepts all POST requests to the webhook URL without cryptographic verification.
Step 5: Test your setup
- Confirm mode is Test in Fundations settings.
- Make a donation and complete it at the Stripe test checkout using one of the test cards below.
- Verify the donation appears as paid in Fundations → Donations.
- Switch to Live mode when ready.
Test cards
| Card number | Result |
|---|---|
4242 4242 4242 4242 | Successful payment |
4000 0000 0000 0002 | Card declined |
4000 0025 0000 3155 | 3D Secure required |
Use any future expiry date and any 3-digit CVC.
Payment methods
Stripe Checkout natively supports many payment methods. The donation form settings let you configure a preferred order and custom logos. The actual methods sent to Stripe’s Checkout Session are currently hardcoded:
- Credit and debit card (Visa, Mastercard, Amex)
- iDEAL
- Bancontact
> Known limitation: The method selection in Fundations settings (checkboxes for additional methods like SEPA, Giropay, etc.) affects what Fundations displays on its own form, but does not currently change the methods available in Stripe’s hosted checkout. The Stripe Checkout Session is created with ['card', 'ideal', 'bancontact'] regardless of what is configured in settings. If you need different methods in Stripe Checkout, use the get_fund_create_payment filter to override the session creation (see the developer section).
Settings reference
| Option | Description |
|---|---|
| Enable Stripe | Turns Stripe on or off on the donation form. |
| Mode | Switch between Test and Live. |
| Live Publishable key | From Stripe Dashboard → Developers → API Keys. Starts with pk_live_. |
| Live Secret key | Starts with sk_live_. Keep this private. |
| Test Publishable key | Starts with pk_test_. |
| Test Secret key | Starts with sk_test_. |
| Methods | Checkboxes selecting which methods to display in the Fundations form UI. Does not change what Stripe Checkout offers. |
| Methods order | Drag-and-drop order for the form display. |
| Logo per method | Custom image URL to replace the default icon for each method. |
What you can and cannot do
You can accept card payments (Visa, Mastercard, Amex), iDEAL, and Bancontact through Stripe Checkout. Test mode works with Stripe’s test cards to verify the full payment flow. Stripe can run alongside PayPal at the same time, and 3D Secure is handled automatically (Stripe manages SCA compliance).
You cannot process payments without Fundations Pro and an active license. The payment methods shown in Stripe’s hosted checkout cannot be changed from the WordPress admin, as the list is hardcoded to card, iDEAL, and Bancontact. Webhook signature verification also requires a manual database entry rather than a settings field. Recurring donations are currently disabled in the plugin.
Troubleshooting
Donations stay in “pending” after the donor returns from Stripe. This typically means the webhook did not arrive or was not processed. In the Stripe Dashboard, go to Developers → Webhooks, find the endpoint, and check recent delivery attempts. If they failed, inspect the error and retry. Also confirm your site is publicly reachable.
Donations are paid in Stripe but not marked paid in Fundations. Verify that the webhook endpoint is registered in Stripe with the correct events (checkout.session.completed, checkout.session.expired, payment_intent.payment_failed). An endpoint registered with only payment_intent.succeeded will not work because Fundations listens for checkout.session.completed.
“Invalid credentials” when saving settings. Confirm the keys match the selected mode. Test keys start with pk_test_ and sk_test_; live keys start with pk_live_ and sk_live_.
Donors see only card, iDEAL, and Bancontact at Stripe Checkout even though you enabled other methods. This is a current limitation. The Stripe Checkout Session is created with those three methods hardcoded. Additional methods configured in Fundations settings do not change what Stripe presents.
Developer reference
Payment status actions
| Action | Signature | When fired |
|---|---|---|
get_fund_donation_paid | ( int $donation_id ) | When the Stripe webhook confirms checkout.session.completed with payment_status=paid, and when the return handler confirms payment. |
get_fund_donation_completed | ( int $donation_id, array $data ) | After get_fund_donation_paid. $data keys: amount, action_id, donor_name, donor_email. |
Webhook events handled
| Stripe event | Fundations action |
|---|---|
checkout.session.completed (payment_status=paid) | Marks donation paid, fires get_fund_donation_paid and get_fund_donation_completed. |
checkout.session.expired | Marks donation cancelled. |
payment_intent.payment_failed | Marks donation failed. |
Enabling webhook signature verification
Stripe uses HMAC-SHA256 with the Stripe-Signature header and a 5-minute timestamp tolerance. To enable verification, store the webhook signing secret in the WordPress options table:
// Live
update_option( 'get_fund_stripe_live_webhook_secret', 'whsec_...' );
// Test
update_option( 'get_fund_stripe_test_webhook_secret', 'whsec_...' );
The signing secret is shown in the Stripe Dashboard on the webhook endpoint detail page. Once set, Fundations verifies every incoming webhook request before processing it. Without this option, all POST requests to the webhook URL are accepted without verification.
Overriding the Checkout Session payment methods
To change which methods appear in Stripe’s hosted checkout, hook into get_fund_create_payment and create the session yourself:
add_filter( 'get_fund_create_payment', function( $default, $provider, $donation_id, $amount, $description, $email ) {
if ( $provider !== 'stripe' ) {
return $default;
}
// Build your custom session with the methods you want
$session = my_stripe_create_session( [
'payment_method_types' => [ 'card', 'ideal', 'bancontact', 'sepa_debit' ],
'amount' => $amount,
'email' => $email,
] );
return [
'payment_id' => $session->id,
'payment_url' => $session->url,
];
}, 5, 6 ); // Priority 5 runs before PRO's built-in handler at priority 10
Donation meta written by Stripe
| Meta key | Value |
|---|---|
_get_donation_test_mode | yes or no |
_get_donation_payment_id | Stripe Checkout Session ID |
_get_donation_status | pending initially, then paid, cancelled, or failed |
REST endpoint
| Method | Route | Purpose |
|---|---|---|
| POST | /wp-json/get-fund/v1/stripe-webhook | Receives checkout and payment events from Stripe. |