On a schedule
Copy new Stripe payouts to Google Sheets
Each new Stripe payout is added to a Payouts tab with arrival date, amount, fees and how many charges it covers.
- Runs
- On a schedule
- Apps
- Google Sheets, Stripe
- AI
- Not needed
- Access
- Stripe secret or restricted key (read payouts, balance); Google Sheets read+write
Send this to your assistant
Create a ClickRuntime automation: every morning at 7, add any new Stripe payouts to the Payouts tab of my Finance sheet with arrival date, amount, total fees, number of charges and status.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
The money in the bank arrives as one lump per payout, while Stripe shows hundreds of individual charges. Matching the two by hand each month means opening the Stripe dashboard, filtering by payout, and copying totals into a spreadsheet.
This automation writes one row per payout as soon as Stripe creates it, with the arrival date that matches your bank statement, the net amount, the fees taken and how many charges and refunds it contains.
Bookkeepers, founders doing their own books and finance teams at small online businesses use it to reconcile Stripe against the bank in minutes.
What you get out of it
Bank reconciliation is a lookup
The arrival date and net amount match the deposit line on your bank statement, so each payout can be ticked off directly.
Fees are recorded every time
Processing fees are summed per payout, ready to book as an expense without exporting reports.
No duplicates
The last payout seen is stored, so a re-run or a missed morning never adds the same payout twice.
Refunds are visible
A refund count per payout explains why a deposit was lower than expected.
Works with your existing sheet
Rows go to a tab you choose, so formulas, pivot tables and your accountant's links keep working.
How it works
What happens, step by step
Every morning ClickRuntime asks Stripe for payouts created since the last run.
For each payout it adds up the fees and counts the charges and refunds inside it.
One row per payout is added to your Payouts tab: arrival date, amount, fees, charges, refunds, status and payout ID.
The newest payout is remembered so nothing is copied twice.
Before it runs live
- Connect your Google Sheets account and pick the spreadsheets it may use
- Connect Stripe
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Run it at a different time, more or less often, or only on weekdays
- Add an AI step, for example to summarize, sort or draft a reply
- Add another app, for example also send it to Slack
- Combine it with other Google Sheets and Stripe steps into one automation
Under the hood
The code that runs this automation
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from datetime import datetime, timezone
from clickruntime import on_trigger, credentials, http, state, report_fetched
SHEET_ID = "your-spreadsheet-id"
def stripe(path, **params):
r = http.get(f"https://api.stripe.com/v1/{path}", params=params,
auth=(credentials.secret("STRIPE_API_KEY"), ""))
r.raise_for_status()
return r.json()
def sheets():
return build("sheets", "v4", credentials=Credentials(credentials.connection("google", "work")),
cache_discovery=False).spreadsheets()
@on_trigger
def run(event):
since = state.get("last_created") or 0
payouts = [p for p in stripe("payouts", limit=100, **{"created[gt]": since})["data"]]
report_fetched(len(payouts))
if not payouts:
return {"new": 0}
rows = []
for p in sorted(payouts, key=lambda p: p["created"]):
txns = stripe("balance_transactions", payout=p["id"], limit=100)["data"]
fees = sum(t["fee"] for t in txns) / 100
charges = sum(1 for t in txns if t["type"] in ("charge", "payment"))
refunds = sum(1 for t in txns if t["type"] in ("refund", "payment_refund"))
arrival = datetime.fromtimestamp(p["arrival_date"], timezone.utc).date().isoformat()
rows.append([arrival, p["id"], p["amount"] / 100, p["currency"].upper(), fees, charges, refunds, p["status"]])
sheets().values().append(spreadsheetId=SHEET_ID, range="Payouts!A:H", valueInputOption="USER_ENTERED",
body={"values": rows}).execute()
state.set("last_created", max(p["created"] for p in payouts))
return {"new": len(rows)}FAQ
Common questions
Why are fees on a separate line from the payout amount?
What if a payout fails or is still in transit?
Does it handle payouts with more than 100 transactions?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Monthly Stripe tax summary by country in a sheet
On the 1st of each month, last month's paid Stripe invoices are totalled by country and tax rate in a new tab, and you're told in Slack.
See how it worksSync active Stripe subscriptions to Google Sheets
A Subscriptions tab is rewritten every night with each live Stripe subscription: customer, plan, monthly amount, status and next renewal.
See how it worksLog daily Stripe revenue in a sheet with a running forecast
Each morning yesterday's gross, fees, refunds and net per currency are added to your sheet, and you get a 30-day forecast by email.
See how it worksKeep exploring
Set up “Copy new Stripe payouts to Google Sheets” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.