# Postfund your integration with Stripe Learn how to postfund Stripe for card spend. As a Connect platform or Direct user, you can now accrue a negative Issuing balance on card spend and *postfund* (Post-funding is the ability to use Stripe Credit to fund Issuing card spend after it's accrued, rather than by pre-funding) Stripe at a later time. This means you can fund your Issuing balance *after* card authorizations are captured by the network (usually 1 day after the authorization is created), instead of prefunding your Issuing balance before any card spend occurs. Each day, Stripe notifies you of how much is owed and you can send a same-day wire to fund Stripe before the deadline. You need to fund Stripe by the deadline (usually 20:00 UTC) to avoid late fees and additional penalties. ## Connect If you’re postfunding a Connect Platform, your Connected Account behavior is the same as described in: - [Set up connected accounts](https://docs.stripe.com/issuing/credit/connect-credit-setup.md) - [Manage credit terms](https://docs.stripe.com/issuing/credit/manage-credit-terms.md) - [Manage account obligations](https://docs.stripe.com/issuing/credit/manage-account-obligations.md) The relationship between your platform and your Connected Accounts doesn’t change. The primary difference is that instead of needing to prefund the aggregate spend of your Connected Accounts, you can postfund spend. ## Before you begin - Establishment of a [reserve](https://docs.stripe.com/issuing/funding/post-fund.md#reserve) (accessed only in the event of operational failure) - The ability to send wires from your bank ## Card Program CreditPolicy Stripe configures a `CreditPolicy` for your card program, which contains key information about your payment obligations and terms. Your card program `CreditPolicy` is different from the [`CreditPolicy` you set on your connected accounts](https://docs.stripe.com/issuing/credit/connect-credit-setup.md#activate-creditpolicy). Your card program `CreditPolicy` is set and controlled by Stripe and defines the following key fields: - `credit_limit_amount`: The maximum aggregate amount that can be spent across all of your Connected accounts (or account, in the case of a Direct user). Stripe determines this setting and you must contact Stripe to request an update. This is also known as your *exposure limit* (The exposure limit is the maximum aggregate amount that can be spent beyond pre-funded balances). - `required_reserve_amount`: The minimum amount you’re required to hold in your reserve at Stripe. - `credit_period_interval` and `credit_period_interval_count`: Both fields describe the length of time that card spend can accrue before it becomes due. For your card program, the credit interval is 1 day, meaning you’ll owe Stripe daily. You can retrieve the details of your card program `CreditPolicy` by calling the `GET CreditPolicy` API endpoint. ```curl GET /v1/issuing/credit_policy ``` ### Example response ```json { "livemode": true, "credit_limit_amount": 10000, // minor units "credit_limit_currency": "usd", "required_reserve_amount": 9000, // minor units "reserve_currency": "usd", "status": "active", "credit_period_interval": "day", "credit_period_interval_count": 1 // other fields for upcoming/last effective attributes } ``` ## Card Program FundingObligation While your `CreditPolicy` defines the overall parameters of your postfunding program, your `FundingObligation` represents your current obligation to Stripe for card spend across all of your connected accounts (or account, in the case of a Direct user). Every morning, Stripe sends an `issuing_funding_obligation.updated` webhook event containing the `FundingObligation` that you owe Stripe. For any given `FundingObligation`, the `amount_outstanding` value represents the amount you owe that day. ```json { "id": "icfo_123", "amount_total": 95000000, // minor units"amount_outstanding": 95000000, // minor units "amount_paid": 0, "currency": "usd", "status": "unpaid", "due_at": "timestamp_on_t1", "paid_at": "nil", "owed_to": "stripe", "finalized_at": "timestamp_on_t2", "grace_period_ends_at": "timestamp_on_t3", …, } ``` ## Late payments Every `FundingObligation` contains a `due_at` field that represents when the `FundingObligation` becomes due. ```json { "id": "icfo_123", "amount_total": 95000000, // minor units "amount_outstanding": 95000000, // minor units "amount_paid": 0, "currency": "usd", "status": "unpaid","due_at": "timestamp_on_t1", "paid_at": "nil", "owed_to": "stripe", "finalized_at": "timestamp_on_t2", "grace_period_ends_at": "timestamp_on_t3", …, } ``` Failing to pay your `FundingObligation` when it’s due: - Changes the `FundingObligation` `status` to `past_due`, triggering an `issuing_funding_obligation.updated` webhook event - Incurs a late payment fee as stated in your contract with Stripe Multiple late payments over time can lead to additional penalties on your platform (for example a decrease in your card program exposure limit). ## Identify how much you owe Stripe Stripe posts a `FundingObligation` for your card program every day, including on weekends and holidays. The best way to make sure your account stays current and avoids late fees and penalties is to calculate your total amount owed each day based on the `amount_outstanding` value for all `unpaid` and `past_due` `FundingObligation`s using a formula: | | | | | `total_amount_outstanding` = sum(unpaid FundingObligations)1 + sum(past_due FundingObligations)2 | 1*sum(unpaid FundingObligations)* is the total of all `FundingObligations` with `status=unpaid`. 2*sum(past\_due FundingObligations)* is the total of all `FundingObligations` with `status=past_due`. ### Weekend and holiday balances due on next business day While a `FundingObligation` created on a weekday is due that same day, a `FundingObligation` created on a weekend or holiday is due on the next business day. This means, for a typical weekend, you’ll have three `FundingObligations` due on Monday, so it’s important to correctly aggregate your total amount owed to Stripe. ## Pay off your FundingObligation To fund Stripe daily based on the `due_at` timestamp for the total amount you owe, use any of the following methods: - **Same-day wires**: You can initiate a same-day wire from your bank to your Stripe Issuing balance to pay off a `FundingObligation`. Use the [FundingInstructions API](https://docs.stripe.com/api/issuing/funding_instructions.md) to retrieve the account and routing number for your Issuing balance, and use that as the destination for the wire. - **Balance Transfers**: Within the US, you can move money instantly from your Stripe payments balance to your Issuing balance and use it to pay off your `FundingObligation` through the Dashboard or the API (reach out to Stripe to be gated into the API). - **Existing pre-funded Issuing balance**: Stripe applies any pre-funded or over-funded amounts from the previous day to your next `FundingObligation`. After Stripe receives the full amount owed on the `FundingObligation`, we update its status and amounts and trigger an `issuing_funding_obligation.updated` webhook event. ```json { "id": "icfo_123", "amount_total": 95000000, // minor units"amount_outstanding": 0, "amount_paid": 95000000, // minor units "currency": "usd","status": "paid", "due_at": "timestamp_on_t1", "paid_at": "timestamp_of_payment", "owed_to": "stripe", "grace_period_ends_at": "timestamp_on_t2" …, } ``` If you only pay a portion of the total amount due, Stripe updates the amounts, but the status remains `unpaid`, which is reflected in the `issuing_funding_obligation.updated` webhook event. ```json { "id": "icfo_123", "amount_total": 95000000, // minor units"amount_outstanding": 3000000, // minor units "amount_paid": 92000000, // minor units "currency": "usd","status": "unpaid", "due_at": "timestamp_on_t1", "paid_at": "timestamp_of_payment", "owed_to": "stripe", "grace_period_ends_at": "timestamp_on_t2" …, } ``` If the balance remains unpaid past the `due_at` deadline, the `status` becomes `past_due`, which triggers another `issuing_funding_obligation.updated` webhook event. ## Get transactions for a FundingObligation Retrieve the list of transactions that contribute to a `FundingObligation` by passing one of the following parameters in the List all transactions API request: - The [funding_obligation_for_account](https://docs.stripe.com/api/issuing/transactions/list.md#list_issuing_transactions-funding_obligation_for_account) parameter for Direct users - The [funding_obligation_for_platform](https://docs.stripe.com/api/issuing/transactions/list.md#list_issuing_transactions-funding_obligation_for_platform) parameter for Platform users ### Direct ```curl curl -G https://api.stripe.com/v1/issuing/transactions \ -u "<>:" \ -H "Stripe-Version: 2026-03-25.preview; issuing_credit_beta=v1" \ -d funding_obligation_for_account=ifo_123 ``` #### Example response ```json { "object": "list", "url": "/v1/issuing/transactions", "has_more": false, "data": [ { "id": "ipi_123", "object": "issuing.transaction", // various other fields "funding_obligation_for_platform": null, "funding_obligation_for_account": "ifo_123", // various other fields }, { "id": "ipi_123", "object": "issuing.transaction", // various other fields "funding_obligation_for_platform": null, "funding_obligation_for_account": "ifo_123", // various other fields }, {...} ] } ``` ### Platform Connect platforms need to specify the `Stripe-Account` header with a connected account ID. Use [funding_obligation_for_platform](https://docs.stripe.com/api/issuing/transactions/list.md#list_issuing_transactions-funding_obligation_for_platform) to query by the platform `FundingObligation` or [funding_obligation_for_account](https://docs.stripe.com/api/issuing/transactions/list.md#list_issuing_transactions-funding_obligation_for_account) if you know a connected account’s `FundingObligation`. ```curl curl -G https://api.stripe.com/v1/issuing/transactions \ -u "<>:" \ -H "Stripe-Version: 2026-03-25.preview; issuing_credit_beta=v1" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \ -d funding_obligation_for_platform=ifo_123 ``` #### Example response ```json { "object": "list", "url": "/v1/issuing/transactions", "has_more": false, "data": [ { "id": "ipi_123", "object": "issuing.transaction", // various other fields "funding_obligation_for_platform": "ifo_123", "funding_obligation_for_account": "ifo_456", // various other fields }, { "id": "ipi_123", "object": "issuing.transaction", // various other fields "funding_obligation_for_platform": "ifo_123", "funding_obligation_for_account": "ifo_789", // various other fields }, {...} ] } ``` ## Manage your reserve You must post a reserve (called “Collateral” in your program agreement) at Stripe before you’re allowed to postfund card spend. Stripe holds the reserve in an account that is both owned and controlled by Stripe. Stripe holds the reserve as security against funds owed and draws from the reserve to pay off any `past_due` `FundingObligations`. You might be charged a late fee if Stripe draws from the reserve. Additionally, dipping into the reserve might cause Stripe to reduce your platform `credit_limit_amount` or increase your reserve requirement. To avoid this, fund your Stripe Issuing balance through wires or balance transfers before the `due_at` timestamp on the `FundingObligation` for your credit integration. ### Get your reserve requirements You can identify the `required_reserve_amount` in your `CreditPolicy`. You must push this amount to your reserve before you can start postfunding. ```curl GET /v1/issuing/credit_policy ``` ### Example response ```json { "livemode": true, "credit_limit_amount": 10000, // minor units "credit_limit_currency": "usd","required_reserve_amount": 9000, // minor units "reserve_currency": "usd", "status": "active", "credit_period_interval": "day", "credit_period_interval_count": 1 // other fields for upcoming/last effective attributes } ``` ### Add funds to your reserve balance Stripe supports pushing funds into the reserve balance. You can find the account details for your reserve in the `FundingInstruction`, which contains bank account and routing information for you to originate a funds transfer to. > This is a different set of instructions than what Stripe uses to fund your Issuing balance. The `destination_balance` for your reserve funding instructions are set as `issuing_credit_reserved`. ```curl curl https://api.stripe.com/v1/issuing/funding_instructions \ -u "<>:" \ -d currency=usd \ -d funding_type=bank_transfer \ -d "bank_transfer[type]=us_bank_transfer" \ -d destination_balance=issuing_credit_reserved ``` #### Example response ```json { "id": "fi_XYZ", "object": "funding_instruction", "livemode": "true", "currency": "usd", "bank_transfer": { "type": "us_bank_account", "country": "US", "financial_addresses": [{ "supported_networks": ["ach", "domestic_wire_us"], "type": "aba","aba": { "account_number": "546475644", "bank_name": "Wells Fargo", "routing_number": "123456" }, }] }, "destination_balance": "issuing_credit_reserved", "funding_type": "bank_transfer" } ``` Funds pushed (through a wire or ACH credit) to the bank account retrieved from the `FundingInstructions` land in your reserve balance. When the funds land, you’ll receive a `topup.succeeded` webhook notification. ```json { "id": "tu_XYZ", "object": "topup", "amount": 9000, "balance_transaction": "txn_123", "destination_balance": "issuing_credit_reserved", "created": 123456789, ... } ``` ### Check your reserve balance You can use the [/v1/balance API](https://docs.stripe.com/api/balance.md) to check your reserve balance at any time: ```curl curl https://api.stripe.com/v1/balance \ -u "<>:" ``` #### Example response ```json { "object": "balance", "available": [ ... ], "connect_reserved": [ ... ], "issuing": { ... },"issuing_credit_reserved": [ { "amount": 9000, "currency": "usd" } ], "livemode": true, "pending": [ ... ] } ``` ### Reserve withdrawal by Stripe If you have a `past_due` `FundingObligation`, Stripe first draws from your reserve to pay off the `FundingObligation`. We use the `issuing_funding_obligation.updated` webhook to notify you, and the `FundingObligation` object is updated to show the amount paid off by your reserve. If your reserve is unable to pay off the full `amount_outstanding` on the `FundingObligation`, the `FundingObligation` remains `past_due` — see [Past Due Funding Obligations](https://docs.stripe.com/issuing/funding/post-fund.md#past-due-funding-obligations) for more details and implications. The following shows a `FundingObligation` that’s fully paid by the reserve: ```json { "id": "icfo_123", "amount_total": 95000000, // minor units"amount_outstanding": 0, "amount_paid": 95000000, // minor units "amount_paid_from_reserve": 95000000, // minor units "currency": "usd", "status": "paid", "due_at": "timestamp_on_t1", "paid_at": "timestamp_of_payment_with_reserve", "owed_to": "stripe", "grace_period_ends_at": "timestamp_on_t2" … } ``` You’ll also see a `BalanceTransfer` object (and associated `BalanceTransactions`) representing the automated transfer of funds from your reserve balance to your Issuing balance. ```curl curl https://api.stripe.com/v1/balance_transfers/btr_1MinsBCq7itcH1tbDkk4sY8w \ -u "<>:" ``` #### Example response ```json { "id": "btr_1MinsBCq7itcH1tbDkk4sY8w", "object": "balance_transfer", "amount": 10000, "currency": "usd", "destination_balance": { "issuing": { "balance_transaction": "txn_123_inbound" }, "type": "issuing" }, ... "source_balance": { "issuing_credit_reserved": { "balance_transaction": "txn_123_outbound" }, "type": "issuing_credit_reserved" } } ``` ```curl curl https://api.stripe.com/v1/balance_transactions \ -u "<>:" ``` #### Example response ```json { "id": "txn_123_outbound", "object": "balance_transaction", "amount": 100, "currency": "usd", ... "type": "balance_transfer_outbound", "balance_type": "issuing_credit_reserved", "reporting_category": "issuing_credit_reserved_funds" } { "id": "txn_123_inbound", "object": "balance_transaction", "amount": 100, "currency": "usd", ... "type": "balance_transfer_inbound", "balance_type": "issuing", "reporting_category": "issuing_credit_reserved_funds" } ``` ### Replenish your reserve If Stripe draws from your reserve to pay off a `FundingObligation`, you must replenish the funds in your reserve to the minimum `reserve_amount` on your `CreditPolicy`. Stripe generates a `FundingObligation` for the reserve that notifies you of the amount and time by which you must replenish the reserve. You’ll also receive an `issuing_funding_obligation.created` webhook. To replenish your reserve, you must push funds using the same reserve balance `FundingInstruction` used previously. You must replenish your reserve by the `due_at` timestamp on the `FundingObligation`. ```json { "id" : "fo_456", "object": "issuing.funding_obligation", "amount_outstanding": 10000, "amount_paid": 0, "amount_total": 10000, "currency": "usd", "status": "pending", "due_at": "timestamp_t1", "grace_period": "timestamp_t2", "balance_type": "issuing_credit_reserved" ... } ``` ### Listening for updated reserve requirements Your required reserve amount might change as your program scales, which results in an update to the `required_reserve_amount` field in your `CreditPolicy`. If your reserve requirement increases due to growth in your program, your exposure limit also scales appropriately. Listen for the `issuing_credit_policy.updated` webhook for notification of any changes. #### Reserve requirement increases When your reserve requirement increases (as denoted in your `CreditPolicy`), the process is similar to when your reserve requires replenishing. You receive a `FundingObligation` for the reserve, which must be paid by the time denoted in the `FundingObligation`. ```json { "id" : "fo_321", "object": "issuing.funding_obligation", "amount_outstanding": 2000, "amount_paid": 0, "amount_total": 0, "currency": "usd", "status": "pending", "due_at": "timestamp_t1", "grace_period": "timestamp_t2", "balance_type": "issuing_credit_reserved" ... } ``` #### Reserve requirement decreases When your reserve requirement decreases (as denoted in your `CreditPolicy`), we transfer the excess funds into your Issuing balance so you can decide whether you want to apply it forward to your spend or pay out to the bank account linked to your Issuing integration. #### Overdue reserve obligations If your reserve funding obligation becomes `past_due` (past the `due_at` time), we begin to decline transaction authorizations. If there’s an issue with your reserve payment, contact your account executive for escalation. ## Card program available spend Stripe doesn’t currently provide a field or balance that shows the amount your card program has available to spend. You can compute this number with the following formula: | | | | | available credit = `credit_limit_amount` + issuing balance (issuing balance may be negative due to additional spend allowed by the exposure limit) | ## Authorization declines when postfunding When postfunding, authorizations could be declined due to: - `past_due` `FundingObligations` - Failure to replenish your reserve ### Declines due to past_due FundingObligations Stripe declines authorizations when a `FundingObligation` is `past_due` beyond the grace period defined in the `grace_period_ends_at` timestamp of the `FundingObligation`. Refer to the following example to find the `grace_period_ends_at`: ```json { "id": "icfo_123", "amount_total": 95000000, // minor units "amount_outstanding": 95000000, // minor units "amount_paid": 0, "currency": "usd", "status": "past_due", "due_at": "timestamp_on_t1", "paid_at": null, "owed_to": "stripe","grace_period_ends_at": "timestamp_on_t2", ... } ``` If the grace period has passed, Issuing authorizations are declined and issuing_authorization.created events are sent with the following: ```json { "id": "iauth_123", "object": "issuing_authorization", "approved": false, ..., "status": "closed", "request_history": [ { "amount": 100, // minor units "approved": false, "reason": "past_due_funding_obligation_to_stripe", ..., } ] } ``` ### Failure to replenish your reserve Whenever Stripe draws from your reserve to pay off a `FundingObligation`, you have a grace period (usually 24 hours) to replenish it back to the full `required_reserve_amount` in your `CreditPolicy`. If you continue to spend without replenishing your reserve by the end of your grace period, Stripe declines Issuing authorizations and you receive the following `issuing_authorization.created` event: ```json { "id": "iauth_123", "object": "issuing_authorization", "approved": false, // other fields... "status": "closed", "request_history": [ { "amount": 100, // minor units "approved": false, ..., "reason": "insufficient_reserve_balance", } ] } ``` ## Enable purchase limit notifications for your platform You can use your [settings](https://dashboard.stripe.com/settings/issuing/balance-notifications) to enable email notifications to help monitor your platform purchase limit, which is the limit on the total spend across your platform. Your platform purchase limit is represented by the [credit_limit_amount](https://docs.stripe.com/api/issuing/credit_policy/object.md#issuing_credit_policy_object-credit_limit_amount) attribute in your [Platform CreditPolicy](https://docs.stripe.com/api/issuing/credit_policy.md) object. By default, this email notification is turned on when your integration is enabled for live mode and the threshold is set to 25% of the `credit_limit_amount` attribute in your [Platform CreditPolicy](https://docs.stripe.com/api/issuing/credit_policy.md) object. You receive an alert whenever your available spend falls below your set threshold. To update these notifications in live or testing environments: 1. Visit your [email notifications settings](https://dashboard.stripe.com/settings/issuing/balance-notifications). 1. Under **Issuing purchase limit**, choose from two types of alerting options: - **No notifications** Select this option to disable the email notifications for all recipients. - **Issuing purchase limit threshold** Update this value by using the input field. This value is set to 25% by default. The following table calculates the available spend for a platform when `credit_limit_amount` is set to 100 USD and issuing purchase limit alerting threshold set to 25%. (Assume the platform has an issuing balance of -80 USD.) | | | | | Terms | How it’s determined | Example platform | | Available spend alerting threshold | The `credit_limit_amount` times the alerting threshold. | 100 * 0.25 = 25 USD | | Current available spend | The `credit_limit_amount` plus the current issuing balance (issuing balance is negative for credit spend). | 100 - 80 = 20 USD | | Platform is notified through email | When the current available spend is less than the available spend threshold. | The platform is alerted | You can configure recipients of these email alerts in your user profile by selecting **Issuing purchase limit** under [Email preferences](https://dashboard.stripe.com/settings/user).