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 templatecadence: daily / weekly / monthly / customdelivery_time: HH:MMrecipients: array of emailstatus: 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
Export PDF — PDF is common scheduled format
Export CSV — CSV alternative
Customize notifications — separate from scheduled reports but related