Recording Stripe Top-Ups in QuickBooks Online
A Stripe top-up moves money from your bank into your Stripe balance. Why it posts to QuickBooks as a Transfer, not an expense, and what to check at close.
Your Stripe balance is running thin. Refund season is coming, a chargeback just landed, or you simply want a cushion so a big refund does not push the account negative. So you wire money from your business checking account into Stripe.
Now open QuickBooks. What should be there?
Most people expect an expense, because money left the bank. That instinct is wrong, and acting on it is how a clean set of books picks up a phantom $10,000 cost. A top-up is not a purchase. It is the same dollars sitting in a different place, and the entry that represents it correctly is a Transfer between two asset accounts.
Here is the part that catches even careful bookkeepers: the QuickBooks record for a top-up looks identical to the record for a negative payout. Same shape, same direction, same two accounts. One of them means you made a deliberate funding decision. The other means Stripe pulled money out of your bank because refunds and disputes exceeded sales. Telling them apart is the actual work.
Syncing Stripe to QuickBooks by hand? Acodei posts payouts, top-ups, fees, and refunds into QuickBooks Online automatically, in the shape your accountant expects. Start a free trial.
What a Stripe top-up actually is
A top-up is Stripe's object for money moving from your bank account into your Stripe balance. It has an ID prefixed tu_, and every one of them shows up on the Top-ups tab under Balance in the Dashboard.
Stripe is direct about why you would want one. From the add funds documentation: "To maintain stability in your business when your account has a negative balance or when you expect an increase in customer refunds or disputes, you can add funds directly to your Stripe balance using a wire or bank transfer."
The mechanics differ by market. In the United States, the United Kingdom, EUR currency markets, and Japan, funds go to a Stripe VBAN using a local bank credit transfer. In Canada, non-EUR European markets, most of APAC, and Brazil and Mexico, wire transfer is the only route and Stripe VBAN is not available at all.
Timing is worth internalising before you plan around it, because "I will just top up" is not an instant operation:
| Region and currency | Method | Stripe's estimated speed |
|---|---|---|
| USA (USD) | Wire transfer | 1-5 days |
| USA (USD) | ACH Credit Transfer | 1-3 days |
| USA (USD) | ACH Debit Transfer | 5 days |
| EU (EUR) | SEPA Credit Transfer | 1-2 days |
| UK (GBP) | FPS | 2 hours to 1 day |
| UK (GBP) | BACS | 2-3 days |
| Other currencies | Wire transfer | 1-7 days |
Stripe also notes that a new account without much top-up history may see slower availability at first, converging on these numbers over time. If you are topping up to cover a dispute deadline, five days is not a rounding error.
The five statuses, and the one that matters
The Top-up object carries a status field with five possible values: canceled, failed, pending, reversed, and succeeded.
Keep pending in mind. It is the state where the money has left your bank and has not yet landed in your Stripe balance, and it can last for days according to the table above.
There is also an initiated_by field, which is either stripe or user. Not every top-up in your list is necessarily one a human on your team created, so the list is a record of funding events rather than a record of your own actions.
What Acodei posts to QuickBooks
Acodei syncs top-ups. On topup.succeeded, a dedicated job records a QuickBooks Transfer from the bank account into your Stripe holding account, and it respects multibank account mapping if you have more than one bank account configured. No manual entry is required on your side.
The design is deliberately symmetrical. For an account on an asset holding account rather than Undeposited Funds, a normal payout is a Transfer from the holding account to your bank. A top-up is that same Transfer running backwards. Acodei's own documentation describes it exactly that way: the mirror of a payout.
That symmetry is why the entry is correct as accounting. Both accounts involved are assets. Your bank balance goes down, your Stripe clearing account goes up, total assets do not move, and the profit and loss statement is untouched. Nothing has been earned and nothing has been spent. You have relocated your own money.
If your instinct was to code the wire as an expense, notice what that would do: it would understate net income by the full amount of the top-up in the month you funded, and then, when Stripe eventually pays those same dollars back out to you, you would have income with no matching cost. Two wrong months instead of one.
topup is also an allowed transaction type inside payout processing, so a top-up appearing among a payout's balance transactions is recognised rather than ignored, and top-up lines are flagged distinctly on Transfers.
The shape problem: top-up versus negative payout
Here is the thing that makes top-ups genuinely tricky rather than merely unfamiliar.
A negative payout happens when refunds and disputes exceed sales for the period, so Stripe pulls money from your bank account instead of sending money to it. Acodei records that as a Transfer from the bank account into the holding account for the absolute amount, in both Undeposited Funds and non-UF modes. It is the identical branch either way.
Compare the two records:
| Top-up | Negative payout | |
|---|---|---|
| QuickBooks record | Transfer | Transfer |
| From | Bank account | Bank account |
| To | Stripe holding account | Stripe holding account |
| Who initiated it | You | Stripe |
| What it means | You chose to pre-fund | Refunds and disputes outran sales |
| Predictable | Yes | No |
Six rows, and only the bottom four differ. The two entries a bookkeeper actually sees in the QuickBooks register, the shape and the accounts, are the same.
This matters because the two events say opposite things about the business. A top-up is a treasury decision, often a sign of good planning. A negative payout is an operating signal: something happened in refunds or disputes that outweighed a period of sales. If you are scanning the Stripe clearing account at month end and treating every inbound Transfer as "funding we did," you will miss the one that was not a decision at all.
How to tell them apart. Match on the amount and the date against Stripe's own Top-ups tab, which lists only top-ups. A Transfer into the holding account with no matching tu_ object is a negative payout, and it deserves an explanation in your close notes rather than a shrug. Round numbers are a decent heuristic, since people top up in figures like $5,000 and Stripe settles negative payouts to the cent, but the heuristic is not the check. The Top-ups tab is.
The in-transit gap nobody warns you about
Acodei's trigger is topup.succeeded. Read that against the settlement table above and a gap appears.
You initiate a $20,000 ACH credit transfer on the 29th. Your bank debits you on the 30th. Stripe marks the top-up succeeded on the 2nd of the following month. Your bank statement for the month shows the money gone. Your Stripe balance for the month shows it never arrived. And QuickBooks, correctly reflecting the events Stripe has confirmed, shows no Transfer at all until the 2nd.
The money is in transit across a period boundary. This is not a sync failure and there is nothing to fix. It is the same in-transit condition as a cheque written on the 31st and cashed on the 3rd, and it is handled the same way: a reconciling item on your bank reconciliation for the month, cleared next month when the Transfer posts.
Stripe removes some of this ambiguity for one funding path. From the platform top-ups documentation: "For bank transfers, the top-up isn't created until the funds are received." So for that route there is no pending object sitting in the Dashboard while you wait. There is nothing, and then there is a completed top-up.
The practical rule: if you are going to fund near a period end, initiate it early enough that Stripe's slowest published estimate for your method still lands inside the period. Otherwise plan the reconciling item deliberately rather than discovering it during close.
The refunds and disputes balance, and why it changes reconciliation
This is the sharpest edge in the whole topic, and it is easy to walk into precisely because it sits behind the most common reason to top up.
When you add funds in the Dashboard, Stripe asks which balance to add them to. One option is your ordinary payments balance. Another is the Future refunds or disputes balance, exposed in the API as refund_and_dispute_prefunding. It is a genuinely separate balance, not a label on the same pot.
Stripe documents three consequences that follow.
Those funds are never paid out automatically. In Stripe's words, they "are never included in an automatic payout, but you can initiate a manual payout at any time." Money placed there stops participating in your normal payout cycle. If you over-fund it, it sits until you deliberately go and get it.
Stripe draws from it only after the payments balance is exhausted. Stripe "first attempts to process refunds and disputes from your available payments balance. If your payments balance is insufficient, Stripe uses these reserved funds. If these reserved funds are also insufficient, then your payments balance might go negative." So pre-funding does not ring-fence refunds away from your operating balance. It adds a second line of defence behind it.
And the reconciliation consequence, which is the one to write down. For businesses on automatic payouts, Stripe states that "balance transactions for refunds and disputes funded from the Future refunds or disputes balance aren't included in payouts reconciliation reports."
Sit with that. The refunds you deliberately pre-funded can be the refunds that do not appear in the report you use to tie payouts back to activity. If your month-end process is built on payout reconciliation and your totals come up short by exactly the value of some refunds, this is a place to look before you go hunting for a sync problem.
One honest limit on this section. Everything above is Stripe's documented behaviour for how the separate balance works. Acodei's documented sync behaviour is specific: it acts on topup.succeeded. Whether funds routed to the separate refunds and disputes balance produce that event, and therefore whether they produce the same QuickBooks Transfer, is not something Acodei's product documentation currently states. If you use that balance, check your Acodei Data Feed for the date you funded and confirm what posted rather than assuming it matches the payments-balance case. We would rather tell you to look than tell you something we cannot source.
In the UK and Japan there is a third option, adding funds straight to the payments balance, which Stripe recommends for most businesses "because it avoids transiting funds through a separate balance." That recommendation exists for exactly the reason this section does.
Reversals
A top-up can be reversed, and reversed is one of the five statuses on the object. Stripe's balance transaction type for it is topup_reversal.
Acodei's documented guidance here is a check rather than a promise: if a topup_reversal occurs, verify that the original Transfer was reversed, and resync the date if it was not. Treat a reversal as a manual verification step in your close, not as something you can assume resolved itself.
The reason it deserves a look is that a stranded top-up Transfer is silently wrong in a specific way. Your QuickBooks Stripe clearing account would carry funds that Stripe does not think you have, so the clearing account stops agreeing with the Stripe balance, and the gap does not close by itself the way a timing difference does.
If you are a Connect platform
Platforms top up for different reasons than ordinary merchants, and Stripe lists them plainly: paying bonuses or one-off payouts independent of specific charges, providing customer discounts while still paying sellers full price, adding funds from non-Stripe income, and enabling faster payouts such as paying a vendor before incoming funds become available.
Three operational details are worth knowing before you build a process on it.
Adding funds does not retry anything. Stripe: "If a transfer or payout fails due to insufficient funds in your platform balance, adding funds doesn't automatically retry the failed action. After adding funds, you must repeat any failed transfers or payouts." Funding the balance fixes the cause and not the consequence.
Your bank account must be verified first. An unverified account requires confirming two microdeposits, which appear on your statement within 1-2 business days with ACCTVERIFY as the description. Doing this for the first time during an urgent funding need is a bad day.
Access is restricted. Only team members with administrator access to the platform Stripe account who have enabled two factor authentication can add funds. Availability is general in the USA, UK, and Japan, with EU, Canada, Australia, and New Zealand in private preview at the time of writing, and KYC approval of the platform profile required in every market.
Through the API, a top-up is a short call:
curl https://api.stripe.com/v1/topups \
-u "sk_test_...:" \
-d amount=2000 \
-d currency=usd \
-d "description=Top-up for week of May 31" \
-d "statement_descriptor=Weekly top-up"
The default statement descriptor is "Top-up," and both the descriptor and the internal description are customisable. Set the description to something your future self can reconcile against, because that string is what turns an anonymous Transfer in QuickBooks into an explained one.
What about the wire fee?
Stripe's add funds guidance says that with wire transfers "funds are available within the day" and that "Additional charges apply if funding with a wire."
The documentation does not say whether that charge lands on your Stripe balance or on your bank statement, so do not assume. Check both. If your own bank levies it, the charge never enters the Stripe balance at all, which means no integration can see it and you record it as a bank charge yourself. If it is deducted on the Stripe side, look for it in your balance transaction history for that date and confirm what type Stripe recorded it as before deciding where it belongs.
Either way the fee is a real expense, unlike the top-up itself. This is the one part of funding your Stripe balance that genuinely belongs on the profit and loss statement.
A short close checklist
- Pull the Top-ups tab in Stripe for the period and list every
tu_object with its date and amount. - Match each one to a Transfer in QuickBooks from the bank account into the Stripe holding account.
- Any inbound Transfer with no matching top-up is a negative payout. Note it and understand what drove it.
- Any top-up you initiated near period end with no posted Transfer yet is an in-transit reconciling item, not an error.
- Check for
reversedstatus on anything you funded and confirm the corresponding Transfer was reversed. - If you used the Future refunds or disputes balance, remember those funds sit outside the automatic payout cycle, and check your Data Feed for what posted.
- Confirm nothing coded the top-up to an expense account.
Frequently asked questions
How do I record a Stripe top-up in QuickBooks Online?
As a Transfer from your bank account into your Stripe holding or clearing account, for the amount funded. Both accounts are assets, so the entry moves money between them without touching income or expenses. With Acodei connected, this posts automatically on topup.succeeded and respects multibank account mapping if you have several bank accounts configured.
Is a Stripe top-up an expense?
No. Nothing has been bought and nothing has been earned. You have moved your own money from one asset account to another. Coding it as an expense understates net income in the month you fund and leaves unmatched income later when the same dollars are paid back out to you.
Why does my top-up look the same as a negative payout in QuickBooks?
Because it is the same shape. Acodei records a top-up as a Transfer from the bank account into the holding account, and it records a negative payout the same way, for the absolute amount, in both Undeposited Funds and non-UF modes. Match the amount and date against Stripe's Top-ups tab to tell them apart. An inbound Transfer with no matching tu_ object is a negative payout.
How long does a Stripe top-up take to arrive?
It depends on the method and region. Stripe publishes 1-3 days for a US ACH credit transfer, 5 days for an ACH debit transfer, 1-5 days for a US wire, 1-2 days for SEPA, and 2 hours to 1 day for UK FPS. New accounts without much top-up history may initially be slower.
Why is there no QuickBooks entry for a top-up I already sent?
Most likely because the top-up has not succeeded yet. The sync acts on topup.succeeded, so a top-up still in pending produces no QuickBooks record even though your bank has already been debited. Across a period boundary that becomes a normal in-transit reconciling item on your bank reconciliation.
What is the Future refunds or disputes balance?
A separate Stripe balance, refund_and_dispute_prefunding, that you can fund specifically to cover refunds and chargebacks. Stripe draws on it only after your available payments balance is insufficient, and funds there are never included in an automatic payout, though you can trigger a manual payout at any time.
Does pre-funding refunds affect reconciliation?
Yes, and it is easy to miss. For businesses on automatic payouts, Stripe states that balance transactions for refunds and disputes funded from the Future refunds or disputes balance are not included in payouts reconciliation reports. If your payout reconciliation comes up short by the value of some refunds, check whether those refunds were funded from that balance.
What happens if a top-up is reversed?
reversed is one of the Top-up object's five statuses, and Stripe records the balance movement as topup_reversal. Acodei's guidance is to verify that the original Transfer was reversed and to resync that date if it was not, so treat it as a manual check. A stranded top-up Transfer leaves your QuickBooks clearing account disagreeing with the Stripe balance, and that gap does not close on its own.
Why would a Connect platform top up its balance?
Stripe lists paying bonuses or one-off payouts independent of specific charges, offering customer discounts while still paying sellers in full, adding funds from income earned outside Stripe, and paying a vendor before incoming funds become available. Note that adding funds does not retry a transfer or payout that already failed for insufficient funds. You have to repeat it.
The point
Funding your Stripe balance is one of the few Stripe events with no revenue, no fee, and no customer attached to it. That makes it easy to record and easy to record wrongly, because the natural instinct, treating an outgoing wire as a cost, is exactly the wrong one.
Get three things right and the topic is closed. It is a Transfer, not an expense. It looks identical to a negative payout, so verify against the Top-ups tab rather than the register. And if you pre-fund refunds into the separate balance, know that those dollars have stepped outside the automatic payout cycle and out of the payouts reconciliation report.
Acodei posts the Transfer for you on topup.succeeded, in the right direction, into the right bank account when you have several. That leaves you doing the part that actually needs judgement, which is knowing which inbound Transfers you chose and which ones Stripe chose for you.
Stop hand-keying Stripe activity into QuickBooks. Acodei syncs payouts, top-ups, fees, refunds, and disputes into QuickBooks Online with the accounts and the direction already correct. Start a free trial.
Automate your Stripe to QuickBooks sync
Save hours every month. Acodei automatically syncs your Stripe transactions, invoices, and payouts to QuickBooks Online.
How Acodei handles this in your stack
Stripe QuickBooks Integration
See how Acodei syncs Stripe payments, fees, refunds, invoices, and payouts into QuickBooks Online automatically.
Or go straight to a capability
Advanced Product Mapping
Map Stripe products to QuickBooks with rule-based logic on product ID, price ID, metadata, and account. Set rule priority and extend mapping to refunds and fees.
Automated Invoice Sync
Bring Stripe invoices into QuickBooks and auto-apply payments and credit memos, with numbering, invoice matching, and quantity tracking to cut double-entry.
Multi-Currency Mastery
Sync Stripe transactions across currencies with automatic exchange rate handling, currency-specific customer records, and invoice-level multicurrency.
Class Mapping
Map Stripe products to QuickBooks classes for scalable categorization and multi-entity reporting, enabling precise insights without manual effort.
Historical Data Import
Backfill historical Stripe data into QuickBooks by month range. Preview volume and cost before syncing so reporting starts from a complete baseline.
How to Connect Stripe to QuickBooks Online
Connect Stripe to QuickBooks Online in minutes. Acodei links both accounts with secure OAuth and syncs payments, fees, refunds, and payouts automatically.
Reconcile Stripe Payments in QuickBooks
Reconcile Stripe in QuickBooks Online automatically. Acodei splits out fees, matches payouts to deposits, and keeps every charge audit-ready.
Get more operational finance guides like this one
We will only send high-value product and finance content.