# Aggregation, anchors, ceilings, and accrual

**For:** Manager | Admin
**You'll need:** A policy where you've already chosen a tracking mode — see {doc}`tracking-modes`.

A balance policy needs to answer four questions: over what window does the entitlement reset, when does service-year math start, how big is the entitlement (and does it grow with service), and how do hours land in the balance. Here's what each setting does.

## What it means

### Aggregation scope

The window over which the entitlement is granted and the balance lives. Most companies use the **company period** (calendar, rolling, or fiscal year — set under **Settings → Leave**). Some use a **rolling 12 months from the anchor** so the balance resets on each person's work-anniversary instead of on Jan 1.

### Service-year anchor

The reference date {{ app_name }} uses to compute "years of service" for tier matching and rolling windows. Options are:

- **'Hire date'** — the day the person started.
- **'Employment-type start'** — the day they joined their current employment type.
- **'Custom'** — a date you set per person on the membership.

Which one you pick matters most for tiered policies, because the tier ladder is matched against this number. A senior who switched employment types last week shouldn't drop to entitlement tier 1 — usually you want **'Hire date'**.

### Ceiling mode — flat vs. tiered

**Flat** — every person on this policy gets the same entitlement, set in **'Flat-ceiling weeks'**. Five weeks for everyone.

**Tiered** — entitlement steps up at service-year thresholds (`min_service_years`). Add the rungs of the ladder under {doc}`manage-tiers`. A common setup: 4 weeks for years 0–4, 5 weeks from year 5, 6 weeks from year 20.

### Deduction method — fixed vs. average

When a request is approved, how many hours come off the balance per booked day?

- **Fixed** — a constant value per day (typically the contracted day-length).
- **Average** — the rolling average of the person's worked hours over a recent window. Use this for variable-hour staff so part-timers don't burn full-day entitlements on a half-day shift.

### Accrual method — none, monthly, or hourly

How does the balance grow during the period?

- **None** — full entitlement is granted up front when the period starts (prorated by service date for new joiners).
- **Monthly** — `1/12` of the entitlement on the first of each month.
- **Hourly** — entitlement accrues per worked hour, posted when timesheet rows are submitted.

Monthly accrual fires from a daily background task; hourly accrual fires the moment a time entry is submitted. Either way, the row shows up in the {doc}`/manage-leave/leave-transactions/view-the-leave-ledger` as an `ACCRUAL` transaction.

### Entitlement and max balance

**'Entitlement'** is the per-period grant (in hours or weeks, depending on the field). **'Max balance'** is the ceiling the running balance cannot exceed — accruals that would push it over are silently capped. Set max balance higher than entitlement if you want to allow some overflow from carry-over, or equal if you want a hard cap.

## How it shows in the app

On the policy form, these fields appear under sub-headings as you fill out the basics. The detail page lays them out read-only with the tier ladder if the policy is tiered.

In the ledger, you'll see the effects: `GRANT` rows when a period starts, `ACCRUAL` rows on the schedule above, `BOOKING` rows on approval, `CARRY_OVER` rows at period close.

## Related

- {doc}`tracking-modes`
- {doc}`carry-over`
- {doc}`manage-tiers`
- {doc}`/manage-leave/leave-transactions/view-the-leave-ledger`
- {doc}`/set-up-your-company/company-periods/index`
