next_generation is null when there is no next invoice
next_generation now carries only the date the system will honour, and null otherwise: a completed template, or a paused one whose date has passed.
next_generation used to show dates the system was never going to honour. The rule is now one line and does not enumerate statuses: it carries the date the system will honour, and null when there is none. It travels null — present in the JSON, never omitted.
It affects the three responses that publish the resource — detail, create and list — on the canonical route and on the flat alias.
What else changed
nullin exactly two cases: aCOMPLETEDtemplate, whose stored date is the one that ran past its end and triggered the closure; and aPAUSEDtemplate whose date is strictly in the past, because resuming reschedules from today and that date will never be invoiced.- An
ACTIVEtemplate always carries its date, including one already in the past. That is the occurrence the next run will generate, and it is your only notice that an invoice is on its way. The field's description no longer promises "never in the past", which was not true. - A
PAUSEDtemplate whose date is still ahead — today counts as ahead — carries it too: it is exactly the date resuming would keep. - The stored schedule is untouched.
next_generationis what gets published, not what gets kept: resuming, rescheduling and skipping are anchored where they always were.sort_by=next_generationstill sorts by the stored date, so a row that now travelsnullsorts where it always did. - What to do. Treat the field as optional.
nulldoes not mean "unknown": it means that template has no generation ahead of it — it is closed, or paused with its date behind it.
Endpoints
- GET/v1/companies/{company_id}/recurring-invoices/{recurring_invoice_id}next_generation is null when there is no generation ahead
- GET/v1/companies/{company_id}/recurring-invoicesSame rule on every row
Where to go next
The deprecated flat routes now retire on 9 December
The retirement date of the deprecated flat routes moves from 10 September to **2026-12-09**. Nothing stopped answering, and you have the whole window again.
Three response fields were never guaranteed
`amount`, `currency` and `sending_history.sent_at` leave `required`. No response changes — the contract was promising something the server never did.