Export reports to CSV

/reports → pick level + date + columns → Export CSV. GET /api/v1/reports endpoint. Async for large date ranges (email when ready).

Written By Salvatore Sinigaglia

Last updated About 5 hours ago

/reports → pick level + date + columns → Export CSV. GET /api/v1/reports endpoint. Async for large date ranges (email when ready).

Export reports to CSV

/reports page → choose date range, columns → click Export → CSV. The file export is backed by POST /api/v1/reports/pdf with format: 'csv' (the same endpoint that produces the PDF). It returns a worker_run_id; poll GET /api/v1/reports/:id/pdf-url until COMPLETED, then download from the in-app Download Center (GET /api/v1/reports/exports) — not by email. Exports aggregate at campaign level (group_by: 'campaign'). UTF-8 encoded. Use cases: external BI, accounting reconciliation, client deliverables.

Who is this for

Mediabuyers exporting data for external analysis. Finance teams reconciling spend. Anyone who needs ads data in their own BI tool / spreadsheet / external report.

How to export

Step 1: Open Reports

Sidebar → Reports OR /reports. The page shows the report builder.

Step 2: Note on aggregation level

The report file export aggregates at campaign level (group_by: 'campaign'). There is no ad-set or ad-level file export — ad-set/ad detail is available in the live Ads Manager table (via POST /api/v1/reports/adsets / .../ads) but not as a CSV/PDF export.

Step 3: Pick date range

Same range options as Ads Manager:

  • Today, Yesterday, Last 7 days, Last 30 days, This month, Last month, Custom

Custom range for arbitrary windows.

Step 4: Pick filters (optional)

Same filter options as Ads Manager: ad account, platform, status, metric thresholds.

Step 5: Pick columns

Default columns: standard metrics (spend, impressions, clicks, CTR, conversions, ROAS, CPA).

Customize:

  • Show/hide: tick / untick columns
  • Add custom columns: derived metrics if available
  • Order: drag to reorder (export respects order)

Step 6: Click Export → CSV

Top-right toolbar → Export → CSV. This enqueues an async job (POST /api/v1/reports/pdf with format: 'csv'):

  • Job queued, returns a worker_run_id
  • Poll GET /api/v1/reports/:id/pdf-url for status (RUNNINGCOMPLETED / FAILED)
  • When COMPLETED, download the signed URL from the Download Center (GET /api/v1/reports/exports)
  • There is no email delivery for ad-hoc exports

Step 7: Open the CSV

UTF-8 encoded. Headers: include all selected columns + dimensions.

Open in Excel, Google Sheets, BI tool, Python pandas, etc.

Endpoints

  • File export (CSV/PDF): POST /api/v1/reports/pdf with format: 'csv' (verified apps/backend/src/routes/api/report-pdf.route.ts). Body includes date range, filters, columns, and group_by: 'campaign'. Returns a worker_run_id.
  • Poll status / get download URL: GET /api/v1/reports/:id/pdf-url (RUNNING / COMPLETED / FAILED; signed URL ~7 days when complete).
  • Download Center history: GET /api/v1/reports/exports.
  • Retry a failed export: POST /api/v1/reports/:id/retry.

(The live Ads Manager table is served by POST /api/v1/reports/campaigns|adsets|ads and GET /api/v1/reports — those power the on-screen grid, not the CSV/PDF file export.)

File format

Standard CSV:

  • UTF-8 encoding
  • Comma-separated
  • Quoted strings for fields containing commas
  • Header row first
  • One row per entity per date (or aggregated)

Example header:

date,campaign_name,campaign_id,platform,spend,impressions,clicks,ctr,conversions,roas,cpa

Aggregation level

  • Per-day: one row per entity per day (long format; good for time series)
  • Aggregated: one row per entity (totals over date range)

Choose per use case:

  • BI tools: per-day for time-series visualization
  • Client reports: aggregated for top-line summary
  • Reconciliation: aggregated for spend totals

Per-platform vs cross-platform

OptionOutput
Single platform (filter to one)Per-platform-native metrics; native currency
Cross-platform (no platform filter)Workspace currency rollup; cross-platform aggregation

Custom dimensions

Beyond standard metrics, some reports support:

  • By placement (Meta Stories vs Feed vs Reels breakdown)
  • By device (mobile / desktop / tablet)
  • By geo (per-country)
  • By age range / gender (demographic breakdown)

Available per platform (Meta has richest, others variable).

Async export workflow

All file exports run async:

  1. Click Export → CSV
  2. A job is enqueued (POST /api/v1/reports/pdf, format: 'csv'), returning a worker_run_id
  3. SQS worker generates the CSV
  4. Poll GET /api/v1/reports/:id/pdf-url; when COMPLETED, a signed download URL (~7 days) is returned
  5. Download it from the Download Center (GET /api/v1/reports/exports), which persists your recent exports across refreshes

