Skip to content

On a schedule

Send polite Gmail reminders for overdue QuickBooks invoices

Every weekday, customers with overdue QuickBooks invoices get a reminder from your Gmail address, firmer as the invoice ages, and you get a summary.

Runs
On a schedule
Apps
Gmail, QuickBooks
AI
Yes, uses the built-in AI allowance
Access
QBO read; Gmail send

Send this to your assistant

Create a ClickRuntime automation: each weekday at 9am, find QuickBooks invoices past due with a balance, send the customer a Gmail reminder with a tone that matches how late it is, at most once a week per invoice, and email me a summary.

Paste it into your assistant. It tells you what it will send or change before it runs live.

First time? Adding ClickRuntime to your assistant takes about two minutes.

Why use it

Why teams use this automation

Reminders from an accounting system feel automated and get ignored. A short personal email from the owner's address gets read and answered. But writing those emails by hand, every week, for every late customer, rarely happens.

Sending reminders from your own Gmail, worded to match how late the invoice is, gets the response rate of a personal email with none of the effort.

What you get out of it

  • Reminders that get answered

    An email from a real person's address gets more replies than a system notification.

  • The right tone at the right time

    A friendly nudge at a few days late, a firmer note at a month, chosen by how overdue the invoice is.

  • Replies land in your inbox

    Questions and payment promises come straight back to you.

  • Weekly, not daily

    Each invoice is chased at most once a week, so customers don't feel harassed.

How it works

What happens, step by step

  1. Each weekday at 9am, ClickRuntime asks QuickBooks for invoices with a balance that are past due.

  2. It skips invoices it reminded about in the last 7 days.

  3. AI writes a short reminder with a tone that matches how many days late the invoice is.

  4. The reminder is sent to the customer from your Gmail address.

  5. You get an email summary of everyone reminded.

Before it runs live

  • Connect Google through your own Google app (a one-time, 10-minute setup), so it works with your own Gmail
  • Connect QuickBooks

What you get

RunsOn a schedule
Send polite Gmail reminders for overdue QuickBooks invoicestoday, 9:00Succeeded
Email · RemindersSent 3 payment reminders: Acme Corp #1031: $1,200.00, 12 days; Northwind Ltd #1040: $640.00, 34 days

Build your own

Need it to work differently?

This template is a starting point. Copy the prompt and change it, or describe a different automation from scratch, with your own conditions, more apps or an AI step. Your assistant writes it, tests it and runs it on ClickRuntime.
  • 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 Slack
  • Combine it with other Gmail and QuickBooks steps into one automation

Under the hood

The code that runs this automation

This is the Python script that runs each time the automation starts. Your AI assistant writes it for you when you send the prompt, and you allow each step in your assistant. To change how the automation works, describe the change to your assistant and it updates the script for you. For every function it can use, see the script reference.
chase_overdue_quickbooks_invoices_by_gmail.pyexample
import base64
from datetime import date
from email.message import EmailMessage
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from clickruntime import on_trigger, credentials, http, state, 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", [])
    last = state.get("last") or {}
    gmail, sent = build("gmail", "v1", credentials=Credentials(credentials.connection("google", "work")), cache_discovery=False), []
    for inv in invoices:
        days = (today - date.fromisoformat(inv["DueDate"])).days
        if not inv.get("BillEmail") or (today - date.fromisoformat(last.get(inv["Id"], "2000-01-01"))).days < 7:
            continue
        tone = "friendly" if days < 14 else "neutral" if days < 30 else "firm but polite"
        facts = f"Invoice {inv['DocNumber']} for ${inv['Balance']:,.2f} was due {inv['DueDate']} ({days} days ago)."
        try:
            body = ai.generate(f"Write a short {tone} payment reminder email body to {inv['CustomerRef']['name']}. {facts}", max_output_tokens=200).text
        except ai.AIError:
            body = f"Hello,\n\nA quick reminder: {facts} Please let us know when we can expect payment.\n\nThanks"
        msg = EmailMessage()
        msg["To"], msg["Subject"] = inv["BillEmail"]["Address"], f"Reminder: invoice {inv['DocNumber']}"
        msg.set_content(body)
        gmail.users().messages().send(userId="me", body={"raw": base64.urlsafe_b64encode(msg.as_bytes()).decode()}).execute()
        last[inv["Id"]] = str(today)
        sent.append(f"{inv['CustomerRef']['name']} #{inv['DocNumber']}: ${inv['Balance']:,.2f}, {days} days")
    if sent:
        notify.email_me(f"Sent {len(sent)} payment reminders", "\n".join(sent))
    state.set("last", last)
    return {"reminded": len(sent)}

FAQ

Common questions

How is the tone chosen?
By days overdue. AI writes a short email in a friendly, neutral or firm tone depending on the age, using only the invoice number, amount and due date.
What if AI isn't available?
A fixed reminder is sent instead, so customers are still chased.
Which customers are skipped?
Anyone without an email address in QuickBooks, and invoices chased in the past seven days.
What permissions does it need?
QBO read; Gmail send. Nothing else in your accounts is used.
Does it need AI?
Yes. It uses ClickRuntime's built-in AI, so you don't need an OpenAI or Anthropic key. Every plan includes a monthly AI allowance.
How many runs does it use?
One run each time it runs (on a schedule). Checks that find nothing to do and stop right away aren't counted.
Can I change how it works?
Yes. Describe the change to your AI assistant, for example a different schedule, channel or filter. It updates the automation, tests it and tells you what changed.

Set up “Send polite Gmail reminders for overdue QuickBooks invoices” from your assistant

Copy the prompt above, or connect your assistant first. Free plan, no credit card.