- Payment Provider Account (PPA) — the fusionCore record (
FCORE_PAY__Payment_Provider_Account__c) that stores the connection to one Stripe account. This is where keys, the external id, and the signing secret live. - Webhook — a URL Stripe calls to push events (payment succeeded, refunded, customer created) back into your org. Stripe sends these to
/services/apexrest/FCORE_PSTRIPE/Stripe. - Validation — running the Validate action on a PPA to confirm the keys, signing secret, and webhook all work end to end.
The Payment Modal Does Not Load
If the Stripe card-entry window never appears when a member tries to pay, check the following.1
Check the External Id
Confirm the Payment Provider Account has the correct
FCORE_PAY__External_Id__c. For a connected account this is the Stripe connected-account id.2
Check the Payment Type component
Confirm each
FCORE_PAY__Payment_Type__c record has the correct value in its Payment Component field.3
Check the Stripe keys
Confirm the Stripe public key and secret key are set correctly in the Payment Provider Secret custom metadata records.
4
Check user permissions
Confirm the current user is assigned the right Stripe permission set. Staff who process payments need
FC_Stripe_Access; portal users need FC_Stripe_Portal.5
Check that the account is validated
Confirm the Payment Provider Account has been validated and its
FCORE_PAY__Validation_Status__c reads Succeeded.If validation fails with an error about the secret or public key in a production org, set FCORE_PAY__Force_Test_Mode__c (Force Test Mode) to true. In test mode the org serves the sandbox keys and accepts test webhooks even in production.6
Check the connected account
Confirm the webhook is set up on the correct connected account in Stripe, not on the platform fusionCore/fusionSpan account. If the webhook lives on the platform account, the card and ACH modal hangs on loading.
The Modal Loads but the Payment Hangs
If the member can enter card details, but clicking Process Payment hangs and no Payment Provider Event is created, the problem is almost always the webhook or the integration user.1
Check the integration user permissions
Confirm the Stripe integration user is assigned the
FC_Stripe_Integration_User permission set. Stripe calls the org back as this user; without access the callback is silently dropped.2
Check the Request Signature Secret
Confirm
FCORE_PAY__Request_Signature_Secret__c on the Payment Provider Account exactly matches the signing secret shown for the webhook in Stripe. A mismatched secret makes the org reject the webhook.3
Recreate the payment customer
Try deleting the Payment Provider Customer record and letting it be recreated on the next payment attempt.
4
Check the webhook URL
In Stripe, confirm the webhook endpoint URL matches your org’s URL and ends with
/services/apexrest/FCORE_PSTRIPE/Stripe.The Stripe webhook view also lists every call Stripe has made. Find your payment (the payment_intent) in that list and open it to see why Stripe marked it failed.A 500 response means either an error on the fusionCore side or a webhook signature that was not set correctly, so access was denied (see the Request Signature Secret step above).5
Check the subscribed events
If you see
200 responses in the Stripe API logs but payments still do not complete, confirm the webhook subscribes to the correct event types. See the full list in Connected Account Webhook Set Up.Limitations and Common Pitfalls
These behaviors come from how the Stripe addon works in code. Knowing them up front saves time during setup.-
Validation is asynchronous. Clicking Validate does not set
Succeededon its own. It creates a Stripe test customer and then waits for the inboundcustomer.createdorcustomer.updatedwebhook to flipFCORE_PAY__Validation_Status__ctoSucceeded. If the webhook is misconfigured, validation never completes even when your keys are correct. The customer event is also ignored unless it arrives within about 10 seconds of clicking Validate, so re-run validation if it has been longer. -
Editing key fields resets validation. Changing
FCORE_PAY__External_Id__c,FCORE_PAY__Request_Signature_Secret__c, orStripe_MDT_Prefix__con the Payment Provider Account clearsFCORE_PAY__Validation_Status__cautomatically. You must re-run Validate after any such edit. -
External Id must be unique. Two Payment Provider Account records cannot share the same
FCORE_PAY__External_Id__c; the org throws “Multiple Payment Provider Accounts were found with the same External Id.” A missing or unknown External Id throws “Payment Provider Secret Not Found.” -
Failed webhooks are easy to miss. When the org rejects an inbound webhook — missing or malformed
Stripe-Signatureheader, a signature that does not match any active PPA’s signing secret, or a request older than 300 seconds — it returns HTTP204, not an error. Stripe sees a success and will not retry. Check the Stripe API logs and the webhook delivery list rather than waiting for a retry. -
Events for other orgs or the wrong mode are dropped silently. A webhook whose metadata org id does not match this org is rejected with
204. A production-versus-sandbox mismatch on Stripe’slivemodeflag causes the event to return early and do nothing. Confirm you are sending from the right Stripe account and mode. - Subscribe only to the handled event types. Sending an unsupported event type causes an error response and noise in the Stripe API log. Use exactly the events listed in Connected Account Webhook Set Up.
-
Alipay and WeChat Pay require Stripe Direct. These payment methods are blocked on a standard connected-account setup. Saving a Payment Type for them errors with “This payment method is not available with current Stripe setup.” They require the
EnableDirectStripeInstancefeature parameter turned on. See Stripe Direct Accounts. -
Pending payments auto-cancel after a timeout. Payments left in
requires_actionare cancelled after a method-specific window: Card after 60 minutes, ACH after 7 days, Alipay and WeChat Pay after 5 minutes. If a member takes too long to complete 3-D Secure or microdeposit verification, the payment is cancelled. - Large wallet charge batches can partially fail. Charging saved payment methods runs inline and stops at the Salesforce callout limit (or about 110 seconds), marking remaining events Failed with “Callout limit exceeded.” Split very large batches.
- Do not flip a live account into test mode, or switch connection models on a live account. Both change how money is routed and which keys are used. Keep a separate test Payment Provider Account instead. See Stripe testing — production and sandbox.
Stripe_API_Log__c records and the Stripe webhook delivery details, then contact the fusionCore team.
