---
id: UJ-025
title: Run recurring billing and bulk operations
actors: [OWNER, ADMIN, billing staff]
surface: app.zync.is/invoices and bulk action surfaces
goal: Process many consistent records safely while preserving per-record outcomes.
trigger: User schedules a recurring template or selects a bulk operation.
preconditions:
  - Permission, module/tier, source selection, and idempotency rules allow the operation.
success_state: Each item has a recorded success/failure/result; asynchronous job status is observable.
source_specs:
  - docs/specs/2026-05-31-recurring-invoices.md
  - docs/specs/2026-05-31-bulk-invoice-generation.md
  - docs/specs/2026-05-31-bulk-operations.md
  - docs/specs/2026-05-31-recurring-tasks-templates.md
---

## Happy path

1. User selects records/template, schedule, billing day, communication, and approval behavior → Zync validates scope and creates a job/schedule.
2. Scheduler/job generates each invoice/task → source records and generated records retain the template/job linkage.
3. User opens job status → sees pending, completed, failed, and retryable items; successful items continue through ordinary approval/send/payment flows.
4. User edits, pauses, or cancels future recurrence → already-created records remain governed by their own lifecycle.

## Alternate and failure paths

- One item invalid → isolate failure; do not silently roll back successful independent items unless the source spec requires atomicity.
- Duplicate run/retry → idempotency prevents duplicate documents/tasks.
- Schedule canceled → no future generation; history remains.

## Permissions and boundaries

- Bulk scope is filtered by the caller's read/write permissions.
- Async status is not proof of downstream delivery; inspect each item's durable result.

## Source specs

- `docs/specs/2026-05-31-recurring-invoices.md`
- `docs/specs/2026-05-31-bulk-invoice-generation.md`
- `docs/specs/2026-05-31-bulk-operations.md`
- `docs/specs/2026-05-31-recurring-tasks-templates.md`
