Weekly log of purchases made without an approved order

Every Monday, add every invoice that arrived without an approved order to a running spreadsheet and get a short Slack recap of what it cost you.

Deterministic Code
CoupaGoogle SheetsSlack BotFinanceOperationsDaily DigestsData SyncNotifications & Alerts
PromptCreate

Every Monday at 6am, log every invoice that came through Coupa without a purchase order behind it, so my procurement team has a running record of off-contract buying instead of discovering it at quarter end. Run this on a cron trigger, every Monday at 6am in my timezone. Coupa does not send outgoing webhooks through this integration and is not one of the platform's poll providers, so cron is the only valid trigger here.

Use Coupa's List Invoices operation to pull invoices created in the last seven days that have no purchase order association. Filter server side with Coupa's query operators rather than scanning client side: set created_at[gt_or_eq] to the start of the seven day window as a URL encoded ISO 8601 timestamp, and use the [blank] operator set to true on the purchase order association so Coupa returns only invoices with no linked order. Coupa's Core API documents [blank] alongside [gt], [lt], [gt_or_eq] and [contains], so this is a single documented request, not a full scan.

Coupa list endpoints return at most 50 records per call and support offset based pagination only, with no cursor and no way to raise the page size. Page through by requesting 50 at a time and incrementing offset by 50 until a call returns fewer than 50 records, then stop. Remember that Coupa returns XML by default, so request JSON.

Apply a minimum invoice value threshold before anything is logged, defaulting to 500 in the instance base currency. Expose it as a named constant at the top of the workflow so it is easy to change. Invoices below the threshold are dropped entirely: they do not get a row, and they do not count toward the totals, the supplier ranking, or the week over week comparison.

For every invoice that clears the threshold, append one row to my Google Sheets log using the Append Values operation, in a fixed column order: invoice number, supplier name, amount, currency, invoice date, requester or department, and general ledger account code. Append only and never overwrite existing rows, so the sheet builds into a month over month record.

Before appending this week's rows, read the existing log with the Get Values operation and total the amounts already recorded for the previous seven day window. Use that as the baseline for the week over week comparison. If the sheet has no prior week in it, report the change as not available rather than guessing or reporting a change of zero.

Then post a short summary to my procurement Slack channel using Slack's Send a Message operation, posting as a bot. The message shows the count of invoices with no purchase order, their total value, the top three suppliers ranked by total value, and the week over week change against the baseline. Keep it short and scannable, and include a link to the log.

Keep this deterministic with no interpretation: fixed filter, fixed columns, fixed arithmetic, and no commentary or judgement about whether a given purchase was justified. If nothing matched once the threshold is applied, skip the Slack post entirely and leave the sheet untouched, so a clean week stays completely silent.

Example output

Purchases without an approved order, week of 28 Jul to 3 Aug 12 invoices, $84,200 total Top suppliers by value: 1. Nordic Office Supply, $31,400 2. Beacon IT Services, $18,900 3. Talent Partners LLC, $9,750 Down 18% vs the week before ($102,600) Full log: Off-Contract Spend Register

Additional information

What does this prompt do?
  • Every Monday at 6am, pulls the past week's Coupa invoices that have no approved order behind them
  • Adds one row per invoice to a Google Sheet: invoice number, supplier, amount, currency, date, requester or department, and accounting code
  • Posts a short Slack recap with the count, the total value, the top three suppliers, and how the week compares to the one before
  • Stays quiet on a clean week, and ignores anything under a minimum value you set
What do I need to use this?
  • A Coupa account with permission to view invoices
  • A Google account and a spreadsheet to use as the running log
  • A Slack workspace and a channel where your procurement team gets updates
How can I customize it?
  • Change the day and time it runs, or widen the lookback window beyond seven days
  • Set the minimum invoice value so small everyday purchases stay out of the log
  • Choose which Slack channel gets the recap, or skip the recap and keep just the spreadsheet

FAQs

What counts as a purchase made without an approved order?
Any invoice that arrived with no purchase order attached to it. Normally a purchase gets approved first and the invoice is matched against that approved order. When there is nothing to match against, the spend happened outside the usual process, and that is what this picks up.
Will it post to Slack even when nothing turned up?
No. A clean week stays silent. If no invoices matched, the Slack recap is skipped entirely and the spreadsheet is left alone, so the channel only lights up when there is something real to look at.
Can I keep small invoices out of the log?
Yes. You set a minimum value, and anything below it is ignored completely. It will not appear in the spreadsheet and will not count toward the totals or the supplier ranking, so a handful of small purchases will not bury the ones that matter.
Does this change anything in Coupa?
No. It only reads invoices. It never edits, approves, disputes, or voids anything, so it is safe to run against your live account.
What if we have a lot of these in one week?
It pages through the full set rather than stopping at the first batch, so a heavy week is captured completely. Every matching invoice gets its own row in the spreadsheet.
How does the week over week comparison work?
It reads the totals already sitting in your log from the previous week and compares against them. That means the comparison gets more useful over time, and the very first run will simply report that there is no prior week to compare against yet.

Related templates

Chase past-due JobNimbus invoices with escalating emails

Every weekday, find every unpaid JobNimbus invoice, email each customer one reminder that gets firmer as it ages, and post a receivables summary to Slack.

JobNimbus
Gmail
Slack Bot
Agentic Task
Flag at-risk students in Canvas before they fall behind

Every weekday at 7am, your active courses are checked for missing work, silent logins, and slipping grades, with a ranked list sent to your advising channel.

Canvas
Google Sheets
Slack Bot
Agentic Task
Catch Jira service desk tickets before their SLA runs out

Every hour, find the tickets closest to breaching, leave a nudge on each one, and post a ranked at-risk list to your support channel.

Jira Service Management
Slack Bot
Agentic Task
Send Canvas students a kind nudge about missing work

Every weekday afternoon, each student who is behind gets a warm, personal message in their Canvas inbox listing exactly what they owe.

Canvas
Slack Bot
Agentic Task
Weekly Canvas grading backlog report in Slack and Sheets

Every Monday at 8am, see exactly which assignments have work waiting, sorted worst first, posted to Slack and logged to a spreadsheet.

Canvas
Slack Bot
Google Sheets
Deterministic Code
Revoke Bitwarden access when someone leaves in BambooHR

Every weekday morning we compare your password vault against your HR records and suspend access for anyone who has already left.

Bitwarden
BambooHR
Slack Bot
Agentic Task

Stop discovering off-contract spend at quarter end.

Set this up once and your procurement team gets a running spend register every Monday, plus a short nudge on the weeks that need attention.