Payments & billing
Connect Stripe to Excel, Sheets and AI
Query charges, customers, invoices and subscriptions with SQL. Join Stripe to any database — a folder of CSVs included — in one read-only statement.
One connection, every surface
Where your Stripe data can go
Connect Stripe once and the same read-only connection feeds all of these — no second setup, no second copy of the data. 8 of 11 have a step-by-step guide.
Stripe to Excel
Microsoft Excel · Excel add-in
Pull live Stripe results straight into a worksheet and refresh them on demand — desktop Excel, Excel Online, Microsoft 365.
Read the guideStripe to Google Sheets
Sheets add-on
Run a saved Stripe query from the sidebar and drop the rows into the sheet. Shared collaborators can refresh it themselves.
Read the guideStripe MCP server
Claude, Cursor and MCP clients
Give an AI assistant read-only access to Stripe with the schema it needs to write correct SQL — no credentials in the chat.
Read the guideStripe REST API
HTTP endpoint
Publish a Stripe query as an authenticated JSON endpoint any application can call, with an OpenAPI 3.1 spec and ready-made Postman, Insomnia and Hoppscotch collections. No database port is opened.
How REST API works no Stripe walkthrough written yetStripe to Airtable
Automation platform
Sync Stripe rows into an Airtable base on a schedule, or fetch them inside an Airtable automation script.
Read the guideStripe to Baserow
Automation platform
Feed a Baserow table from Stripe over the REST endpoint — self-hosted or Baserow cloud.
Read the guideStripe to SeaTable
Automation platform
Keep a SeaTable base current with Stripe data without exporting a file or exposing the database.
Read the guideStripe to Smartsheet
Automation platform
Push Stripe results into a Smartsheet grid so plans and reports read from the source system, not last week's export.
Read the guideStripe to Anvil
Anvil Works · App platform
Back an Anvil Python app with Stripe through the REST endpoint instead of embedding database credentials in the app.
Read the guideStripe to Power BI
Power Query M
Paste the generated Power Query M into the Power BI Advanced Editor and the report reads live Stripe results over HTTPS — no ODBC driver, no database port opened.
How Power BI works no Stripe walkthrough written yetStripe alerts and reports
Slack · Discord · Email · Webhook
Put a Stripe query on a schedule and have the rows delivered to Slack, Discord, email or a signed webhook — or hold the message until a row count, threshold or percentage change crosses the line you set.
How alerts and reports work no Stripe walkthrough written yetHow it works
5 steps, no inbound firewall change
Install the Network Agent wherever suits you. It calls Stripe directly over HTTPS from your own network.
Paste a Stripe secret key. It is held on the agent; Query Streams never uses it to reach Stripe on your behalf.
Choose which of the 15 tables to sync and how often. Charges, payment intents, customers, invoices and subscriptions are on by default; the rest are yours to enable.
Write ordinary SQL against stripe.charges, stripe.invoices and the rest — or let Nova write it.
Read it from Excel, Sheets, Power BI, MCP or REST, and join it to your own database in the same statement.
Feature deep-dive
What Stripe gives you
Updates, not just new rows
Most tools that copy Stripe into a database ask for records created since last time. That catches new charges and misses everything that changed: a refund, a dispute, a subscription cancelled, an invoice paid. This one reads Stripe's events feed instead.
- A change to an existing record is picked up because Stripe recorded an event for it, so your tables reflect the current state rather than the state at creation.
- Stripe keeps events for 30 days. If a connection has been paused longer than that, the next run does a full re-read instead of quietly starting from a gap.
- Balance transactions are the exception — Stripe publishes no event feed for them, so those are tracked by creation date, which is the right model for a ledger that only ever appends.
- A record deleted at Stripe disappears from your tables rather than lingering as a stale row.
The 15 tables
Every one is a real SQL table with typed columns, a primary key and indexes — not a JSON blob you have to unpick.
- Payments — charges, payment_intents, refunds, disputes.
- Billing — customers, invoices, invoice_items, subscriptions, subscription_items.
- Catalogue — products, prices, coupons.
- Money movement — balance_transactions, payouts.
- Audit — events, the same feed the incremental sync rides on, kept as a table you can query.
- Amounts are stored the way Stripe reports them, in the smallest currency unit. A $12.50 charge is 1250, so nothing has been rounded before you see it.
Fresh at the moment you read it
Fourteen of the fifteen tables can refresh a row from Stripe as your query touches it — everything except the events log, which is an append-only feed. Ask for one customer's invoices and those rows are checked against Stripe before the answer comes back, while a report over a year of charges reads the synced copy at SQL speed and spends none of your rate limit.
- How stale is too stale is per table, and sensible: fifteen seconds for a subscription, half a minute for a charge or an invoice, a quarter of an hour for the product catalogue, which only changes when somebody edits it.
- A record deleted at Stripe is noticed on that same path and removed, so the cache does not go on serving a row that no longer exists.
- The agent paces itself well inside Stripe's limits and waits as long as Stripe asks it to when it does hit one, so a heavy report cannot get your account throttled.
Shared by every API connector
How every API connector works
- Your account becomes tables — endpoints are mapped to typed SQL tables with primary keys and indexes, so you write SELECT, JOIN and GROUP BY instead of paging through JSON.
- You choose what syncs, and how often — each table has its own interval, or none at all. Where the vendor's API supports it, only records that changed since the last run are fetched.
- The copy is yours — it lives in an AES-256-GCM encrypted DuckDB file next to the agent, on your machine. Not in our cloud.
- The vendor only ever hears from you — the agent calls the API directly from your own network, so your token is not needed by Query Streams to answer a query.
Good to know
- It is a synced copy, not a live proxy — a query reads what has already been fetched, so it returns at SQL speed and never spends your API rate limit. Selected tables can additionally refresh a stale row as you read it.
- Rate limits are respected for you — each connector paces itself well inside the vendor's published limits, so a report cannot get your account throttled for everything else that uses it.
- Nothing is thrown away — fields the table does not name are kept in a raw_data JSON column you can still query.
- Join it to your databases — an API table and a SQL Server table in the same statement is an ordinary query here, not an integration project.
Cross-source SQL
Join Stripe to the rest of your data
Stripe knows what was collected and nothing about who the account is. Your own database holds the customer record and the CRM holds what kind of company it is — one statement can ask all three which kind actually pays. Each source runs only the part it can, streams the result back, and the join happens centrally — the sources never talk to each other and nothing is copied anywhere.
3 connections · 3 agents
One statement
-- the payment from Stripe, the account from your database, the company from HubSpot
SELECT h.industry, COUNT(*) AS payments, SUM(f.amount) / 100 AS collected
FROM payments.stripe.charges1 f
JOIN pg_crm.public.customers2 c ON c.stripe_id = f.customer
JOIN crm_api.hubspot.companies3 h ON h.domain = c.domain
WHERE f.status = 'succeeded'
GROUP BY h.industry
ORDER BY collected DESC;
The three parts are connection, schema and table — and the connection name is whatever you called it. Illustrative columns; your tables will be your tables. charges.customer is the Stripe customer id, which is why the first join runs through your own record rather than straight into the CRM. Stripe reports money in the smallest currency unit, so the division is yours to do and nothing has been rounded before you see it. Read-only applies to every piece: SELECT, WITH and EXPLAIN only, with a ceiling on how much any one source may hand over for a single query. How federated queries work
Connection details
What Stripe needs
- Authentication
- A Stripe secret key, held on the agent. Live and test keys are both recognised and labelled
- Reached over
- HTTPS from your network to Stripe. Nothing inbound, and no webhook endpoint to expose
- Schema
- stripe — so stripe.charges, stripe.invoices, stripe.subscriptions
- Tables
- 15. Charges, payment_intents, customers, invoices, invoice_items, subscriptions, subscription_items, refunds, disputes, payouts, balance_transactions, products, prices, coupons, events
- Amounts
- In the smallest currency unit, as Stripe reports them — 1250 for $12.50
- Incremental
- Through Stripe's events feed, so updates and deletions are caught. A gap longer than Stripe's 30-day event window triggers a full re-read
- Live refresh
- On 14 of the 15 tables — everything but the events log — with a per-table freshness window from 15 seconds to 15 minutes
- Rate limits
- Paced well inside Stripe's, and waits out Stripe's own retry signal when one is returned
- Local copy
- An AES-256-GCM encrypted DuckDB file beside the agent, on your machine
The events table is polled, not received. The agent is outbound-only by design — it opens a connection out and nothing can reach it — which means there is no webhook endpoint here and nothing for you to host. The trade is that events arrive on the sync interval you chose rather than the instant they happen.
Read-only is structural, not a setting. The connector implements no Stripe write call at all, so there is nothing to disable and no key permission to get wrong: it cannot issue a refund or cancel a subscription because that code does not exist in it.
Vendor documentation: stripe.com
FAQ
Questions about Stripe
Which tools can read Stripe data through Query Streams?
All of them, from one connection: Excel, Google Sheets, MCP, REST API, Airtable, Baserow, SeaTable, Smartsheet, Anvil, Power BI, scheduled alerts and reports. Connect the account once and every surface reads the same read-only connection — there is no per-tool setup and no second copy of the data.
Do I have to open a firewall port to my Stripe account?
No. The Query Streams Network Agent runs inside your network and opens a single outbound encrypted connection. Nothing listens for inbound traffic, no VPN is required, and the account keeps its existing firewall rules.
Can Query Streams change data in Stripe?
No. The agent enforces read-only at the point of execution — one statement at a time, SELECT and friends only. Credentials stay on the agent and are never sent to Query Streams.
What does Query Streams need to connect to Stripe?
A reachable host, a role and its password — the agent carries the driver, so nothing is installed on the account. Authentication: A Stripe secret key, held on the agent. Live and test keys are both recognised and labelled. Reached over: HTTPS from your network to Stripe. Nothing inbound, and no webhook endpoint to expose. Schema: stripe — so stripe.charges, stripe.invoices, stripe.subscriptions. Tables: 15. Charges, payment_intents, customers, invoices, invoice_items, subscriptions, subscription_items, refunds, disputes, payouts, balance_transactions, products, prices, coupons, events.
Can I join Stripe to another database in the same query?
Yes — that is a federated query. One statement can reference Stripe and your other connections at once, written as connection.schema.table. Each source runs only the part it can and streams the result back; the join happens centrally, so the sources never connect to each other and nothing is copied or scheduled. Read-only applies to every piece — SELECT, WITH and EXPLAIN only — and there is a ceiling on how much any one source may hand over for a single query. Federated queries are a plan feature; the federated queries page carries the current source and size limits.
Put Stripe where the work happens
Install the agent, point it at your account, and pick a destination.
Read-only Outbound only Credentials stay on the agent

