Employee seat billing
The per-employee billing add-on — a dedicated monthly subscription whose seat count follows your active employees, with a paid seat covering the whole period.
Employees are billed through a per-seat add-on, not the plan's users limit —
an employee never counts against that limit. The add-on is a dedicated
monthly subscription (employee-seats), fully separate from your plan
subscription: its quantity tracks the number of active employees, and
contracting it activates the control_horario module. All endpoints live under
https://api.factuarea.com/v1 and use employees:read (status, preview) or
employees:write (subscribe, change quantity, cancel).
How seats are billed
A paid seat covers the whole billing period. The seat count follows your active roster automatically:
- Activating or hiring an employee whose seat is not covered charges a prorated seat for the rest of the period.
- Deactivating an employee releases the seat without a credit (the period is already paid) but keeps their coverage, so reactivating them within the same period is free.
- Each period renewal refreshes the coverage of the currently active employees.
The quantity is kept in sync with the real active count through employee events and an hourly reconciliation, so you rarely need to set it by hand.
For an enterprise account billed by contract (no Stripe subscription), the
add-on is granted for free: no charge, no payment method required, and the
control_horario module is enabled all the same. Cancelling withdraws the
module immediately.
Check the billing status
GET /v1/employee-seats returns the add-on status: whether the subscription is
active (subscribed), how many seats are billed (quantity), how many employees
are active, and the recurring per-seat cost including VAT. Amounts are in cents
(minor units) and are null — never a misleading 0 — when the cost is not
resolvable (not subscribed, no active plan, enterprise outside Stripe, sandbox).
curl https://api.factuarea.com/v1/employee-seats \
-H "Authorization: Bearer $FACTUAREA_API_KEY"Preview the charge
GET /v1/employee-seats/preview returns the prorated per-seat amount for
activating or hiring, computed from the Stripe upcoming invoice, without
charging. It never throws — it degrades to a neutral preview.
| Parameter | Notes |
|---|---|
count | Batch preview for N seats (≥1, up to 1000). |
employee_ids | Coverage-aware preview by UUID v7: employees still covered this period cost 0 (already_covered: true). |
amount is the taxable base in cents; requires_payment_method is true when no
payment method is on file.
curl -G https://api.factuarea.com/v1/employee-seats/preview \
-H "Authorization: Bearer $FACTUAREA_API_KEY" \
--data-urlencode "count=3"Subscribe to the add-on
POST /v1/employee-seats/subscribe opts in: it creates the monthly
employee-seats subscription with quantity set to your active employees and
charges the first period with the payment method on file. The charge is
atomic — if it does not go through, nothing is subscribed:
- No payment method →
402 employee_seat_payment_method_required; the error envelope carrieserror.details.payment_setup_urlto complete card setup. - A declined charge →
402 employee_seat_charge_failed.
curl -X POST https://api.factuarea.com/v1/employee-seats/subscribe \
-H "Authorization: Bearer $FACTUAREA_API_KEY"If subscribe returns 402 employee_seat_payment_method_required, send the user
to the payment_setup_url from the error, let them add a card, then retry.
Nothing is charged or subscribed until the first period succeeds.
Sync the quantity and cancel
POST /v1/employee-seats/change-quantity reconciles the billed seat count to the
real number of active employees (a SET with no proration and no invoice). It is
idempotent — a no-op when the quantity already matches.
POST /v1/employee-seats/cancel cancels the add-on at period end: the current
month is already paid, so subscribed stays true until the period ends, and the
per-employee coverage is then purged. The plan subscription is never touched.
curl -X POST https://api.factuarea.com/v1/employee-seats/cancel \
-H "Authorization: Bearer $FACTUAREA_API_KEY"See the schemas in the API Reference.
Typical flow
- Preview the charge for the seats you are about to activate.
- Subscribe to the add-on (first period charged atomically).
- Add or remove employees — the quantity auto-syncs; reconcile explicitly with change-quantity if needed.
- Read status to show seats billed and per-seat cost.
- Cancel at period end when you no longer need it.
Next steps
- Time tracking overview — the portal-only employee role and the whole system.
- Managed companies — per-seat billing for gestoría child companies.