- New bank transaction
- Find open invoices
- Match with ChatGPT
Reconcile invoices against bank transactions
Zapier sends each new bank transaction to ChatGPT, which matches it to the right open invoice or bill in QuickBooks and flags anything unclear.
Pull every software receipt from Gmail into a sheet, match it to active users, and get a list of seats and tools you can cancel.
Software bills arrive as dozens of separate receipts, and nobody owns the full list. Seats stay paid for people who left months ago, and annual renewals slip through without a review. By the time finance notices, the money is already spent.
Create a filter for `subject:(receipt OR invoice OR renewal) from:(billing OR invoice OR receipts)` that applies the label `SaaS/Receipts`. Apply it to existing conversations so the last 90 days are labelled too.
Create three tabs: `Ledger` (date, vendor, amount, currency, billing_period, seats_billed, message_id), `Roster` (vendor, active_users, owner) and `Review`. Paste active-user counts from each admin console into `Roster` once a month.
In Extensions > Apps Script, write a function that runs `GmailApp.search("label:SaaS/Receipts newer_than:35d")` and sends each new message body to the OpenAI Chat Completions endpoint with `response_format: { type: "json_object" }`. Keep the API key in Script Properties, never in the code.
Append one row per receipt to `Ledger`, using the Gmail message ID as the dedupe key so reruns never double-count. Add a lookup column that normalises vendor names, so “Slack Technologies” and “Slack” roll up together.
A time-driven trigger on the 2nd of each month groups the ledger by vendor, joins it to `Roster` and sends the table to ChatGPT with the review prompt. The result lands in `Review` with columns vendor, action, seats_to_remove and monthly_saving.
Use `GmailApp.sendEmail` to send owners only the rows where seats billed exceed active users by 2 or more, or where a renewal is due within 30 days. Owners reply keep or cancel, and finance makes the change.
You extract billing data from a software receipt or invoice email.
Return JSON only, with these keys:
- vendor: the product name, not the legal entity (e.g. "Notion", not "Notion Labs Inc.")
- amount: total charged as a number, no currency symbol
- currency: three-letter code
- billing_period: "monthly", "annual" or "one-off"
- seats_billed: number of seats or users if stated, otherwise null
- renewal_date: ISO date if stated, otherwise null
If the email is not a receipt or invoice, return {"vendor": null}.
Email:
{{email_body}}You are reviewing a company's SaaS spend for {{month}}. Below is a table of vendors with monthly cost, seats billed, active users in the last 30 days and the tool owner.
For each vendor, choose one action:
- "cut seats" if seats billed exceed active users by 2 or more; state how many seats to remove and the monthly saving
- "review" if two vendors do the same job (for example two video tools) or a renewal is due within 30 days
- "keep" otherwise
Return a markdown table with columns vendor, action, seats_to_remove, monthly_saving, reason. Keep each reason under 15 words. End with the total monthly saving if every recommendation is accepted.
Data:
{{vendor_table}}Zapier sends each new bank transaction to ChatGPT, which matches it to the right open invoice or bill in QuickBooks and flags anything unclear.
Spot order-status questions in the support inbox, look up the order in Shopify and reply with live tracking and an honest ETA.
Turn one campaign brief into 20 Meta and Google ad variants, score each against your brand rules and limits, and queue the best for approval.