- Stripe is the payment processor that actually charges the card, bank account (ACH), Alipay, or WeChat Pay.
- Salesforce is the platform fusionCore runs inside. A sandbox is a copy of your production org used for testing.
- A Payment Provider Account (PPA) is the fusionCore record (
FCORE_PAY__Payment_Provider_Account__c) that holds the Stripe connection settings. - A webhook is a URL Stripe calls to push events (payment succeeded, refunded, customer created) back into your org.
- Custom Metadata records are configuration rows you edit in Setup; the Stripe API keys live there, not on the PPA.
Quick FAQ
Is the External Id the same in test and live?
Is the External Id the same in test and live?
FCORE_PAY__External_Id__c) is used in both modes. What differs are your API keys (test vs live) and the webhook configuration (test vs live).How many PPAs should I have in production for testing?
How many PPAs should I have in production for testing?
Can I flip my existing live PPA into test mode?
Can I flip my existing live PPA into test mode?
What is the difference between Is Test and Force Test Mode?
What is the difference between Is Test and Force Test Mode?
Is Test labels a PPA as a test configuration. Force Test Mode (FCORE_PAY__Force_Test_Mode__c) enforces test behavior: when it is on, fusionCore serves the sandbox keys and treats Stripe events with livemode=false as valid, even in production. Use both on a dedicated test PPA; keep Force Test Mode off on the live PPA.Stripe Account Models in fusionCore
fusionCore supports two ways of integrating with Stripe. Confirm which one applies before you configure anything.Core PPA Fields for Stripe
Stripe configuration lives on the Payment Provider Account record. These are the fields you set most often.Webhook Endpoint Overview
Stripe webhooks let fusionCore receive event notifications for payments, refunds, customers, and saved payment methods. The fusionCore webhook endpoint path is:Production Configuration and Testing
Prerequisites
Before configuring Stripe in your live org, confirm:- You have administrator access in fusionCore with permission to manage Payment Provider Accounts and payment settings.
- You have administrator access to the production Stripe account or platform (Direct or Connected) to view keys and configure webhooks.
- You know your Stripe account model (Direct vs Connected) and any platform-specific instructions from your implementation team.
- You have a documented test plan listing the payment scenarios, users, and records you will use for testing.
Configure the Payment Provider Account in Production
The core setup (credentials, PPA fields, webhook, validation) is the same for both account models. Direct-only steps are called out in Stripe direct accounts.Open the Payment Provider Account object
Create two PPAs
Set the core fields on each PPA
FCORE_PAY__Payment_Provider_Name__c: set toStripe.FCORE_PAY__Is_Active__c: turn on only when the PPA is ready to be used.FCORE_PAY__External_Id__c: the Stripe (connected or direct) account ID. The same External Id is used for both the live and test PPAs, because both connect to the same Stripe account.FCORE_PAY__Force_Test_Mode__c: leave off on the live PPA; turn on on the test PPA so it uses Stripe test keys.FCORE_PAY__Request_Signature_Secret__c: set after webhook configuration (next step).
Configure the production webhook
FCORE_PAY__Request_Signature_Secret__c on the PPA.Validate the configuration
Succeeded on its own. It writes the Stripe customer, then waits for the inbound customer.created or customer.updated webhook to flip FCORE_PAY__Validation_Status__c to Succeeded. If the webhook is misconfigured, validation never completes even with correct keys. Validation errors appear in FCORE_PAY__Validation_Message__c.Safe Production Testing Before Go-Live
Use a dedicated test PPA in production that is marked test-only (Is Test on, FCORE_PAY__Force_Test_Mode__c on) and never used for real traffic. It should use Stripe test-mode keys and a test-mode webhook, and it shares the same External Id as your live PPA.
Plan and communicate
Confirm safe configuration
FCORE_PAY__Is_Active__c is on only once you are ready to run the tests and have validated successfully.Run test scenarios
Verify webhook processing
Validate After a Production Upgrade
When fusionCore is upgraded in a live org, confirm Stripe still works without impacting real customers.- Confirm the upgrade did not change your Stripe keys, webhook endpoints, or PPA fields. Compare
FCORE_PAY__Force_Test_Mode__c,FCORE_PAY__External_Id__c, andFCORE_PAY__Is_Active__cagainst your pre-upgrade notes. - Review the release notes for Stripe-related changes that need configuration updates.
- Run a small smoke test: one small live or test-mode charge, confirming the payment is created in both fusionCore and Stripe and that webhooks are received and processed.
Sandbox Configuration and Testing
In a Salesforce sandbox, fusionCore automatically uses the sandbox (test) keys and only accepts webhooks withlivemode=false. Your job is to make sure no live keys or production webhooks remain after a refresh.
Post-sandbox-refresh Checklist
A refresh copies Stripe configuration from production, but it must not process real payments. Immediately after each refresh:- Review every Payment Provider Account in the sandbox and identify those that reference Stripe.
- For each Stripe PPA, update:
FCORE_PAY__Is_Active__c: turn off for any PPA referencing live credentials or that should not run in the sandbox.FCORE_PAY__Force_Test_Mode__c: turn on for any sandbox PPA used for testing, so only test-mode behavior is possible.FCORE_PAY__External_Id__c: leave as the same Stripe account ID. Sandbox safety comes from test keys and a test-mode webhook, not from changing the External Id.
- Confirm no integration or scheduled job can auto-charge real payment methods using live keys copied from production. Disable or reconfigure such jobs.
Configure the Sandbox PPA and Webhook
Obtain test-mode credentials
Configure the sandbox PPA
FCORE_PAY__Force_Test_Mode__c on, set FCORE_PAY__External_Id__c to the expected Stripe account ID, and turn FCORE_PAY__Is_Active__c on only after confirming the PPA is test-only.Configure the sandbox webhook
FCORE_PAY__Request_Signature_Secret__c on the sandbox PPA. Never reuse the production endpoint or signing secret in sandbox.Validate the sandbox configuration
FCORE_PAY__Validation_Message__c until validation succeeds. As in production, Validate focuses on connectivity and credential checks and does not run real charges.Ensure No Real Payments in Sandbox
- Use only Stripe test-mode keys in sandbox.
- Turn on
FCORE_PAY__Force_Test_Mode__cfor every sandbox PPA used for testing. - Mark any PPA that contains copied live keys as inactive immediately after refresh, and replace the keys with test keys.
- Restrict access to sandbox payment pages and flows to internal testers.
- Treat the External Id as a stable account reference. Safety comes from test keys, test-mode webhooks, and the PPA flags, not from changing the External Id.
Run Test Scenarios in Sandbox
- Successful one-time payments using Stripe test cards from the Stripe documentation.
- Failed payments using decline test cards, to validate error handling.
- Refunds triggered from fusionCore and confirmed in Stripe test mode.
- Webhook delivery, by simulating refund or dispute events in Stripe test mode and confirming fusionCore processes them.
Version-specific Considerations
Use this to decide what to re-test when upgrading an org that processes Stripe payments.V1.4.0
No Stripe-related changes.V1.5.0 — Webhook Reliability, Traceability, New Events
- Direct link to Stripe transaction. New field
FCORE_PAY__Transaction_URL__con Payment Provider Event stores a one-click link to the matching Stripe transaction for reconciliation. - Org-aware webhook handling. fusionCore stamps Stripe-side records it creates with the Salesforce Org Id, and webhook processing only handles events for this org. A webhook event not relevant to the current org returns HTTP 204 (instead of an error).
- Skipped-event signal. When fusionCore cannot identify a webhook event as relevant, it fires the
SkippedStripeWebhookEventService Layer event, useful for monitoring and for distinguishing “ignored but expected” from genuine failures. - Separate transactions. Webhook-driven updates are processed in separate transactions under the Automated Process user, isolating webhook failures from user-initiated work.
FCORE_PAY__Transaction_URL__c opens the correct Stripe transaction, and confirm orphaned/missing Payment Provider Events are detected and cancelled during payment validation.
V1.6.0 — Direct Account Support and Saved Payment Methods
- Direct connection. First release to support a direct connection to a Stripe account, alongside the connected-account model.
- Improved saved payment method handling. Better consistency when replacing, expiring, or updating saved payment methods (Wallet Items) backed by Stripe.
- New field.
FCORE_PSTRIPE__Stripe_MDT_Prefix__c(Stripe MDT Prefix, type Text) onFCORE_PAY__Payment_Provider_Account__c, used to tie a PPA to the correct Stripe custom metadata configuration for direct accounts.
Testing Safety Reminders
What not to do:- Do not use live keys in sandbox.
- Do not leave
FCORE_PAY__Force_Test_Mode__con in production when your goal is real payments. - Do not reuse webhook endpoints or signing secrets between sandbox and production.
- Do not run large-volume or load testing in production; use sandbox.
- Do not flip an existing live PPA into test mode. Create a separate test PPA instead.
- Restrict access to Stripe configuration and PPA records to a few trusted administrators.
- Keep a simple log of when keys, webhook endpoints, or PPA flags change, by whom, and why.
- After any major change or upgrade, re-run Validate and one or two key test scenarios before resuming normal operations.
- If you detect unexpected charges, pause testing, clear
FCORE_PAY__Is_Active__con the affected PPA, review Stripe and fusionCore logs, and coordinate with support before re-enabling.
Limitations and Common Pitfalls
- Validation is asynchronous and two-stage. Clicking Validate does not set
Succeededby itself. It writes the Stripe customer and waits for the inboundcustomer.created/customer.updatedwebhook to flipFCORE_PAY__Validation_Status__c. If the webhook is misconfigured, validation never completes even with correct keys. The customer event is also ignored unless its validation timestamp is within about 10 seconds of now. - Editing key fields silently resets validation. Changing
FCORE_PAY__External_Id__c,FCORE_PAY__Request_Signature_Secret__c, orFCORE_PSTRIPE__Stripe_MDT_Prefix__cnullsFCORE_PAY__Validation_Status__c. You must re-run Validate. - External Id must be unique. Two PPAs sharing the same
FCORE_PAY__External_Id__ccause “Multiple Payment Provider Accounts were found with the same External Id.” A missing or unknown External Id causes “Payment Provider Secret Not Found.” - Webhook signature and age guards return a silent 204. Inbound requests are rejected if the
Stripe-Signatureheader is missing or malformed, the signature does not match any PPA’s signing secret, or the request is older than 300 seconds. On rejection the endpoint returns 204 and firesSkippedStripeWebhookEvent. Stripe sees a 2xx and will not retry, so a misconfigured secret can silently drop events. - Org-id and livemode gating drop events silently. A webhook whose Stripe metadata org id differs from this org returns 204. A production-vs-sandbox
livemodemismatch (withForce_Test_Modeoff) causes the event to return early and do nothing. - Subscribe only to the listed event types. An event type outside the handled set produces an error response and noise in the
FCORE_PSTRIPE__Stripe_API_Log__clog. Subscribe only to the events in Webhook endpoint overview. - Alipay and WeChat Pay require Direct accounts. These methods are Direct-only. On a connected-account setup, saving a payment type for them is blocked with “This payment method is not available with current Stripe setup.”
- Charge timeouts auto-cancel pending payments. Payments stuck at
requires_actionare auto-cancelled past per-method cutoffs: Card after 60 minutes, ACH after 7 days, Alipay and WeChat Pay after 5 minutes. Long member delays in completing 3-D Secure or microdeposit verification will be cancelled. - Large saved-wallet batches can partially fail. Charging saved payment methods runs in-line and bails at the callout or time limit, marking remaining events Failed with “Callout limit exceeded.” Keep batches modest.
- Do not toggle the Direct feature on a live account. Switching the Direct-account feature changes routing, fees, and which secret records are used. Re-key before enabling it on an account already in use.
Common Questions
Is External Id different between test and live?
Is External Id different between test and live?
How many PPAs should I have in production?
How many PPAs should I have in production?
Is sandbox safe after a refresh from production?
Is sandbox safe after a refresh from production?
How should I validate configuration before go-live?
How should I validate configuration before go-live?
When should I use Direct vs Connected?
When should I use Direct vs Connected?

