Skip links

Stripe Integration with Salesforce: 5 Methods

Two teams can ask for a Stripe integration with Salesforce and mean opposite things. One wants every charge, refund, and subscription visible on the Account record so finance stops working from exports. The other wants Salesforce to take the money, through payment links, saved cards, or a subscription that starts when an Opportunity closes. Both are fair requests. They lead to different builds. Most of the broken Stripe integrations we get called in to fix went wrong when the route was chosen, before anybody wrote a line of Apex.

This guide covers the five routes between the two systems, which one fits which situation, how to set up and test Stripe’s own app, the parts of a custom webhook build that teams underestimate, and what the whole thing costs.

What a Stripe to Salesforce Integration Has to Handle

Traffic runs in both directions. Each direction fails in its own way.

Salesforce to Stripe: actions. Salesforce asks Stripe to do something. Create a customer, open a Checkout session, issue an invoice, start or cancel a subscription, refund a charge. These are outbound API callouts. You control when they run. A failure comes back as an error in the same transaction.

Stripe to Salesforce: events. Stripe reports what happened. A payment succeeded, an invoice was paid, a card was disputed, a subscription lapsed, a payout landed. Stripe pushes these as webhook events. This is the direction that causes production incidents. Stripe delivers each event at least once and doesn’t promise the order events arrive in, so the same event can reach your org twice and a later event can arrive before an earlier one. Stripe’s documentation goes further and tells you not to use the event timestamp to work out ordering or to decide whether you’ve already processed something, because distinct events can share a timestamp. Track event IDs instead, and retrieve the object from the API when you need the current state.

One more thing about the data model, because it explains why spreadsheet exports never reconcile. The processing fee, the net amount, and the exchange rate sit on Stripe’s balance transaction rather than on the charge. Any revenue report built from charges alone comes out gross.

What You Need Before You Start

  • An org that can install managed packages. Stripe’s app comes from AppExchange, where the listing requires Platform Cloud. Starter Suite blocks marketplace installs altogether. The edition check comes before anything else you plan around the app.
  • A Stripe account where you can create keys and endpoints. Restricted access keys and webhook endpoints both need Stripe admin rights. We’ve had kickoffs slip a week waiting for those.
  • A decision about the system of record. We recommend leaving Stripe as the source of truth for money, with Salesforce holding the reporting view and the customer relationships. Settle it either way before the build, because teams that leave it open end up editing amounts in two places and trusting neither.
  • A sandbox and a Stripe test-mode account. The first build runs against test keys.
  • An owner for after go-live. API versions move and keys need rotating. Name the admin or developer who picks that up.

Five Ways to Integrate Stripe with Salesforce

Five Ways to Integrate Stripe with Salesforce

Which one fits depends on who owns the build and how standard your billing logic is.

Route What it is Best for Watch out for
Stripe app for Salesforce PlatformStart here Stripe’s own managed package. Stripe Billing objects as custom objects, Flow actions, Apex access, event capture Teams that want Stripe data and Stripe actions inside Salesforce, with a developer or a well-supported admin to build the workflows Stripe ships the parts. Designing the mappings and building the flows are on you
Third-party payment app Chargent, Blackthorn Payments, Breadwinner Payments, Kulturra, Unaric (formerly Asperato) Sales, finance, or service teams that need to collect card and ACH payments without code Annual license per org, and you inherit the vendor’s data model
Salesforce Payments The payment layer inside B2B and B2C Commerce, which is already a native Stripe integration wired through to Order Management Anyone whose payments happen in a Salesforce Commerce store It’s Commerce-scoped. It won’t cover payments that start on an Opportunity or an invoice
Custom build Apex callouts outbound, an Apex REST webhook handler inbound, published through a Salesforce Site or an Experience Cloud site Finance logic that packaged apps fight: VAT by country, FX recalculation, cost-center allocation, installments Signature verification, idempotency, and governor limits are yours to get right
iPaaS / middleware Workato, Zapier, Skyvia. With MuleSoft, teams usually call the Stripe REST API through the HTTP connector and expose it to Salesforce through External Services Low volume, simple record sync, no developer capacity Per-task pricing at volume, plus a third system to monitor

Stripe’s older app for Salesforce CPQ and Salesforce Billing is deprecated and is not listed here. Verify app pricing and edition requirements on the AppExchange listings before quoting.

Rule one route out before you start. Stripe’s older app for Salesforce CPQ and Salesforce Billing is now marked deprecated in Stripe’s docs, and Stripe points anyone integrating with Salesforce CRM, Core, or Platform at the Platform app instead. If a search result or an old blog post sends you to the CPQ and Billing connector, check the date on it.

