Documentation
The reference for Stripe Payout Reconciliation, the add-in that pulls your Stripe payouts into Microsoft Excel: the three custom functions and their exact columns, the reconciliation template workbook, how your restricted Stripe key is handled, the plan limits, and what to do when something does not look right.
Overview
Stripe Payout Reconciliation is an add-in that pulls your own Stripe payouts into the Excel grid with custom functions, and ships a reconciliation template workbook that matches those payouts against a bank statement you paste in, flagging matched and unmatched deposits.
There are two halves to it. The first is the three =STRIPE.* functions, which read payouts, the transactions behind a payout, and your balance. The second is the template workbook, which takes the payouts you pulled, compares them with your bank rows and tells you which deposits are still unexplained.
🔒 Where your data goes
You connect with a restricted, read-only Stripe key that you create yourself. The key is stored only in the add-in's local storage on your device, and the =STRIPE.* functions call api.stripe.com directly from your machine, so neither the key nor your payout data is sent to, stored on, or logged by Innova Apps servers. See Security & your Stripe key.
🏪 Not on the store yet
The add-in is coming soon to Microsoft AppSource and cannot be installed from the store today. The template workbook is already available to download, and you can email support@innovaapps.ai about early access.
Requirements
| Component | Requirement |
|---|---|
| Excel | Excel on Windows or Mac (Microsoft 365), or Excel on the web |
| Stripe account | Your own Stripe account |
| Stripe key | A restricted, read-only key you create in Stripe, with Balance: Read and Payouts: Read |
| Add-in account | A free Innova Apps add-in account (email and password), used for sign-in and plan status |
Nothing else is needed. There is no bank connection and no bank credentials anywhere: your statement rows are pasted in by you.
Getting started
The short version, in five steps:
- In Stripe, go to Developers → API keys → Create restricted key and grant Balance: Read and Payouts: Read.
- Sign in to the task pane with your free Innova Apps add-in account, paste the key and choose Test my key.
- Type
=STRIPE.PAYOUTS(B1,B2)with your From and To dates in B1 and B2. - Paste Date, Description and Amount from your bank onto the Bank Import sheet of the template.
- Read the flags on the Reconciliation sheet.
The quickstart walks through the same five steps in full, including exactly which permissions to tick in Stripe and what each of the four key checks means.
Functions
Three custom functions are available in the STRIPE namespace. They all read; none of them writes anything to Stripe.
Two conventions apply to all three:
- Amounts come back in major units (
123.45rather than12345), with zero-decimal currencies such as JPY handled correctly. You do not need to divide by 100. - Dates come back as
yyyy-mm-ddtext. If you want to do date arithmetic on a returned date, convert it with a formula such asDATEVALUE.
↘️ How results spill
Each function returns a block of cells that spills down and to the right from the cell you type the formula into. Leave that area empty: if something is in the way, Excel shows a spill error instead of the results. Only the top-left cell holds the formula.
STRIPE.PAYOUTS: payouts in a date range
=STRIPE.PAYOUTS(from, to, [includeHeader])
Returns your Stripe payouts whose arrival date falls in the range, oldest-first.
Parameters
| Parameter | Required | What to pass |
|---|---|---|
from |
Yes | The start of the range: a date cell, or text such as 2026-06-01. |
to |
Yes | The end of the range: a date cell, or text such as 2026-06-30. |
includeHeader |
No | Defaults to TRUE, which puts a header row above the results. Pass FALSE for data rows only. |
Output columns
- Payout ID
- Arrival date
- Amount
- Currency
- Status
- Bank
- Description
| Payout ID | Arrival date | Amount | Currency | Status | Bank | Description |
|---|---|---|---|---|---|---|
| po_1Ka…7Qd | 2026-06-02 | 1240.50 | USD | paid | Bank ••4321 | STRIPE PAYOUT |
Example
=STRIPE.PAYOUTS(B1,B2)
With 2026-06-01 in B1 and 2026-06-30 in B2, this returns a header row followed by one row per payout that arrived in June, oldest-first, spilling seven columns wide. Writing the dates as text works just as well: =STRIPE.PAYOUTS("2026-06-01","2026-06-30").
Notes
- The Bank column shows the bank name and last four digits when your restricted key also grants read access to external payout accounts (bank accounts). That permission is optional: without it the add-in simply retries the pull without that expansion, and the column shows the raw destination id such as
ba_1Abc…instead. The rest of the columns are unaffected either way. The column is empty only when a payout has no destination at all. - Set
includeHeadertoFALSEwhen you are stacking results under headings you have written yourself. - How far back the range may reach, and how many rows come back per pull, depend on your plan; see Plans & limits.
STRIPE.PAYOUT_ITEMS: the transactions inside one payout
=STRIPE.PAYOUT_ITEMS(payoutId, [includeHeader])
Returns the balance transactions that make up a single payout, so you can see the charges and fees behind the amount your bank received.
Parameters
| Parameter | Required | What to pass |
|---|---|---|
payoutId |
Yes | A po_… id, for example a cell from the first column of STRIPE.PAYOUTS. |
includeHeader |
No | Defaults to TRUE. Pass FALSE for data rows only. |
Output columns
- Txn ID
- Type
- Description
- Created
- Gross
- Fee
- Net
- Currency
| Txn ID | Type | Description | Created | Gross | Fee | Net | Currency |
|---|---|---|---|---|---|---|---|
| txn_1Ka…2Bp | charge | Invoice 1042 | 2026-05-31 | 120.00 | 3.78 | 116.22 | USD |
Example
=STRIPE.PAYOUT_ITEMS(A5)
If A5 holds a payout id from the first column of a STRIPE.PAYOUTS result, this returns a header row followed by one row per transaction in that payout, spilling eight columns wide. Gross, Fee and Net are in major units, and Created is yyyy-mm-dd text.
Notes
- Point it at one payout at a time. To open a second payout, put a second formula somewhere with room to spill.
- Very large payouts can return a lot of rows, and the same per-call row cap applies here as to
STRIPE.PAYOUTS: 25 rows on Free, so a payout with more than 25 transactions needs Pro. See Plans & limits.
STRIPE.BALANCE: your current Stripe balance
=STRIPE.BALANCE()
Returns your current Stripe balance: one available row and one pending row for each currency you hold. It takes no arguments, and it has no includeHeader parameter, so the result always starts with a header row.
Output columns
- Type
- Currency
- Amount
| Type | Currency | Amount |
|---|---|---|
| available | USD | 4820.15 |
| pending | USD | 1310.00 |
Example
=STRIPE.BALANCE()
Typed into an empty cell, this spills three columns wide: a header row, then two rows per currency. Amounts are in major units, so a JPY balance comes back as whole yen rather than as a sub-unit figure.
Notes
- This function needs the Balance: Read permission on your restricted key, which is one of the two permissions the add-in asks you to grant.
- It is a snapshot at the moment the formula recalculates, not a running total.
The template workbook
The reconciliation template is a free download, and you do not need an add-in account just to download and open it. The =STRIPE.* formulas inside it fill in once the add-in is installed and your key is connected.
Download stripe-payout-reconciliation-template.xlsx, a direct .xlsx download.
The four sheets
| Sheet | What it is for |
|---|---|
| Start Here | Instructions: what to fill in, in what order, and what each sheet does. |
| Payouts | From and To date cells, plus a pre-placed =STRIPE.PAYOUTS(B1,B2) that fills the sheet. |
| Bank Import | Where you paste Date, Description and Amount from your bank. Deposits with no payout behind them are flagged here. |
| Reconciliation | The matching: every payout flagged, the match window in cell J1, and the summary block. |
The matching rule
A payout matches a bank row when both of these are true:
- the two amounts agree to the cent, and
- the bank date falls inside the match window you control in cell J1 on the Reconciliation sheet.
The window defaults to ± 3 days, because deposits can lag the payout's arrival date. Widen or narrow it in J1 to suit your bank.
The results are flagged three ways: each payout is Matched in green or UNMATCHED in red on the Reconciliation sheet, and each bank deposit with no payout behind it is flagged NO MATCHING PAYOUT in amber on the Bank Import sheet.
The summary block
The Reconciliation sheet carries a summary block with six figures:
- payouts listed
- matched count
- unmatched count
- payouts total
- matched total
- unmatched total
What to keep in mind
⚠️ Two caveats the template also states
- Two payouts of the same amount inside the same window can match the same deposit. Verify those by hand.
- One copy assumes a single currency. If you are paid out in more than one currency, use a separate copy of the workbook per currency.
The workbook is built from plain, auditable Excel formulas, SUMPRODUCT-based with no array-entry (CSE) formulas, so a bookkeeper can inspect exactly how a flag was reached and adjust it.
ℹ️ If the sheet shows #NAME?
The add-in is not loaded yet. Open the task pane once, then recalculate with Ctrl+Alt+F9 (Cmd+Alt+F9 on Mac).
Security & your Stripe key
The restricted-key model
You create the key yourself, in your own Stripe account, with read permissions only. In Stripe, go to Developers → API keys → Create restricted key and grant:
- Balance: Read, which
STRIPE.BALANCEneeds. - Payouts: Read, which
STRIPE.PAYOUTSandSTRIPE.PAYOUT_ITEMSneed. - Optionally, read access to external payout accounts (bank accounts), which lets the add-in show bank names next to your payouts.
Restricted keys start with rk_live_ or rk_test_, and Stripe shows them only once, so copy the whole key when you create it. The add-in refuses secret keys (sk_) and publishable keys (pk_) with an explanation of what to do instead.
The four "Test my key" checks
"Test my key" in the task pane runs four checks and stops at the first failure, telling you the exact fix each time.
| # | Check | What it proves |
|---|---|---|
| 1 | Key format | That you pasted a restricted key (rk_live_ or rk_test_) rather than a secret or publishable key. |
| 2 | Valid key, Balance: Read | That Stripe accepts the key and that the Balance: Read permission is present. |
| 3 | Payouts: Read | That the Payouts: Read permission is present. |
| 4 | Write probe | Whether the key can write. The probe POSTs to a payout id that cannot exist, so nothing is ever created or changed: Stripe refusing the write outright (HTTP 403) means the key is read-only and the check passes, while an HTTP 404 means Stripe authorised the write and only then failed to find the object, which shows the key carries write permission and fails the check. |
✅ The add-in only reads
The add-in only accepts restricted keys, and "Test my key" tells you if the key you pasted can write, so you can go back to Stripe and recreate it read-only. Check 4 reports that; it does not delete or block the key you saved.
The add-in itself never writes to Stripe. It only issues GET requests for payouts, balance transactions and balance, so it cannot create charges, issue refunds or move money.
What never leaves the device
- The key is stored only in the add-in's local storage on your device. It is never sent to, stored on, or logged by Innova Apps servers.
- The
=STRIPE.*functions callapi.stripe.comdirectly from your machine, so your payouts, balance transactions, balances and spreadsheet contents never pass through our servers either. - Forget key in the task pane removes the key from the device. You can also revoke it in Stripe at any time, which stops it working everywhere.
What Innova Apps does store is the account side of things: your add-in account email and a hashed password, monthly usage counters that are used to show your usage in the task pane (and as a product signal for us), and, for Pro subscribers, a Stripe customer id and subscription status. The privacy policy has the full list.
ℹ️ Some Excel webviews block persistent storage
Where that happens, the key works for the session but has to be pasted again next time. The task pane tells you when you are in that situation.
Plans & limits
The add-in itself is free to install, and all three functions and the template are available on both plans. The plan only changes how far back you can pull and how many rows come back at once.
| Free | Pro: $19 per month | |
|---|---|---|
| History | The last 30 days of payouts | Full payout history |
| Rows per call | Up to 25, for STRIPE.PAYOUTS and for STRIPE.PAYOUT_ITEMS alike |
Up to 1,000, for both functions |
| Functions | All three | All three |
| Template workbook | Included | Included |
| Support | Standard | Priority support |
The 25-row cap on Free is per call and applies to both list functions, so a payout with more than 25 transactions behind it needs Pro to open in full.
The messages you see at the limits
- "Free plan shows the last 30 days": the range you asked for reaches further back than Free allows. Narrow the range, or upgrade to Pro.
- "more than 25 payouts": the call returned more rows than a Free call allows, whether those rows are payouts or the transactions inside one payout. Narrow the date range and pull in chunks, or upgrade to Pro to open larger payouts.
- "More than 1,000 rows": the result is larger than the 1,000 rows a single call returns on either plan. Narrow the date range and pull in chunks.
💳 How Pro is billed
Pro is billed through Stripe on Innova Apps' own Stripe account, not through Microsoft, and card details never reach Innova Apps servers. Paid upgrades are still being switched on, so there is no instant checkout yet; when they are live, you start an upgrade from the Upgrade button in the task pane and cancel any time from Manage billing there.
Troubleshooting
The messages below are the ones the add-in and the workbook actually show, with what each one means and what to do about it.
- "That's a full secret key…"
- You pasted a secret key (
sk_…). Create a restricted key instead: Developers → API keys → Create restricted key, with Balance: Read and Payouts: Read. - "Stripe rejected this key"
- The key has been deleted or rolled in Stripe, or it was only partially copied. Restricted keys are shown once, so if you are not certain you have the whole string, create a new key and paste that.
- "The key is missing Balance: Read" / "missing Payouts: Read"
- The key is valid but one of the two required permissions is not granted. Edit the key's permissions in Stripe and test again.
- "This key allows WRITES"
- Stripe authorised the harmless write probe instead of refusing it, which shows the key carries write permission. The key you saved is not deleted or blocked, and the add-in still only reads with it, but recreate it in Stripe with Read-only permissions and test again so it cannot do more than it needs to.
#NAME?in a cell- The add-in is not loaded. Open the task pane once, then recalculate with Ctrl+Alt+F9 (Cmd+Alt+F9 on Mac).
- "Free plan shows the last 30 days"
- Your date range reaches further back than the Free plan allows. Narrow the range, or upgrade to Pro for full history.
- A payout shows UNMATCHED although it is on the statement
- Check three things, in this order:
-
- the bank Date cell must be a real date, not text;
- the amount must match to the cent;
- if the deposit lagged, widen the ± 3 day match window in cell J1 on the Reconciliation sheet.
- "More than 1,000 rows" / "more than 25 payouts"
- The call returned more rows than your plan allows at once: 25 on Free, 1,000 on Pro, and the same cap applies to
STRIPE.PAYOUTSandSTRIPE.PAYOUT_ITEMS. Narrow the date range and pull in chunks, and note that a payout with more than 25 transactions needs Pro.
FAQ
Can the add-in move my money?
No. It only accepts restricted keys and refuses secret keys (sk_) and publishable keys (pk_), and the fourth check in "Test my key" is a side-effect-free write probe that tells you when the key you pasted can write, so you can recreate it read-only. Above all, the add-in never writes to Stripe itself: it only issues GET requests for payouts, balance transactions and balance, so it cannot create charges, issue refunds or move money.
Where is my Stripe key stored?
Only in the add-in's local storage on your device. It is never sent to, stored on, or logged by Innova Apps servers, and the functions call api.stripe.com directly from your machine. "Forget key" removes it from the device, and you can revoke it in Stripe.
Does it connect to my bank?
No. There is no bank feed and no bank credentials involved. You paste Date, Description and Amount from your own statement onto the Bank Import sheet, and the workbook matches from there.
Why are my amounts not divided by 100?
They already are. All three functions return amounts in major units (123.45 rather than 12345), and zero-decimal currencies such as JPY are handled correctly.
Can I use a test-mode key first?
Yes. The add-in accepts restricted keys starting with rk_test_ as well as rk_live_, so you can try the functions against your Stripe test data before pointing them at live payouts.
Do I need the add-in to open the template?
No. The workbook downloads and opens on its own, and no add-in account is needed to download it. The =STRIPE.* formulas inside it stay as #NAME? until the add-in is installed and your key is connected.
Can I reconcile more than one currency in one workbook?
One copy of the workbook assumes a single currency. Use a separate copy per currency.
Where do I install the add-in?
It is coming soon to Microsoft AppSource and is not on the store yet. In the meantime, read the quickstart to see the whole setup, or email support@innovaapps.ai about early access.
How do I delete my add-in account?
Email support@innovaapps.ai from the address the account uses. Deletion is completed within 30 days.
Support
📧 Contact us
For technical questions, bug reports or feature requests: support@innovaapps.ai. The support page has the same troubleshooting steps in a shorter form.
When you write in, it helps to include:
- which Excel you are using: Windows, Mac or the web;
- the formula you typed, with the date range;
- the exact message the task pane or the cell showed;
- whether "Test my key" passes all four checks.
Please do not send us your Stripe key, and do not paste it into an email or a screenshot. We never need it, and we cannot use it.
The add-in assists with reconciliation but does not replace accounting judgement. Verify the results before relying on them for bookkeeping, tax or audit.