Back to index The old problem An approval used to be forever. Somebody approved a recurring expense in 2023, and it kept posting in 2024, 2025, and 2026. Nobody re-looked at it. Nobody had to. The...
Last updated
An approval used to be forever. Somebody approved a recurring expense in 2023, and it kept posting in 2024, 2025, and 2026. Nobody re-looked at it. Nobody had to. The approval had no expiry date because approvals did not have dates at all.
That is a governance hole, and it is the one this feature closes.
When you approve a recurring contract, you are approving it for its term. Not forever.
There are two shapes.
The approval covers the term you set. When the end date passes, the approval expires.
If you approved a 12-month elevator contract running to June 30, 2027, that approval is good until June 30, 2027. On July 1, 2027 it is not.
There is no end date, so the approval renews on a 12-month clock from the day it was approved. Twelve months after the approval, it expires.
This is why the term selector says, right on the screen: "No end (open-ended): approval renews every 12 months." An open-ended commitment gets a fresh look once a year. That is not a bug, it is the point.
Three things, in this order.
Nothing posts on an expired approval. Not one more occurrence. The contract does not quietly keep running while somebody notices. It stops.
This is enforced in two independent places, deliberately, so that a failure in one of them cannot let money through. Even if the nightly expiry check does not run for some reason, the generation itself re-checks the approval before it posts anything.
On the Scheduled tab, the contract's row turns red and its badge reads Approval expired. The badge is clickable. Click it and the row expands in place to tell you exactly what happened:
Approval expired Jun 30, 2027
This contract was approved Jul 1, 2026 through this fixed term end date. Generation is paused: no new occurrences will post until the term is extended and re-approved.
with a facts grid showing the Frequency, the elapsed Term, and the Contract type, and a single button: Extend term.
For an open-ended contract, the copy is different, because the situation is different:
Approval expired Jul 1, 2027
This contract was approved Jul 1, 2026, and open-ended approvals renew every 12 months. Generation is paused: no new occurrences will post until it is re-approved.
with facts showing the Frequency, the Last approved date, and the Term (Open-ended), and one button: Re-submit for approval.
Note the row's own primary button is the shorter Extend term or Re-submit; the expanded notice carries the full Re-submit for approval label. Same action, same destination.
Everybody who manages expenses at that property gets an email.
Subject: Contract approval expired: <contract name>
The body tells you the contract, the amount and how often it recurs, and that occurrence generation is paused. It carries a facts table:
| Contract | Fixed, or Open-ended |
| Frequency | Monthly, Quarterly, and so on |
| Last approved date | The date the approval was stamped |
| Term ended | The date it lapsed, in red |
and one button. For a dated contract the button reads Review in Scheduled expenses. For an open-ended contract it reads Re-submit for approval, and it opens the renewal editor for you directly.
The footer says: "You are receiving this because you manage expenses for <property>."
Who gets it: everyone with permission to manage expenses at that property, who is also an active member of that property. If nobody holds that permission, it falls back to the property's admin ladder so the notice cannot land nowhere.
You get it exactly once. The email is not sent again for the same expiry. If the send fails, it retries: the system does not mark the notice as delivered until the email actually goes out. So you will not get a duplicate, and you will not get silence.
It means: no new occurrences will be created and nothing will post to the books.
It does not mean:
It also does not mean the contract is "paused" in the other sense. There are two different reasons a contract can be sitting still, and the Scheduled tab is careful to tell them apart:
| State | Badge | What it means | The fix |
|---|---|---|---|
| Paused | Amber, "Paused · 3 failed runs" | The generation kept failing (a bad GL account, a missing vendor). The approval underneath is still perfectly valid. | Fix the underlying problem, then press Resume. No re-approval. |
| Approval expired | Red, "Approval expired" | The approval itself lapsed. | Only a fresh approval restores generation. Resume does nothing here. |
Do not confuse them. Pressing Resume on an expired contract will not help, which is why the Resume button is not even offered on an expired row.
This is worth stating plainly.
A human extends the term or re-submits, and then the approval chain (and the board, if applicable) votes on it, exactly like the first time. See Renewing an expired contract.
The expiry itself is written to the audit trail, once per contract that expired. So is the delivery of the notice, and every subsequent re-arming of the approval, tagged with its reason (renewal, amendment, or contract-type change). If somebody asks "when did this approval lapse and who was told?", there is an answer.