Which Route We Recommend, by Situation

  • Stripe data on Salesforce records, with developer capacity available. Start with Stripe’s app for Salesforce Platform. It ships the objects and the event plumbing. Your build starts at the mapping.
  • Reps or finance collecting payments themselves, with no developer. Take a third-party payment app. Chargent connects to 30+ gateways including Stripe. Blackthorn Payments integrates with Stripe directly and reaches 120+ gateways through Spreedly. It’s also one of the few options that handles card-present payments on mobile for Field Service. Breadwinner Payments brings Stripe, Square, and Braintree in as native objects with the workflows already built.
  • Billing logic that’s specific to your business. Tax rules per country, exchange rate recalculation, installment tracking, and allocation to cost centers all land here. Packaged apps cover the common cases well and then start to fight you. Budget for a custom layer, or for a custom build.
  • More than one payment provider, or gateway redundancy. Put an orchestration layer between Salesforce and the providers, and let it hold the connections. Unaric and Blackthorn both cover this.
  • A B2B or B2C Commerce store. Use Salesforce Payments and skip the build.
  • Low volume, where the requirement really is just visibility. An iPaaS sync is honest and cheap to start. Revisit it when transaction volume makes per-task pricing hurt.

How to Integrate Stripe with Salesforce Using Stripe’s App

These steps follow Stripe’s current installation and event configuration docs. Stripe publishes separate installation options for test and production, so plan to run the install twice. Before you begin, enable Lightning Web Security under Setup > Session Management > Session Settings.

  1. Install the package from the AppExchange listing. Choose Install for Admins Only so you control access afterward, then check Approve Third-Party Access when the dialog appears.
  2. Assign access. The app ships permission sets for app users and for the integration user. Read Stripe’s configuration doc for the current set names and for any system permissions you have to enable by hand, since both change between versions.
  3. Run the setup wizard. App Launcher > Stripe for Salesforce Platform > Get Started > Authorize, then Allowin the window that opens to grant your org access. [IMAGE: setup wizard, Get Started step.]
  4. Add the Stripe account. Enter your publishable key and a restricted access key. Version 1.17 of the app removed OAuth authentication, leaving API keys as the only route. Orgs still on OAuth reauthorize with keys under Account Management. [IMAGE: Add Account screen with keys.]
  5. Set the cleanup rule. Optionally toggle cleanup for Stripe Events and Sync Logs, then enter how many records to retain. Every captured event is a record in your org, so decide the retention deliberately.
  6. Pick the API version (2025-04-30 in the current wizard) and install the extension package, then finish. The API Extension package is required, since it powers the API actions and objects. The Salesforce Billing and Stripe Billing flows extensions are optional. [IMAGE: API version dropdown.]
  7. Choose your events. In the app, select the Stripe account, open All Webhook Events, pick a Stripe object, toggle the events you want, and save. The app creates the endpoint in Stripe for you. It shows up in the Stripe Dashboard under Developers > Webhooks, or under Workbench on accounts that have it. [IMAGE: event toggles for one Stripe object.]
  8. Build the automation. Captured events land in the Stripe Event custom object (stripeGC__Stripe_Event__c). Create a record-triggered flow on that object with an entry condition on stripeGC__Event_Name__c, for example customer.created, then use the packaged flow actions to write the payload onto your own records. [Internal link: Flow guide, once it’s live.]

We tell every client the same two things at this step. Subscribe only to the events you’ll act on, because each extra event type is another queue to watch. And scope the restricted access key to the resources the integration touches, rather than handing it a key with full account access.

How to Test the Integration Before Go-Live

  • Forward real events to a local handler with the Stripe CLIstripe listen --forward-to <endpoint>, then fire specific events with stripe trigger payment_intent.succeeded. This is faster than clicking through checkouts to reproduce a case.
  • Use Stripe test clocks for anything subscription-shaped. Renewals, trials, and dunning are hard to test honestly without moving time forward.
  • Keep separate endpoints and signing secrets per environment, and confirm that a live-mode event never reaches a sandbox handler.
  • Know that sandbox retries are short. Stripe retries a sandbox delivery three times over a few hours, against up to three days in live mode. A sandbox failure disappears faster than you’d expect, and a passing test can hide a slow handler.
  • Read the Event deliveries tab. Your own logs only show what arrived. Stripe’s view shows what it sent, what came back, and when the next retry is due.
  • Keep one stored payload per event type and replay it into the handler as a regression test after every change.

How to Build a Custom Stripe Integration in Salesforce

When the finance logic is specific enough that packaged apps stop helping, the pattern is a webhook handler for inbound events plus API callouts for whatever the payload doesn’t carry. We took that route for WeLearn, where VAT rules by creator country and exchange rate recalculation went past what an off-the-shelf app covers.

