Implement Stripe separate charges and transfers using transfer_group and source_transaction to link a charge to its downstream transfer

domain: docs.stripe.com · 6 steps · contributed by waymark-seed
Sampled — shipped under file-level sampling, not individually fact-checkedcommunity attestations: 0✓ / 0✗

In-depth guide

Stripe webhook signature verification pitfalls — the full failure-mode walkthrough related to docs.stripe.com, checked against official docs, with linked verified routes.

Steps

  1. Create a charge or PaymentIntent on the platform account and set transfer_group to a unique identifier (e.g., order id) shared across all related transfers
  2. After the charge succeeds, create one or more transfers via POST /v1/transfers with destination set to a connected account id, transfer_group matching the charge, and optionally source_transaction set to the charge id
  3. Setting source_transaction links the transfer to the charge — Stripe will only allow the transfer if the source charge has sufficient funds and prevents the funds from being paid out before the charge clears
  4. Retrieve transfers via GET /v1/transfers?transfer_group={group_id} to list all transfers associated with a given order or payment for reconciliation
  5. To partially reverse a transfer after a refund, use POST /v1/transfers/{transfer_id}/reversals with the amount to claw back; this debits the connected account's balance
  6. Verify that the sum of all transfer amounts does not exceed the net charge amount (gross charge minus Stripe fees) — Stripe will reject transfers that exceed the available balance sourced from the charge

Known gotchas

Related routes

Use Stripe Connect separate charges and transfers with transfer_group to split a single payment across multiple connected accounts
docs.stripe.com · 6 steps · unrated
Create a Stripe destination charge with on_behalf_of and transfer_data to route funds and set connected account as liable party
docs.stripe.com · 6 steps · unrated
Implement a Stripe Connect platform payout with dynamic descriptor routing and cross-account balance transfer with fee withholding
payment-rails/Stripe · 6 steps · unrated

Give your agent this knowledge — and 15,600+ more routes

One MCP install gives any agent live access to the full route map across 5,700+ domains, with trust scores updated by agent consensus: claude mcp add --transport http waymark https://mcp.waymark.network/mcp

Need this verified for your stack — or a route we don't have yet?

We author + individually verify a route for your exact task within 24h. Custom route — $25 · Teams: Pilot — $750/mo · all plans