Daily Coupa approval backlog digest for procurement
Every weekday at 8:30am, your procurement team gets one Slack message showing every approval still waiting, who owns it, and what it is holding up.
Every weekday at 8:30am, give my procurement team a single view of everything stuck in Coupa approvals so nothing sits and ages quietly. Use a cron trigger set to weekdays at 8:30am in our local timezone. Coupa does not send outgoing webhooks through this integration and is not a supported polling source, so cron is the only valid trigger here.
Start with Coupa's List Approvals operation to pull every approval still in a pending state. Coupa list endpoints return at most 50 records per call and only support offset based pagination, so loop with offset increments of 50 until a call returns fewer than 50 records. Do not assume one call is enough. Narrow the set with filter operators where useful, for example created_at[gt_or_eq] to skip ancient noise, and remember that date values must be URL encoded.
Each approval points at an underlying document, so enrich every pending approval by fetching that document based on what is awaiting sign off. For requisitions use Get Requisition, for purchase orders use Get Purchase Order, and for invoices use Get Invoice. Note that our Coupa catalog has no list invoices operation, so invoices must be fetched individually by ID. Where you have many requisition or purchase order IDs, you can reduce call volume by batching them through List Requisitions or List Purchase Orders with an id filter instead of fetching one at a time. From each document pull the supplier, the total amount and currency, the requester name, and a short description of what the spend is actually for, so the digest explains the item rather than just naming a document number.
Group the results by approver name. Coupa has no documented user lookup operation in our catalog, so do not try to resolve approvers to email addresses or Slack accounts and do not attempt to direct message individual approvers. Group by the approver name exactly as Coupa returns it, in one shared channel digest. Within each approver group, sort by how many days the item has been waiting, longest first, and then by value, highest first.
Calculate days waiting from the date the approval entered its current pending state. Treat the aging threshold as a configurable value with a default of three business days, and count business days rather than calendar days so a weekend does not make a Monday item look overdue. Clearly call out every item past that threshold, for example with a warning marker and the number of days it has been waiting.
Keep the message readable. Use a configurable low value threshold, and collapse every pending item below it into a single count line per approver, such as a line noting a number of additional low value items with their combined total, rather than listing each one. Only items at or above the threshold get their own line.
Post the digest as a single Slack message to our procurement operations channel using Slack's Send a Message operation. Do not split it across multiple messages. Lead with a one line headline covering the total number of items pending, the total value held up, and the oldest item with its age. Follow that with the per approver breakdown, each group headed by the approver name and their item count and total value, then their sorted item lines showing supplier, amount, requester, purpose, and days waiting.
If nothing is past the aging threshold, do not post the long breakdown. Post a short all clear message instead, noting how many items are pending and that none have breached the threshold, so the channel stays quiet on good days.
Expose the aging threshold, the low value threshold, and the target Slack channel as configurable values at the top of the workflow so they are easy to change without rewriting the logic. If a document lookup fails for a single approval, skip that item gracefully and still post the digest rather than failing the whole run, and note the count of items that could not be enriched.
Additional information
What does this prompt do?
- Checks your spend management system each weekday morning for every request, order, and invoice still sitting in an approval queue.
- Looks up the underlying document for each one so the digest shows the supplier, the amount, who requested it, and what the spend is actually for.
- Groups everything by the person who owns the approval, ranked by how long it has been waiting and then by value, and flags anything older than your aging limit.
- Posts the whole backlog as a single Slack message with a headline covering total items, total value held up, and the oldest item, or a short all clear when nothing is overdue.
What do I need to use this?
- A Coupa account with permission to read approvals, requests, orders, and invoices
- A Slack workspace and the channel where your procurement operations team works
- The names of your approval stages if you only want certain types of spend included
- An aging limit you care about, such as three business days
How can I customize it?
- Change the timing, for example run it at 7am, twice a day, or only on Mondays
- Adjust the aging limit that marks an item as overdue, and the low value cutoff that collapses small items into a single count line
- Point it at a different Slack channel, or split high value items into their own message
FAQs
Will this send each approver their own reminder?
Does it post a long report even when nothing is overdue?
Can it approve or reject things automatically?
What if we have hundreds of pending items?
How does it know how long something has been waiting?
Related templates
New roof inspection requests from your website form land in JobNimbus within a minute, with no duplicate records and nothing retyped by your team.
Every new customer request gets a priority, triage labels, a friendly reply with the right help article, and a Slack ping only when it is truly urgent.
When a bot opens a version bump pull request, we read the real documentation for that exact version and tell you whether it is safe to merge.
The moment a deal hits Closed Won, the right contract starts in Ironclad, the link lands on the deal, and your sales channel hears who owns the next step.
Every Monday, find contracts renewing or expiring in the next 90 days, post a ranked digest to Slack, and open Asana tasks for the ones that need a decision now.
Every Friday, spot the questions your team keeps answering by hand and get a ready-to-review help article drafted from real fixes.
Stop letting approvals age quietly.
Give your procurement team one morning view of every request, order, and invoice waiting on a signature, ranked by how long it has been stuck.