DOCS

Stripe

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:

  1. Fundations Pro creates a Stripe Checkout Session via the Stripe API.
  2. The donor is redirected to Stripe’s hosted checkout page.
  3. The donor enters card details and completes payment.
  4. Stripe sends a webhook to your site confirming the outcome.
  5. On a successful webhook, Fundations marks the donation as paid, updates the fundraiser total, and sends the confirmation email.
  6. 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

  1. In the Stripe Dashboard, go to Developers → API Keys.
  2. Copy the Publishable key (pk_live_...) and the Secret key (sk_live_...).
  3. For testing, also copy the test keys (pk_test_... and sk_test_...).
Stripe api keys

Step 3: Configure in WordPress

  1. In your WordPress admin, go to Fundations → Settings → Stripe.
  2. Paste the Live Publishable key, Live Secret key, Test Publishable key, and Test Secret key.
  3. Set mode to Test while you verify the setup.
  4. Click Save Changes.
Fundations stripe settings

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:

  1. In the Stripe Dashboard, go to Developers → Webhooks → Add endpoint.
  2. Paste the URL above.
  3. Select these events: checkout.session.completed, checkout.session.expired, payment_intent.payment_failed.
  4. 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

  1. Confirm mode is Test in Fundations settings.
  2. Make a donation and complete it at the Stripe test checkout using one of the test cards below.
  3. Verify the donation appears as paid in Fundations → Donations.
  4. Switch to Live mode when ready.

Test cards

Card numberResult
4242 4242 4242 4242Successful payment
4000 0000 0000 0002Card declined
4000 0025 0000 31553D 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

OptionDescription
Enable StripeTurns Stripe on or off on the donation form.
ModeSwitch between Test and Live.
Live Publishable keyFrom Stripe Dashboard → Developers → API Keys. Starts with pk_live_.
Live Secret keyStarts with sk_live_. Keep this private.
Test Publishable keyStarts with pk_test_.
Test Secret keyStarts with sk_test_.
MethodsCheckboxes selecting which methods to display in the Fundations form UI. Does not change what Stripe Checkout offers.
Methods orderDrag-and-drop order for the form display.
Logo per methodCustom 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

ActionSignatureWhen 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 eventFundations action
checkout.session.completed (payment_status=paid)Marks donation paid, fires get_fund_donation_paid and get_fund_donation_completed.
checkout.session.expiredMarks donation cancelled.
payment_intent.payment_failedMarks 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 keyValue
_get_donation_test_modeyes or no
_get_donation_payment_idStripe Checkout Session ID
_get_donation_statuspending initially, then paid, cancelled, or failed

REST endpoint

MethodRoutePurpose
POST/wp-json/get-fund/v1/stripe-webhookReceives checkout and payment events from Stripe.