On a schedule
Post a weekday overdue invoice report to Slack
Every weekday morning, Slack shows your overdue QuickBooks invoices and total receivables by how late they are.
- Runs
- On a schedule
- Apps
- QuickBooks, Slack
- AI
- Yes, uses the built-in AI allowance
- Access
- QBO read; Slack chat:write
Send this to your assistant
Create a ClickRuntime automation: each weekday at 9am, list overdue QuickBooks invoices, total what's owed in 1–30, 31–60 and 60+ day buckets, add a one-line comment, and post it to #finance.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
Receivables creep. A few invoices slip past 30 days, then 60, and by the time anyone opens the aged receivables report a big client owes three months of work. Owners know they should check every week; few do.
A short weekday report in Slack keeps overdue money in view. Grouping by age shows whether things are getting better or worse, and the list names the customers to call today.
What you get out of it
Overdue money stays visible
Seeing the totals every morning makes it hard for a growing balance to go unnoticed.
Know who to call
The biggest and oldest invoices are listed by customer, so chasing starts with what matters most.
Spot a trend
If the 60+ day bucket grows week on week, it's time to change payment terms or stop work for a client.
A plain-English read
A one-line AI comment highlights what changed, for people who don't read aging tables.
How it works
What happens, step by step
Each weekday at 9am, ClickRuntime asks QuickBooks for every unpaid invoice past its due date.
It groups the amounts by how many days late they are: 1–30, 31–60 and over 60.
AI adds a one-line comment on what stands out.
It posts the totals and the largest overdue customers to #finance in Slack.
Before it runs live
- Connect QuickBooks
- Connect Slack, then invite the app to the channel (type /invite @ClickRuntime there)
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Run it at a different time, more or less often, or only on weekdays
- Change what the AI looks for, or how it writes the result
- Add another app, for example also send it to Google Sheets
- Combine it with other QuickBooks and Slack steps into one automation
Under the hood
The code that runs this automation
from datetime import date
from clickruntime import on_trigger, credentials, http, notify, ai
API = "https://quickbooks.api.intuit.com/v3/company/1234567890" # your QuickBooks company id
def qb(method, path, **kw):
r = http.request(method, API + path, params={"minorversion": 73, **kw.pop("params", {})}, **kw, headers={"Accept": "application/json", "Authorization": "Bearer " + credentials.connection("quickbooks", "company")})
return r.raise_for_status() or r.json()
@on_trigger
def run(event):
today = date.today()
invoices = qb("GET", "/query", params={"query": f"select * from Invoice where Balance > '0' and DueDate < '{today}'"})["QueryResponse"].get("Invoice", [])
buckets = {"1–30": 0.0, "31–60": 0.0, "60+": 0.0}
for inv in invoices:
days = (today - date.fromisoformat(inv["DueDate"])).days
buckets["1–30" if days <= 30 else "31–60" if days <= 60 else "60+"] += inv["Balance"]
top = sorted(invoices, key=lambda i: -i["Balance"])[:5]
text = (f"Overdue: ${sum(buckets.values()):,.2f} across {len(invoices)} invoices\n"
+ " · ".join(f"{k} days ${v:,.0f}" for k, v in buckets.items()) + "\n"
+ "\n".join(f"• {i['CustomerRef']['name']} #{i['DocNumber']} ${i['Balance']:,.2f} (due {i['DueDate']})" for i in top))
try:
text += "\n" + ai.generate(f"In one sentence, what stands out in this receivables summary?\n{text}", max_output_tokens=60).text
except ai.AIError:
pass
notify.slack(text, channel="#finance")
return bucketsFAQ
Common questions
Does it include invoices that aren't due yet?
Which customers are listed?
Can it post to a private channel?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Approve supplier invoices in Slack before they become bills
Supplier invoices from your inbox are read and posted to Slack with Approve and Reject buttons, and approved ones become QuickBooks bills.
See how it worksPost every new QuickBooks invoice to Slack
Whenever an invoice is created in QuickBooks, your finance channel sees the customer, amount and due date within seconds.
See how it worksGet a daily news digest in Slack
Each morning your team gets a short summary of what's new on the sites and blogs you follow.
See how it worksKeep exploring
Set up “Post a weekday overdue invoice report to Slack” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.