Reconcile Stripe payouts against your Mercury deposits
Every weekday morning, check that every Stripe payout actually landed in your Mercury account, and hear about it only when one did not.
Every weekday at 9am, reconcile my Stripe payouts against the money that actually landed in my Mercury account, and post only the exceptions to Slack.
Start by pulling my Stripe payouts from the last 14 days using the Stripe List Payouts operation. Then pull my Mercury account activity for the same window using the Mercury List Transactions operation, extending the Mercury window a few days on either side so that deposits which settled just outside the payout window are still visible. On the Mercury side, only incoming deposits matter, so ignore outgoing payments, card spend, and internal transfers.
Match each payout to the deposit that corresponds to it, using amount, date, and the counterparty description on the Mercury transaction, which usually names Stripe. Two things make this matching fuzzy rather than an equality check, so use judgement. First, settlement is not instant: a payout normally lands one to two business days after Stripe sends it, and that lag varies. Second, payouts do not always map one to one onto deposits, because they can be batched together or split apart before they reach the bank. When a near match looks like the same money arriving in a slightly different shape, treat it as matched and say so, rather than raising a false exception.
Convert units before comparing any amounts. Stripe reports amounts in the smallest currency unit, so a 1250 payout means twelve dollars and fifty cents. Mercury reports whole dollars as decimals, so the same money appears as 12.50. Divide the Stripe amount by 100 before comparing it to a Mercury amount. Never compare 1250 against 12.50 and conclude the amounts differ.
Report only exceptions, in three groups. First, payouts that are still unmatched more than three business days after Stripe sent them. Count business days rather than calendar days, so a Friday payout is not called late on Monday. Second, Stripe-looking deposits in Mercury that do not correspond to any payout in the window. Third, amount mismatches where a deposit clearly matches a payout but landed short of the expected amount, with the shortfall stated. Payouts that are still within the normal settlement window are not exceptions, so leave them out entirely.
Include the Stripe payout ID and the payout date on every single exception, along with the expected amount and, where there is one, the amount that actually landed. The payout ID is what lets me jump straight to it in the Stripe dashboard, so no exception line should ever be missing it.
Post the result to my finance channel in Slack using the Slack Bot Send a Message operation. When there are exceptions, group them under the three headings above and keep each line short and scannable. When everything reconciles, send a single short all clear line instead of a full report, for example noting how many payouts were checked and confirming that all of them landed. The whole point is that this channel stays quiet unless something genuinely needs attention, so never pad the message with detail about payouts that reconciled cleanly.
What does this prompt do?
- Every weekday at 9am, pulls your Stripe payouts from the last two weeks alongside recent activity in your Mercury account.
- Matches each payout to the deposit that actually landed, allowing for the one to two business day delay banks take to settle.
- Posts a Slack message listing only the problems: payouts that never arrived, deposits that match no payout, and deposits that came in short.
- Sends a short all clear when everything lines up, so the channel only lights up when something genuinely needs attention.
What do I need to use this?
- A Stripe account that sends payouts to your bank.
- A Mercury business banking account. Read only access is enough, because this workflow never moves money.
- A Slack workspace and a channel where the finance updates should land.
How can I customize it?
- Change when it runs, for example earlier in the morning or every day including weekends.
- Widen or narrow the two week lookback, or change how many business days a payout can be missing before it counts as an exception.
- Point it at a different Slack channel, or have it message you directly instead.
FAQs
Why does it wait a few days before flagging a payout as missing?
Will this move any money or change anything in Stripe?
What happens on a day when everything reconciles?
What about weekends and bank holidays?
Does it still work if my payouts are batched or split?
Related templates
When someone leaves, we check which shared passwords they used in their final months and post a ranked rotation list to your security channel.
Every Monday, check every S3 bucket for public exposure, missing encryption and weak backup settings, then get the risks ranked in Slack.
Twice every weekday, the conversations from your social inbox land on the right HubSpot contact timelines, with a Slack recap for sales.
Every morning, find the addresses that hard bounced or filed a spam complaint, update the matching HubSpot contacts, and post a short Slack recap.
Every weekday at 4pm, spot the threads that went quiet, stage a ready-to-send nudge in your mailbox, and get a ranked Slack recap.
When you merge a fix in GitHub, this agent checks the matching dead-letter queue, replays the failed messages, and reports back on the pull request and in Slack.
Stop chasing Stripe payouts through your bank statement.
Let this run every weekday morning and tell you only when money is actually missing.