# Carry-over rules

**For:** Manager | Admin
**You'll need:** A balance-tracking policy.

When a leave year ends, leftover balance either rolls into the next year, expires, or some mix of both. Carry-over rules on the policy decide which.

## What it means

Three knobs control what happens at the leave-year boundary:

- **'Carry-over limit'** — the maximum hours that may roll forward. Anything above the limit is dropped. `0` means nothing carries over; leave it blank for "unlimited" (the full leftover balance carries). A **negative** balance (someone took more than they'd earned) always carries forward in full as debt — the new year's grant pays it down first.
- **'Expiry months'** — how long carried-over hours stay valid in the new period. After this many months, any unspent carry-over is wiped by a daily background task (`task_expire_carryovers`). Leave it blank for "no expiry".
- **'Carry-over priority'** — when a request is approved in the new period, do we draw from carry-over first (use-it-or-lose-it) or from the new entitlement first? Drawing from carry-over first is the friendlier default; it keeps the worker from losing hours to expiry.

## When to use which

| Pattern | Limit | Expiry | Why |
|---|---|---|---|
| No carry-over | `0` | — | Use-it-or-lose-it. Common for sick leave caps. |
| Limited carry-over with deadline | `40` | `3` months | Most common vacation pattern in CH/DE. |
| Unlimited carry-over | blank | blank | Generous; balance grows over years. Pair with a sensible **'Max balance'**. |
| Carry-over with expiry, no limit | blank | `6` months | Don't cap, but force usage by mid-year. |

## How it shows in the app

At the leave-year boundary, a nightly background task (`roll_leave_year`) reads each policy's carry-over rule and writes a signed `CARRY_OVER` row into the {doc}`/manage-leave/leave-transactions/view-the-leave-ledger` for every active person. The new leave year opens with that balance already in place, alongside its fresh `GRANT` row. You don't trigger this by hand — there's no period to close.

If the policy has an expiry window, {{ app_name }} also schedules an `EXPIRY` row to fire on the deadline. When that day arrives, the daily task posts a negative transaction for any carry-over hours still unused.

```{tip}
The carry-over is written once, when the leave year rolls over. If you change a policy's carry-over rule afterward, existing carry-overs aren't recomputed — only future rollovers pick up the new rule.
```

## Related

- {doc}`aggregation-and-anchors`
- {doc}`/manage-leave/leave-transactions/view-the-leave-ledger`
- {doc}`/settings-and-admin/company-settings/leave`
