Schedule recurring reports

POST /api/v1/report-schedules. Setup: template + cadence (daily/weekly/monthly) + delivery time + recipients. Cron auto-emails.

Written By Salvatore Sinigaglia

Last updated About 5 hours ago

POST /api/v1/report-schedules. Setup: template + cadence (daily/weekly/monthly) + delivery time + recipients. Cron auto-emails.

Schedule recurring reports

Auto-generate reports on a schedule. POST /api/v1/report-schedules (verified). Current API supports daily / weekly / monthly cadence, a whole hour_utc, optional template, format and recipients. Remove custom cron, minute precision, BCC, and workspace-timezone claims unless the backend route/service adds them.

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:

CadenceWhen fires
DailyEvery day at delivery time
WeeklyEvery Monday (default) at delivery time
MonthlyFirst of month (default) at delivery time
CustomNot supported by the current API

Step 5: Delivery time

Pick a whole UTC hour (hour_utc) in the current API.

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)

BCC is not part of the current route contract.

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
  • hour_utc: whole UTC hour
  • recipients: array of email
  • status: active / paused

GET / PUT / DELETE for management.

How the cron works

Wevion runs a dispatcher from apps/backend/src/server.ts that checks scheduled reports periodically (currently every 5 minutes):

  • 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 the run against the schedule (last/next run timestamps update)

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

Custom cron expressions are not supported by the current API.

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: dispatcher-level periodic check; schedule input is a whole UTC hour, not arbitrary minutes/seconds

RBAC + audit

Verify RBAC against apps/backend/src/routes/api/report-schedules.route.ts before documenting role-specific create/delete permissions. The route is authenticated and scoped to the current session; do not infer Manager-delete-others behavior without a route guard.

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 the configured frequency / hour_utc is invalid for the current API.
  • "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": current scheduling uses UTC hour; convert from local time before saving until product/UI adds timezone-aware scheduling.
  • "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: send to an internal recipient 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

Report schedules use the current backend cron infrastructure in apps/backend/src/server.ts and advisory locking through apps/backend/src/lib/cron-lock.ts. Inspect those files for the current job list before changing schedule behavior.

FAQ

What cadences do Wevion scheduled reports support?

Wevion's current API supports daily, weekly, and monthly cadences for scheduled reports. Daily fires every day at the delivery time, weekly defaults to Monday, and monthly defaults to the first of the month. Custom cron expressions are not supported by the current API.

What endpoint creates a scheduled report in Wevion?

Wevion scheduled reports are created via the POST /api/v1/report-schedules endpoint. The schedule object includes template_id, cadence (daily, weekly, or monthly), hour_utc, a recipients array of emails, and a status of active or paused. GET, PUT, and DELETE are available for management.

Can I set an exact minute for a Wevion scheduled report?

No. In the current Wevion API you pick a whole UTC hour (hour_utc), not arbitrary minutes or seconds. A dispatcher in the backend checks scheduled reports periodically (currently every 5 minutes) and fires when due, so convert your local time to UTC before saving the schedule.

How do I test a Wevion report schedule before relying on it?

Use the Send now action on the schedule row to trigger a manual fire and confirm the email reaches recipients with correct content. Wevion also recommends sending new schedules to an internal recipient first, then adding external recipients once you have verified the output is clean.

Why isn't my Wevion schedule firing?

The most common cause is that the schedule status is set to Paused, so check it and click Resume. It can also happen when the configured frequency or hour_utc is invalid for the current API. If recipients are not receiving emails, whitelist noreply@wevion.ai and verify the addresses.