# Spend request approval console for your Coda intake table

> Work every pending purchase and expense request in one fast queue, with budget context, one click decisions and automatic notifications.

- Workflow type: app
- Services: Coda, Gmail, Slack Bot
- Categories: Finance, Operations
- Published: 2026-08-16

## What it does

- Opens on a live queue of every pending spend request from your Coda table, sorted by amount or by how long it has been waiting, with a clear count of anything aging past your two day service level.
- Shows the full request beside a running total of what that team has already had approved this month, so the approver has budget context at the moment of decision.
- Approve or reject in one click. The decision, the approver name, the time and any rejection reason are written straight back into the Coda row, and rejections cannot be submitted without a reason.
- Emails the requester the outcome, posts larger approvals into a finance Slack channel, and lets you bulk approve everything under a small amount you set.

## What you'll need

- A Coda account with the table your team submits purchase and expense requests into
- A Gmail account to send outcome emails from
- A Slack workspace if you want approvals above a threshold posted to a finance channel
- Requests already captured as rows, with fields like requester, amount, vendor, category and status (the app reads your table structure, so column names can be whatever you use)

## Prompt

Build me an internal approval console for the spend requests my team submits into a Coda intake table. Right now approvers work the queue by loading the whole Coda doc on their phone, which is slow. I want one fast screen that opens on the pending queue and lets an approver clear it in a few minutes.

Setup screen: let me pick the Coda doc and table, then call Coda List Columns and let me map the fields the app needs, so the app adapts to how the table is actually built instead of assuming column names. Map requester name, requester email, team, amount, vendor, category, business justification, linked doc or URL, status, and the fields the app writes back (decision, approver name, decided at, rejection reason). Also configurable here: the service level in hours (default 48), the amount above which approvals are posted to Slack, the bulk approve cap, the finance Slack channel (use Slack Bot List Channels for the picker), and which button column to fire if the table has one. Persist all of this.

Main view is the queue. Read pending requests with Coda List Table Rows, filtering on the mapped status column. Show a compact table with requester, team, amount, vendor, category and waiting time. Let the approver sort by amount or by how long the request has been waiting, and filter by team and category. A header strip shows the pending count, the total amount pending, and a prominent count of requests aging past the service level. Flag those aging rows visually in the list too.

Selecting a request opens a detail panel. Fetch it with Coda Get Row so the detail is fresh: requester, amount, vendor, category, business justification, and any linked doc rendered as a clickable link. Next to the detail, show budget context for that requester's team: read this month's approved rows with List Table Rows and display the running total already approved for that team this month plus the number of approved requests, so the approver sees the budget picture at the moment of decision.

Approve and reject. Approve writes back with Coda Update Row, stamping the decision value, the approver name and a decision timestamp. Reject writes the same fields plus a rejection reason, and the reject button stays disabled until a reason has been entered. Coda writes are asynchronous and return a request id, so after every Update Row poll Coda Get Mutation Status until the write is confirmed, and only then clear the request from the queue and mark it decided. Never remove a row optimistically before confirmation, otherwise two approvers can double approve the same request. Show an in flight state on the row while the write is pending, and surface a clear error if a mutation never confirms.

Where the table already has a button column driving a downstream Coda automation, fire it with Coda Push Button once the decision write is confirmed, so the doc's existing routing keeps working instead of being replaced. Only offer this when List Columns shows a button column exists.

Notifications after a confirmed decision. Email the requester with Gmail Send a Message: the outcome, the key request details, and the rejection reason when rejected. For approvals at or above the configured threshold, post to the finance channel with Slack Bot Send a Message including requester, team, amount, vendor, category and approver. If a notification fails, show that on the request rather than failing the decision, since the decision is already saved in Coda.

Bulk approve: one action that approves every pending request under the configurable small amount. Show a confirmation listing exactly which requests will be approved and the combined total before anything is written. Coda allows roughly ten writes every six seconds, so batch and pace the updates, poll mutation status for each one, show a progress indicator, and report per request success or failure at the end. Only clear confirmed rows and leave anything that failed sitting in the queue.

Details: the approver name defaults to the signed in user and is editable in settings. Remember each user's last used sort and filter. Refresh the queue after any decision and offer a manual refresh. Show a friendly empty state when the queue is clear. Back off and retry on Coda rate limit responses instead of erroring the whole screen.

## How to customize

- Change the service level from two days to whatever turnaround your team promises requesters
- Set the amount above which approvals get announced in Slack, and the cap for bulk approving small requests
- Point it at a different table or rename your columns at any time, since the app reads how the table is actually built and adapts the field mapping

## FAQ

### Will this change how my Coda doc works?

No. It reads and writes the same table your team already submits into. If your table has a button that kicks off your own Coda automation, the app presses that button after a decision so your existing routing keeps working exactly as before.

### Can two approvers accidentally approve the same request?

The app waits for Coda to confirm each decision before clearing the request from the queue, so a request only stops showing as pending once the decision is genuinely saved.

### Do rejections have to include a reason?

Yes. The reject button stays disabled until a reason is typed. The reason is saved on the row and included in the email the requester receives.

### Is bulk approving hundreds of small requests safe?

Yes. Coda limits how quickly rows can be updated, so the app paces the writes, shows progress as it goes, and tells you afterwards if any request did not go through so nothing is silently missed.

### Does the requester need access to the doc to see the outcome?

No. Every decision emails the requester the outcome and the reason, so people who never open the doc still know where their request landed.

Use this prompt in General Input: https://www.generalinput.com/prompts/spend-request-approval-console-for-your-coda-intake-table