# 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.

- Workflow type: agent
- Services: Coupa, Slack
- Categories: Operations, Finance
- Published: 2026-08-04

## What it does

- 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 you'll need

- 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

## Prompt

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.

## How to customize

- 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

## FAQ

### Will this send each approver their own reminder?

No. It posts one shared digest to a procurement operations channel, organised by approver name. Coupa does not give us a reliable way to match an approver to a Slack account, so a single grouped message is both more dependable and more useful for the ops team tracking the whole backlog.

### Does it post a long report even when nothing is overdue?

No. If nothing has passed your aging limit, it posts a short all clear line instead of a full breakdown, so the channel stays quiet on good days.

### Can it approve or reject things automatically?

No. This is a read only digest. It surfaces what is waiting and how long it has been sitting, and people take action in Coupa as normal.

### What if we have hundreds of pending items?

Small items below a value you set are collapsed into a single count line, and everything else is grouped by approver and sorted by age, so the message stays readable no matter how big the backlog gets.

### How does it know how long something has been waiting?

It uses the date each approval entered the queue and counts the days since then, so an item that has bounced between stages is measured from when the current approver received it.

Use this prompt in General Input: https://www.generalinput.com/prompts/daily-coupa-approval-backlog-digest-for-procurement