Skip to content
agentusehub
FinanceIntermediateB2B SaaS

Monthly SaaS spend review that flags unused seats

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.

Time saved
3h / week
Setup time
2 hours
Running cost
$3/mo
Cost range
Under $25/mo

The problem it solves

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.

How it flows
  1. Receipts in Gmail
  2. Extract line items
  3. Match to headcount
  4. Flag unused seats

Step-by-step setup

  1. Label receipts in Gmail

    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.

  2. Set up the ledger sheet

    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.

  3. Add the Apps Script extractor

    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.

  4. Write rows and dedupe

    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.

  5. Generate the monthly review

    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.

  6. Email each tool owner

    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.

Example prompts

Receipt extractor
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}}
Monthly spend review
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}}
Finance · Intermediate
  1. New bank transaction
  2. Find open invoices
  3. 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.

Zapier · ChatGPT · QuickBooks
Customer Support · Beginner
  1. Support email
  2. Order-status check
  3. Shopify order lookup

Auto-answer order status emails with live tracking

Spot order-status questions in the support inbox, look up the order in Shopify and reply with live tracking and an honest ETA.

Gmail · Zapier · ChatGPT · Shopify
Marketing · Beginner
  1. Brief in Sheets
  2. ChatGPT writes 20
  3. Claude scores rules

Generate and test 20 ad variants from one brief

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.

ChatGPT · Claude · Make · Google Sheets