Inbound: the webhook handler

  1. Publish an endpoint Stripe can reach. An Apex class with an @HttpPost method, published through a Salesforce Site or an Experience Cloud site so Stripe can post without a Salesforce login. Guest users get no access to the standard APIs. A custom Apex REST endpoint is the supported way in.
  2. Verify the signature before you trust the body. Recompute the HMAC SHA-256 signature over the raw request body with the endpoint’s signing secret and compare it against the Stripe-Signature header. Verify against the raw bytes. Parsing or reformatting the body first is the classic reason verification fails in production after passing in a sandbox.
  3. Lock the guest user down, then test what you broke. Grant access to that one Apex class and only the object permissions the handler writes to. At site level, turn off access to public APIs, which is what closes the Aura endpoint that recent Experience Cloud attacks used. Salesforce also recommends disabling API Enabled on the guest user profile unless guest users genuinely need API access, and it recommends doing that in a sandbox first to see what stops working. That warning applies directly to this build, because the webhook class may be the thing that needs the permission.
  4. Acknowledge fast, then work asynchronously. Stripe doesn’t publish a timeout in seconds. What the docs ask for is a quick 2xx before any complex logic. A slow handler gets its delivery marked failed and retried, so the same event arrives again while the first copy is still running. Store the raw payload, return 200, and hand the processing to Queueable Apex or a Platform Event.
  5. Make it idempotent on the event ID. Keep the Stripe event ID in a unique field and short-circuit anything you’ve already processed. Without it, a retry can double-count revenue or re-fire a refund.
  6. Look the object up. Arrival order tells you nothing about sequence. When the current state matters, retrieve the customer, invoice, or subscription from the Stripe API, because the payload in front of you may already be stale.
  7. Plan for the days you miss. Stripe retries a failing live endpoint for up to three days with exponential backoff and disables it after sustained failure. Stripe also lets you query for missed events and reconcile over any period, so build that pull as a scheduled job. Otherwise the gap surfaces when finance closes the month.

Outbound: the callouts

Named Credentials and External Credentials hold the keys, not Apex code and not a custom setting that any user with API access can read. Watch the platform ceilings while you design: 100 callouts per transaction, 120 seconds of cumulative callout time, and 6 MB of heap synchronously against 12 MB asynchronously. Bulk reconciliation work belongs in Batch or Queueable Apex, chunked.

Logging

A log object with the event ID, the payload, the status, and the error, plus a list view for the support team. Finance will ask why a transaction is missing, long after the debug log has expired, and the answer has to live in Salesforce.

All of this is ordinary work that’s easy to skip under deadline pressure, and the failures show up later as duplicated revenue, missing refunds, and a finance team quietly rebuilding the numbers in a spreadsheet. If you’d rather hand this to a team that has shipped it before, ENWAY offers a free consultation and we’re happy to review a design you already have.

Case study · Professional Services

Tracking Stripe and PayPal Payments in Salesforce

WeLearn helps video creators build and sell educational courses, and payments arrive through both Stripe and PayPal. Until 2023 the company ran without a CRM, so the financial picture sat outside the systems the team worked in every day. ENWAY built a Financial App on Sales Cloud with both providers integrated into the org, VAT calculated by creator country, exchange rates recalculated, and every transaction allocated to a cost center.

Two providers, one org Stripe and PayPal transactions tracked in Sales Cloud
VAT by creator country Calculated automatically per transaction
Allocation built in Each transaction linked to creator, product, and cost center
Their team helped us integrate Stripe and PayPal with the Salesforce CRM smoothly. Pietro Betti · Global Strategy Lead, WeLearn

What Stripe Data Maps to in Salesforce

What Stripe Data Maps to in Salesforce

Where each Stripe object belongs once the integration is running.

Stripe object Where it belongs in Salesforce Notes
Customer Account or Contact Store the Stripe customer ID on a unique external ID field. It’s the match key for everything else
PaymentIntent / Charge Custom transaction or payment object Mirror Stripe’s status values
Balance transaction Same transaction record Source of the fee, the net amount, and the exchange rate
Invoice Custom invoice object, or Order if you use it Invoice numbering usually stays in Stripe
Subscription Custom subscription object, related to Account and Opportunity Renewal dates here drive forecasting
Refund, Dispute Child records of the transaction Disputes carry deadlines, so give them an owner and a due date
Payout Reconciliation object Ties Salesforce revenue to money that actually reached the bank
Card detailsNever store Nowhere Card numbers and CVVs stay tokenized in Stripe

Security and Compliance Notes

  • Card data stays out of Salesforce. Every option here tokenizes in Stripe. Storing a card number in a Salesforce field pulls your org into PCI scope. That’s a much larger project than the integration.
  • Restricted keys, separate per environment. Give the integration the narrowest key that works, keep test and live keys apart, and rotate on a schedule.
  • Rotate webhook signing secrets too, and update both sides in the same change window.
  • Split the two guest user settings. Site-level access to public APIs and the API Enabled permission on the guest profile are different switches with different effects. Change them one at a time in a sandbox and retest the endpoint after each.
  • Turn on field history for transaction and subscription records. When finance disputes a number, you want the audit trail.