There is no email delivery for ad-hoc exports (only scheduled reports can email recipients — see am-118).

Limits

  • Max date range: typically 12 months (longer requires manual support)
  • Max rows per export: 1M typical; larger may need chunking
  • Export frequency: rate-limited (e.g. 10/day per user) to prevent abuse
  • File size: typically < 100 MB; very large reports compressed or chunked

Performance considerations

  • Small (< 10K rows): instant
  • Medium (10-100K rows): 30 sec - 2 min sync
  • Large (100K+ rows): async (1-10 min)
  • Very large (1M+ rows): may chunk into multiple files

Best practices

Save report templates

For recurring exports: save the config as a report template.

Match date range to use case

  • Quick check: Last 7 days
  • Monthly client report: Last month + Compare to previous
  • Annual review: full year aggregated

Pick the right level

  • Strategic review: campaign-level aggregates
  • Tactical optimization: ad set-level
  • Creative testing: ad-level

Export consistent dimensions

When comparing across periods: export with same dimensions every time. Otherwise comparisons break.

RBAC + audit

Mediabuyer+ to export.

What you'll see

After Export CSV:

  • A job is enqueued and the UI polls for completion
  • The finished file appears in the Download Center (persists across refreshes; signed URL valid ~7 days)

Common issues

  • "Export hung > 30 min": very large dataset. Split into smaller date ranges + concatenate.
  • "CSV missing some campaigns I see in Ads Manager": filter mismatch. Check report filters match what's in Ads Manager.
  • "CSV has different totals than dashboard": timezone difference between report TZ and dashboard TZ. Or one includes archived, other doesn't.
  • "Special chars in CSV broken": ensure UTF-8 import in your tool (Excel often defaults to wrong encoding).
  • "Where's my finished export?": ad-hoc exports are delivered in-app, not by email — open the Download Center (GET /api/v1/reports/exports) to find it.

FAQ

How do I export ads data to CSV in Wevion?

Open the Wevion Reports page at /reports, pick a date range, optionally set filters, select your columns, then click Export → CSV in the top-right toolbar. The export runs asynchronously (campaign-level) and, when finished, appears in the in-app Download Center — there is no email delivery for ad-hoc exports.

What endpoint powers Wevion CSV exports?

The CSV/PDF file export is backed by POST /api/v1/reports/pdf with format: 'csv'. It returns a worker_run_id; you poll GET /api/v1/reports/:id/pdf-url for status and the signed download URL, and the Download Center history lives at GET /api/v1/reports/exports. (The on-screen Ads Manager table is served by separate POST /api/v1/reports/campaigns|adsets|ads endpoints.)

Why is my large CSV export in Wevion delayed?

All file exports in Wevion are generated asynchronously to handle big date ranges or high row counts. The job is queued, an SQS worker processes it, and you poll for status; when COMPLETED, download it from the Download Center (signed URL valid ~7 days). There is no email link for ad-hoc exports.

What encoding do Wevion CSV files use?

Wevion CSV files are UTF-8 encoded, comma-separated, with quoted strings for fields containing commas and a header row first. If special characters look broken, make sure your tool imports as UTF-8, since Excel often defaults to the wrong encoding.

Why does my Wevion CSV show different totals than the dashboard?

Differences usually come from a timezone mismatch between the report timezone and the dashboard timezone, or from one view including archived campaigns while the other does not. Check that your report filters match what you see in Ads Manager to reconcile the numbers.

Steps

  1. Sidebar → Reports OR /reports. The page shows the report builder.
  2. The report file export aggregates at campaign level (group_by: 'campaign'). There is no ad-set or ad-level file export — ad-set/ad detail is available in the live Ads Manager table (via POST /api/v1/reports/adsets / .../ads) but not as a CSV/PDF export.
  3. Same range options as Ads Manager: Today, Yesterday, Last 7 days, Last 30 days, This month, Last month, Custom Custom range for arbitrary windows.
  4. Same filter options as Ads Manager: ad account, platform, status, metric thresholds.
  5. Default columns: standard metrics (spend, impressions, clicks, CTR, conversions, ROAS, CPA). Customize: Show/hide: tick / untick columns Add custom columns: derived metrics if available Order: drag to reorder (export respects order)
  6. Top-right toolbar → Export → CSV. This enqueues an async job (POST /api/v1/reports/pdf with format: 'csv'): Job queued, returns a workerrunid Poll GET /api/v1/reports/:id/pdf-url for status (RUNNING → COMPLETED / FAILED) When COMPLETED, download the signed URL from the Download Center (GET /api/v1/reports/exports) There is no email delivery for ad-hoc exports
  7. UTF-8 encoded. Headers: include all selected columns + dimensions. Open in Excel, Google Sheets, BI tool, Python pandas, etc.

Last updated: 2026-05-17