Skip to content

Reminders & follow-up

What chases an unpaid invoice, when it fires, and what you have to do yourself.

An invoice that was opened for payment and then forgotten is the normal case, not the exception. Wajub can chase it for you on a schedule fixed in code, with no per-invoice policy and nothing to configure. What matters most is knowing when that machinery is armed, because for a lot of integrations it never is.

When the schedule is armed

At the first send from the Dashboard, and only then. Three conditions all have to hold, and missing any one of them means that invoice has no reminders, permanently.

ConditionIf it fails
The send happens in the DashboardNothing is scheduled
The invoice is leaving draftA resend schedules nothing, the original run stands
The invoice carries a due_dateNothing is scheduled, there is no date to count from

The reminders are written out in one go at that moment, each with its own slot, its recipient and its wording. The customer's email is copied in at the same time, so a later correction on the customer record does not reach reminders already queued.

The schedule

Four reminders, all by email, all at 09:00, all counted from the due date.

ReminderSlotType
Due todaydue_date at 09:00upcoming
Three days latedue_date + 3overdue
A week latedue_date + 7overdue
Two weeks latedue_date + 14final

A queue runs every hour and sends whatever slot has come due, so a reminder leaves within the hour of its slot rather than at 09:00 exactly. After the fourth, nothing more is sent: there is no escalation beyond two weeks.

What stops the chase

Two things, and no others.

A paid invoice stops it. The sender re-reads the invoice before each send and cancels the reminder if the total has been settled, so the queue drains itself as soon as the money lands.

Cancelling the invoice stops it. Cancelling clears every pending reminder along with the document.

A partially paid invoice keeps being chased, which is the intent, since something is still owed. And a reminder that fails to send is not retried: a retry routine exists with a budget of three attempts, but nothing runs it, so a bounced address is the end of that reminder.

Following up from your own code

If you issue invoices through the API you have two signals to build on, and they behave differently.

The first is the list, filtered on what is outstanding.

curl "https://api.wajub.com/invoices?status=overdue&payment_status=unpaid" \
  -H "Authorization: sk.kZ3qP8mWvL2xR7tB5nY4hC6dF9jS1aG0eU3i…"

payment_status takes unpaid, partially_paid or fully_paid, and narrows on what has actually been received rather than on the status label. due_date_from and due_date_to bracket the window when you want this week's late invoices rather than all of them.

The overdue label lags by up to a day

Nothing flips an invoice to overdue at midnight. A job does it once a night at 01:00, so an invoice that fell due this morning still reads sent until tomorrow. If you need the distinction on the day, compare due_date against today yourself rather than filtering on the status.

The second signal is the webhook, with one gap worth planning around.

invoice.updatedevent
Fires on changes made through the API, on the first view, and on a payment. Read `data.status`.
Payload
{
"id": "evt_aio5DpN577tNU2vOxdmuZGhT",
"event": "invoice.updated",
"livemode": true,
"created": "2026-09-25T09:12:44+00:00",
"api_version": "2026-09-01",
"pending_webhooks": 1,
"request": {
"id": null,
"idempotency_key": null
},
"data": {
"id": "inv_LRQqYvlhrgUOE225KMKU",
"invoice_number": "INV-202609-0001",
"status": "partial",
"currency": "XAF",
"total": 450000,
"amount_paid": 150000,
"amount_due": 300000,
"due_date": "2026-09-25"
}
}

The gap is overdue itself. The nightly job writes that status in bulk, which skips the event machinery, so no webhook is emitted when an invoice goes late. Overdue is something you notice by asking, not something you are told.

So the pattern that works: hold your own list of open invoices, check it on your own schedule, and send your own reminder over the channel that customer actually reads. The message needs the payment URL, which you rebuild from the invoice id.

What to put in your reminder
https://invoice.wajub.com/inv_LRQqYvlhrgUOE225KMKU

What did you think of this content?