Daily AI voice collections calls on overdue QuickBooks invoices

By General Input

Every weekday at 9am, an AI voice agent calls customers with past due QuickBooks invoices, captures who will pay and who is disputing, and drops a bucketed digest in Slack.

Integrations

  • QuickBooks Online
  • Bland AI
  • Slack Bot

Type

Agentic Task

Categories

  • Finance
  • Operations

Build me an agent workflow that runs every business day (Monday through Friday) at 9am in my local timezone and works my overdue accounts receivable using AI voice calls. Trigger type is cron.

Step 1: Pull the AR aging list from QuickBooks Online. Use Query Entities against Invoice with a WHERE clause of Balance > '0' AND DueDate < today (SQL-like syntax, no OR conjunctions, page through results in chunks of up to 1000). For each overdue invoice, capture Id, DocNumber, TotalAmt, Balance, DueDate, and CustomerRef.

Step 2: For each unique customer with an overdue invoice, call Read Customer in QuickBooks to get PrimaryPhone (or Mobile) and DisplayName. Sum that customer's total outstanding Balance across all their overdue invoices so we know their aggregate exposure. Skip any customer that has no phone number on file and add them to a 'needs manual outreach' list for the digest.

Step 3: Rank customers by (days overdue on their oldest open invoice) then (total outstanding balance), both descending. Apply two configurable thresholds that default to: minimum balance $250 and minimum days late 7. Anyone below either threshold is skipped from calling but still counted in the digest totals.

Step 4: Compliance guard. Before dialing anyone, call Bland AI's List Calls filtered to that phone_number and the last 7 days. If any call exists, skip this customer for today and note them as 'in cooldown' in the digest. Default cooldown = 7 days, configurable.

Step 5: For every remaining customer, dispatch a Bland AI Send Call with record: true and a task prompt that (a) opens politely by name, (b) explains you are calling from {my company} about outstanding invoice {DocNumber} for {Balance} that was due {DueDate}, {days_late} days ago, (c) asks when payment can be expected or whether there is a dispute, (d) offers to send a link or transfer to a human, and (e) is explicitly instructed to stay courteous, never threaten, and end the call immediately if the person asks to stop or says this is a bad time. Phone numbers must be in E.164 format. Space dispatches at least 10 seconds apart per number (Bland's same-number cooldown).

Step 6: After each call completes, run Bland AI Analyze Call on the call_id with a fixed set of 4 questions (Analyze Call is billed per question, so keep it tight): (1) 'Did the customer commit to a specific payment date? If so, what date?', (2) 'Did the customer dispute the charge or say they already paid?', (3) 'Did the customer request a callback or ask us to talk to someone else at the company?', (4) 'Was the call unreachable, voicemail, or wrong number?'.

Step 7: Combine every call's structured answers into a single Slack digest via Slack Bot Send a Message to a configurable channel (default #collections). Group customers into four buckets: 'Committed to pay' (with the promised date next to each), 'Disputes / said already paid' (needs human today), 'Needs human follow up' (voicemail, wrong number, requested callback), and 'Skipped this run' (below threshold or in 7-day cooldown, plus anyone without a phone). Include totals per bucket in dollars, a headline number for total AR called on today, and link each row back to the QuickBooks invoice.

Config the workflow should expose: run time and timezone, minimum balance threshold ($), minimum days late threshold, cooldown window in days, Slack channel, company name and callback number to inject into the call script, and an optional cap on max customers called per run so the first live day is bounded.

Please pick sensible defaults, log every call_id and outcome for auditing, and fail gracefully (partial results still get posted to Slack) if any single customer errors out.

Related prompts

Explore more prompts
A brand asset library your marketing team actually searchesTurn Mailjet email clicks into ranked HubSpot follow-upsClean out the Looker dashboards and Looks nobody opensLiveKit live operations console for room moderationWake up dormant Keap leads with a researched reasonLiveChat coverage board for planning next week's shiftsPhone routing control panel for LiveKit voice agentsLinkedIn Ads budget pacing dashboard for every client accountGive your team Looker numbers without buying more seatsPause marketing emails to escalated customers, then restore them