Schedule recurring reports

Last updated: May 19, 2026

Schedule recurring reports

Auto-generate + email reports on a schedule. POST /api/v1/report-schedules (verified). Setup: pick report template + cadence (daily / weekly / monthly) + delivery time (workspace TZ) + recipients (email list). Cron runs at scheduled time, generates report, emails recipients.

Who is this for

Agencies sending recurring client reports without manual export every week. Anyone doing repetitive report generation that could be automated.

How to schedule

Step 1: Open Reports → Schedules

Reports section → Schedules tab.

Step 2: New schedule

Click New schedule. Form opens.

Step 3: Pick report template

Required. Without template, no schedule (templates define what gets reported).

Templates contain:

  • Level (campaign / ad set / ad)

  • Date range pattern (e.g. "Last 7 days" — calculated at runtime)

  • Filters

  • Columns

  • Format (CSV or PDF)

  • Branding

See am-117 templates.

Step 4: Pick cadence

Options:

Cadence

When fires

Daily

Every day at delivery time

Weekly

Every Monday (default) at delivery time

Monthly

First of month (default) at delivery time

Custom

Cron expression for advanced timing

Step 5: Delivery time

Pick hour:minute in workspace timezone (verified setting per team-106 Workspace Defaults).

Common defaults:

  • Daily: 09:00 (post-morning sync)

  • Weekly Monday: 09:00 (start of week)

  • Monthly first: 10:00 (after weekend / month boundary)

Step 6: Recipients

Email list (comma-separated or one per row):

  • Workspace members (auto-picker)

  • External emails (clients, stakeholders)

  • Distribution lists (group email)

Optionally: BCC for internal archive.

Step 7: Save schedule

Click Save. POST /api/v1/report-schedules creates the schedule.

Status: Active by default. Toggle to Pause if needed.

Step 8: First scheduled fire

Schedule fires at next configured time. Report generated + email sent.

Endpoint

POST /api/v1/report-schedules (verified apps/backend/src/routes/api/report-schedules.route.ts).

Schedule object:

  • template_id: which report template

  • cadence: daily / weekly / monthly / custom

  • delivery_time: HH:MM

  • recipients: array of email

  • status: active / paused

GET / PUT / DELETE for management.

How the cron works

Wevion runs a cron worker that checks scheduled reports every minute:

  • Reads scheduled time + last fired time

  • Fires if due

  • Generates report (CSV or PDF based on template)

  • Sends email with attachment OR download link

  • Records audit log entry: action: scheduled_report_fired

If a fire fails: retry with backoff; failed status visible in Schedules tab.

Per-cadence delivery

Daily

  • Fires daily at delivery time

  • Report typically covers "Last 24 hours" or "Yesterday" depending on template

  • Good for: daily ops check-ins, monitoring spend

Weekly

  • Fires once per week at delivery time on configured day

  • Default: Monday 09:00

  • Report typically covers "Last 7 days" or "Last week"

  • Good for: weekly team review, client weekly digest

Monthly

  • Fires once per month at delivery time on configured day

  • Default: 1st of month at 09:00

  • Report typically covers "Last month" full

  • Good for: monthly executive review, client monthly invoice + report

Custom

  • Cron expression (e.g. 0 9 * * 1,4 = 09:00 every Monday + Thursday)

  • For complex patterns

  • Validate via Wevion's cron validator before save

Manage schedules

Schedules tab shows all configured schedules:

  • Per schedule: name, cadence, recipients, next fire time, last fire time, status

  • Actions per row: Edit, Pause, Resume, Delete, Send now (manual trigger)

Pause and resume

Pause schedule to stop firing (e.g. during holidays). Resume to restart.

Paused doesn't lose history; just doesn't fire while paused.

Delivery via email

Email contains:

  • Subject: typically "Wevion Report — [Period] — [Workspace Name]"

  • Body: brief summary + key metrics

  • Attachment: PDF or CSV (under 10 MB)

  • Or download link: for larger reports

Recipients can:

  • Read email + key metrics

  • Download attachment for full detail

  • Click link to view in Wevion (if member)

Custom recipients per schedule

For a single template, multiple schedules with different recipients:

  • Same template "Monthly Client Report" can have:

    • Schedule A: recipients = Client A team

    • Schedule B: recipients = Client B team

  • Per-client customization via template variables (covered in am-117)

Limits

  • Max schedules per workspace: 100 (typical; check plan)

  • Max recipients per schedule: 20 (large distribution lists better via email group)

  • Cron precision: minute-level (not seconds)

RBAC + audit

Mediabuyer+ to create schedules. Manager+ to delete others' schedules.

Audit log: action: scheduled_report_create / _update / _delete / _fired.

What you'll see

In Schedules tab:

  • List of all schedules with status + next fire

  • Per-row actions

  • Per-row "Send now" for manual trigger

In recipient's inbox:

  • Email with subject "Wevion Report — ..."

  • Attached PDF/CSV (or link)

  • Sender: Wevion's noreply email

Common issues

  • "Schedule not firing": status = Paused. Check + Resume. Or cron expression invalid.

  • "Recipients not getting email": spam filter; whitelist noreply@wevion.ai. Or wrong email address.

  • "Report empty in email": no data for the period (e.g. brand new workspace, schedule fires next week before data accumulates).

  • "Email arrived but wrong time": timezone mismatch — check workspace TZ.

  • "Schedule fires but no recipients see it": verify recipient list; email may be silently dropped.

Best practices

Test schedule with manual fire

After creating: use Send now to verify email reaches recipients + content correct. Then trust the schedule.

Send to internal first

For new schedules: BCC yourself / internal team first. Once verified clean, add external recipients.

Pause during holidays

Pause schedules during Dec 24-Jan 2 (or your team's closure) to avoid empty/awkward reports.

Annual review of schedules

Yearly: audit all schedules. Remove obsolete. Verify recipients still relevant.

Cross-cluster: cron architecture

Per CLAUDE.md, Wevion has 15 cron jobs in server.ts. Report schedules use cron infrastructure with pg_try_advisory_lock() for cluster-safety.

Related