What a Stripe Integration with Salesforce Costs

The cost splits into five lines. In our experience, implementation is the line teams have costed, and storage, licenses, and support come up later.

  1. Stripe processing fees. Unavoidable, unrelated to the integration, and set by your Stripe agreement.
  2. App licenses. Stripe’s Platform app is listed at $1 USD per company as a one-time payment, so the license isn’t the cost. Third-party apps are real money: Blackthorn Payments starts at $7,450 USD per Salesforce org per year on its AppExchange listing, and Chargent and Breadwinner price per org as well.
  3. Salesforce data storage. Captured events, sync logs, and transaction records all consume it. Set a retention rule at build time.
  4. Implementation. This is the variable that matters, and it scales with how clear your finance rules are.
  5. Support. Payment integrations break on the other side of the wire, so name an owner for API version changes, new event types, and key rotations.

ENWAY’s implementation packages start from €5,900. Integration work gets scoped after a technical review.

Mistakes We See Most Often

  1. The org subscribes to every available event, fills up with records that never get read, and loses the ones that matter in the volume.
  2. Revenue reports built on charges alone come out gross where finance expected net.
  3. The handler returns 4xx when a related record isn’t there yet. Stripe treats any non-2xx as a failed delivery, so that response earns retries, and eventually a disabled endpoint. Log it, return 200, and let reconciliation close the gap.
  4. Signature verification runs after the body has been parsed. It passes in the sandbox and fails in production.
  5. The processing happens inline in the handler. When it times out, the retry storm costs more than the delay anyone was trying to avoid.
  6. The guest user profile on the site hosting the endpoint stays wide open.
  7. Nothing pulls the events that were missed. Stripe’s three-day retry window buys time without closing the gap.

FAQ

Does Stripe integrate with Salesforce natively? Stripe publishes its own managed packages on AppExchange. The integration is first-party without being built into Salesforce itself. For Salesforce CRM and Platform, the current one is the Stripe app for Salesforce Platform. Separate connectors cover B2C Commerce and Order Management, and Salesforce Payments for Commerce is itself a native Stripe integration.

Is the Stripe Salesforce connector free? The Platform app is listed at $1 USD per company as a one-time payment, with discounts for nonprofits. Your real spend is the implementation and the Stripe processing fees.

How do I integrate Stripe with Salesforce without a developer? Use a third-party payment app from AppExchange, or an iPaaS sync. Stripe’s own app gives you actions in Flow Builder, so a confident admin can go a long way, though the initial setup and the object mapping usually want a developer, whether in-house or through a dedicated team.

Can Salesforce trigger a Stripe payment? Yes. With Stripe’s app you call Stripe API actions from Flow or Apex, and the package ships preconfigured subscription flows to start from. With a payment app, the payment request is a button or a payment link on the record.

What about Salesforce CPQ and Revenue Cloud? Stripe’s older app for Salesforce CPQ and Salesforce Billing is deprecated. Stripe recommends the Platform app for CRM, Core, and Platform integrations, so quote-to-cash flows get built on that, using the Stripe Billing objects it brings into the org.

How long does a Stripe to Salesforce integration take? Scope drives the schedule, and so does the clarity of the finance rules. A one-way sync of customers, charges, and refunds is a small piece of work. Subscription lifecycle, tax rules by country, and multi-currency reconciliation are a project. [Delivery to confirm the ranges we’re willing to publish here, or leave this answer qualitative.]

How are refunds and disputes handled? As events, the same as payments. Both belong as child records of the original transaction, with a status and an owner. Disputes carry deadlines, so add a task or an alert. A field change on its own gets missed.

Can Agentforce use Stripe data? Yes, once the data and the actions exist in the org. Stripe records synced as custom objects are readable like any other, and Stripe API actions wrapped in an invocable flow or Apex class can be published as agent actions. That’s how an agent answers a billing question or issues a refund under approval. More on how agents are built in What Is Agentforce.

Three Questions to Answer Before You Choose

  1. Which direction carries the value? Visibility in Salesforce and collecting money from Salesforce are different projects with different owners. Most teams need one of them first.
  2. Who runs this after go-live? An admin-owned integration and a developer-owned integration aren’t the same design. An honest answer here rules out at least two routes.
  3. Is your billing logic standard? If tax, currency, or allocation rules are specific to your business, a packaged app gets you started and then stops short.

Related Reading

Get started

Planning a Stripe Integration?

Installing Stripe’s app and scoping a custom webhook build are different projects. We’ll help you pick the route, map the objects, and get payments reconciling in Salesforce, without finding out three sprints in that the route was wrong.

150+ projectsdelivered since 2016
22 certified experts80+ Salesforce certifications