Daily AR aging digest in Slack from Tabs
Every weekday at 9am ET, post a clean Slack digest of overdue Tabs invoices, grouped into aging buckets with totals and a callout when a customer's balance jumps.
Build me an agent workflow that posts a daily AR aging digest from Tabs to our #finance Slack channel.
Trigger: a cron schedule that fires every weekday (Monday through Friday) at 9:00am America/New_York.
On each run, the agent should:
1. Call Tabs List Invoices to fetch every invoice that is unpaid and past its due date. Use the filter query parameter to scope by status (anything not paid/void) and by due date in the past, and paginate until you have them all. For each invoice keep at minimum: invoice id, customer id, total amount, balance due, due date, status, and a link to the invoice in Tabs.
2. Resolve customer names (and account owner or primary contact if available) by calling Tabs Get Customer for each unique customer id, or by calling Tabs List Customers once and joining locally — pick whichever is cheaper given how many distinct customers show up. Cache results within the run so we do not refetch the same customer.
3. Compute days overdue as today minus the due date, and bucket each invoice into 1 to 30, 31 to 60, 61 to 90, or 90+ days overdue. For each bucket compute the total balance due and the number of distinct customers represented.
4. Compare each customer's current total overdue balance against the prior run's snapshot. Persist a small JSON state (customer id -> total overdue) between runs in workflow storage so we can diff. Flag any customer whose total overdue grew by a meaningful amount (default: more than $500 or more than 10%, whichever is larger) and call them out as 'balance jumped' in the digest.
5. Call Slack Send a Message (Slack Bot integration) to post one tidy digest to #finance. Use Slack mrkdwn formatting. The message should be in this shape:
• Header line: 'AR aging — <date>' and the total open overdue balance across all buckets.
• Bucket totals table at the top: 1–30, 31–60, 61–90, 90+ each with total $ and customer count.
• Top 10 largest overdue invoices, sorted by balance due descending. Each line: customer name, amount, days overdue, and a clickable link to the invoice.
• 'Balance jumped vs yesterday' section: one short line per flagged customer with the prior total, the new total, and the delta. Skip the section entirely if nothing jumped.
Keep it concise — this is a glance-and-act board, not a dump of every invoice. If there is nothing overdue, post a short all-clear message instead.
Inputs the user should set when installing the workflow: Slack channel (default #finance), schedule time and time zone, the bucket boundaries, the top-N count, the 'balance jumped' threshold ($ and %), and an optional minimum balance to include an invoice.
Use the Slack Bot integration (xoxb) for posting since this is automated team output, not a message from a specific person. Use Tabs with an API key.
Additional information
What does this prompt do?
- Pulls every unpaid and past-due invoice from your Tabs account each weekday morning.
- Buckets the open balance into 1 to 30, 31 to 60, 61 to 90, and 90+ days overdue, with totals and a customer count per bucket.
- Lists the ten largest overdue invoices with customer name, amount, days overdue, and a link straight to the invoice in Tabs.
- Flags any customer whose total overdue jumped versus yesterday's run so collections knows where to push first.
- Posts the whole thing as one tidy Slack message to your finance channel so the team can glance and act.
What do I need to use this?
- A Tabs account with API access (admin can create an API key in the Developers section).
- A Slack workspace and a channel for your finance team, such as #finance or #ar.
- An idea of which time zone and time of day you want the digest to land.
How can I customize it?
- Change the schedule. Run it daily, only on Mondays, or twice a day before stand-up and end of day.
- Swap the Slack channel, post to multiple channels, or DM your controller instead.
- Adjust the aging buckets (for example 0 to 15, 16 to 45, 46+) or change the top-N list from ten to the count that fits on one screen.
- Add a minimum balance threshold so tiny invoices do not crowd the digest.
- Tag specific account owners or customer-success leads when their accounts show up overdue.
Frequently asked questions
Will this work if I do not use Tabs as my main billing system?
Does it actually email or chase customers?
How does the customer balance jumped callout work?
Can it post to more than one Slack channel?
What if there are no overdue invoices on a given day?
Stop digging through Tabs to find what is overdue.
Connect Tabs and Slack once, and Geni delivers a clean AR aging board to your finance channel every weekday at 9am.