Late fees and dunning
Dunning is the process of chasing overdue invoices. The Contractor Codex automates it. Clients get a reminder ladder of increasing urgency, and optionally a late fee once the invoice is far enough past due.
The reminder ladder
Every overdue invoice moves through four reminders, timed from the invoice's due date, not the day you sent it:
- 3 days past due — a friendly nudge.
- 7 days past due — a firmer reminder.
- 14 days past due — a stronger reminder.
- 30 days past due — final notice. This is also when a late fee can apply, if you have fees turned on.
The schedule is fixed at 3, 7, 14, and 30 days, and it is anchored to the invoice's real due date. A Net 14 invoice is not considered overdue until 14 days after you send it, and the first reminder lands 3 days after that. There is nothing to configure here. (An earlier version showed a "Reminder Days" field that did not actually drive anything, so it has been removed.)
Reminders run from a background job that checks every few hours. On each run it looks at every open invoice's due date and sends the next reminder in the ladder once a threshold is crossed.
Reminders stop the moment a client pays
As soon as Stripe reports an invoice paid, it drops out of the reminder pool. No reminder, heads-up, or late fee fires after payment, even if the client pays shortly after a reminder went out. Reminders also never duplicate. Each level sends once per invoice.
Get a heads-up before a reminder goes out
You can get a private heads-up in your own notification bell a few hours before each reminder reaches a client, so you have a chance to step in (for example, when the client already paid you offline). Turn it on under Settings → Payments → Invoice Defaults with Heads-up Before Reminders, and set how many hours of lead time you want. Because the background job runs every few hours, the heads-up arrives within that window rather than at an exact minute.
What clients see in each reminder
Each reminder is an email plus an in-portal notification:
- Email — branded with your business name, with the original Pay Now link, the amount due, and how many days past due the invoice is.
- In-portal notification — a red dot on their dashboard.
Late fees
Late fees are off by default. Turn them on per org in Settings → Payments:
- Auto-charge Late Fees — turns the feature on.
- Fee Type — flat (a one-time dollar amount) or percent (a share of the original invoice).
- Flat Fee — used for flat fees. Default is $25.00.
- Percent Fee — used for percent fees, set in basis points. Default is 500, which is 5%.
When the fee fires
A late fee is charged at the final notice stage, 30 days past the due date, when the org has fees enabled and the invoice is in scope. When it fires, the portal:
- Creates a separate Stripe invoice for the late fee amount.
- Sends the client an email with the fee invoice's Pay Now link.
- Stamps the original invoice so the same fee is never charged twice.
The fee is its own Stripe invoice, not a line on the original. That keeps accounting clean, and the client can pay the original separately from the fee.
Late fee opt-in date
The portal only applies late fees to invoices issued after you enabled the feature. Turning the feature on stamps the moment you did so, and any invoices created before that point are exempt forever. Your existing overdue invoices do not suddenly get late fees applied retroactively.
What clients see
The late fee invoice references the original in its description (for example, "Late fee for invoice INV-12345, 30 days overdue"). The client sees two separate invoices on their Pay page and can pay either or both.
The portal also surfaces the late fee on:
- The original invoice card in the client's Pay tab ("Late fee added: $25.00").
- The admin invoice detail page.
Voiding or writing off stuck invoices
There is no automatic void or write-off. When an invoice is never going to be paid, handle it from the invoice itself: void it to release the client entirely, or mark it uncollectible to keep it on the books as bad debt for accounting. (An earlier version showed "Auto Void After" and "Mark Uncollectible After" fields that were never wired up, so they have been removed.)
Pausing dunning for one client
If you have a payment plan worked out with a client and do not want reminders firing on their invoices, the cleanest path is to push out the invoice's due date in Stripe. The reminder schedule is anchored to the due date, so moving it forward delays or stops the reminders. There is no per-client "skip dunning" switch. If you need finer control, contact support.
Audit log
Every reminder and late fee is logged. Open a client's workspace and check History to see when each dunning email went out and which reminder level it was.
