Home/Help Center/Export results

Broadcasts

Export Broadcast Results as CSV

Download a campaign's full per-recipient delivery data as a streamed CSV, exact status, error code, timestamps and retry count, even for a campaign of 50,000 recipients.

By Chirag Darji · Updated 27 Aug 2026 · 7 min read

On this page
  1. Before you start
  2. Steps
  3. What you will see
  4. What is actually in the file?
  5. How does the export handle a very large campaign without failing?
  6. Settings and options
  7. How does the export's Status column relate to what you see in the app?
  8. Troubleshooting
  9. Why does the export include suppressed and pending rows, not just successful sends?
  10. Related reading
WhatsApp broadcast campaign report in VGraple CRM with delivered, read and replied stats per contact

Every broadcast can be exported as a CSV with one row per recipient, showing status, any Meta error code, send and reply timestamps, retry count and the reason for that status, streamed directly so a campaign of any size exports reliably. This article covers what is in the file, how to get it, and what it does not include.

Export results

  1. 1Open the campaign's detail page
  2. 2Click Export CSV in the action bar
  3. 3Let the file download
  4. 4Open it in a spreadsheet tool
  5. 5Re-export later if you need an updated
The steps on this page, in order.

Before you start

  • You need the "View broadcasts" permission, which most roles already have since it is a read action rather than a send or create action.
  • The export downloads directly from your browser as a .csv file; no separate export job or waiting period is needed.
  • Decide what you actually need the data for; the export is the raw per-recipient record, not a summary report, so pair it with the campaign detail page's stat tiles for a quick top-line view.

Steps

  1. Open the campaign's detail page. From Broadcasts, click into any campaign, whether it is still sending or already finished.

New broadcast composer in VGraple CRM: audience selection with segment, tag and CSV options and a live recipient count

  1. Click Export CSV in the action bar. It is always available, regardless of the campaign's current status.

  2. Let the file download. Your browser saves a .csv file named after the campaign; the download starts immediately as the server streams the data.

  3. Open it in a spreadsheet tool. Excel, Google Sheets or any CSV-compatible tool works. Sort or filter by the Status column to isolate delivered, failed, or suppressed recipients, or by Error code to group failures by their specific cause.

  4. Re-export later if you need an updated snapshot. Running Export CSV again on the same campaign, at a later time, produces a fresh file reflecting whatever the recipients' statuses are at that moment, useful for a campaign still collecting delivery and read receipts.

What you will see

The downloaded file has one header row followed by one row per recipient, in the order VGraple CRM's internal recipient IDs were created. Every recipient the campaign ever queued appears, including suppressed, cancelled and pending rows, not only the ones that were successfully sent, so the file is a complete record of the campaign's audience, not just its successes.

What is actually in the file?

ColumnWhat it contains
Contact nameThe recipient's stored name in VGraple CRM
PhoneThe recipient's phone number
StatusThe most current known delivery status (sent, delivered, read, failed, suppressed, held, cancelled, skipped_quota, or pending)
Error codeThe Meta error code, when one exists, for a failed or suppressed recipient
Sent atTimestamp the message was actually sent, if it was
Replied atTimestamp of the recipient's reply, if any
RetriesHow many times this recipient has been re-attempted via Retry failed
ReasonThe human-readable explanation for the current status, matching what is shown in the recipient table's Error column

Revenue and click data are deliberately not part of this file. Both are visible elsewhere, revenue as a stat tile on the campaign detail page and in the multi-campaign Compare view, clicks as a stat tile and a filterable tab on the recipient table, but neither is currently exported as a CSV column. If you need revenue or click data alongside the delivery record for offline analysis, cross-reference the campaign detail page's figures with this export manually for now.

How does the export handle a very large campaign without failing?

An earlier, simpler approach to this kind of export loads every recipient row, every associated contact, and every related delivery message for the whole campaign into memory before writing anything, which on a 50,000-recipient campaign can mean hundreds of megabytes held in the same process serving the rest of the application, a real risk of the export itself slowing down or crashing unrelated requests. VGraple CRM's export instead streams the response: it pages through recipients 1,000 at a time using a keyset cursor (ordering by recipient ID rather than an offset, which stays fast no matter how deep into a large campaign it gets), writing each page's rows to the response as soon as they are fetched, and moving to the next page only once the previous one has been sent. Memory usage stays flat regardless of whether the campaign has 50 recipients or 50,000, and the download begins immediately rather than after a long wait while the whole file assembles server-side.

Settings and options

FeatureWhat it does
Export CSV buttonAvailable on every campaign detail page, in any status
StreamingPages through recipients 1,000 at a time; memory stays flat at any campaign size
Re-exportableRunning it again later reflects the campaign's current state
Audit loggingEvery export is recorded with row count, who ran it, and when

How does the export's Status column relate to what you see in the app?

The export deliberately mirrors the same resolution logic the recipient table and the funnel use, rather than dumping the raw database column value. A recipient whose row is still literally marked "sent" but whose linked delivery message has since moved to "delivered" or "read" via webhook is shown in the export with that more current status, not the stale original one, since that would otherwise disagree with what the exact same recipient shows inside the app at the same moment. This consistency matters when you are reconciling an exported file against what you see live in VGraple CRM, whether for a client report or an internal audit, since the two should never tell a different story about the same campaign.

Troubleshooting

SymptomLikely causeFix
Export CSV button is missingYou lack the "View broadcasts" permissionAsk an Owner or Admin to grant it, or check your assigned role
Download seems to take a long time to start on a very large campaignThe export streams from the database in pages; a 50,000-row campaign takes longer to fully generate than a small oneExpected for large campaigns; the download begins immediately and completes progressively rather than failing or timing out
Status column shows "sent" for a recipient you know was deliveredThe export was run before the delivery webhook arrived and updated that recipient's rowRe-export the campaign after a short wait to get an updated snapshot
Revenue or click numbers are missing from the fileThese are not currently included as export columnsCheck the campaign detail page or the Compare view for revenue and click figures instead
File will not open correctly in a spreadsheet toolAn unusual character in a contact name or note broke a naive CSV parserUse a proper CSV import (Data, From Text/CSV in most spreadsheet tools) rather than double-clicking to open directly

Why does the export include suppressed and pending rows, not just successful sends?

A file that only listed successful sends would answer "who did we reach" but hide "who did we intend to reach and why did some of them not get the message," which is usually the more useful question when auditing a campaign afterward. Because every recipient VGraple CRM ever queued for the campaign appears in the export, including suppressed rows with their specific reason and pending rows for a campaign still in progress, the file works as a complete audit trail on its own, without needing to cross-reference the recipient table in the app to understand the full picture. Filtering by Status in your spreadsheet tool after the fact gets you the same views the in-app filter tabs offer, just offline and exportable to whatever reporting tool your business already uses.

Cross-reference an export with recipient statuses explained for exactly what each status column value means, and see tracking link clicks and seeing revenue per broadcast for where that data lives instead.

Frequently asked questions

What columns are actually in the export?
Contact name, phone, status, error code, sent at, replied at, retries, and reason. It is the per-recipient delivery record, not a summary.
Does the export include revenue or click data?
No, not currently. Revenue and click totals are visible on the campaign's own detail page and in the multi-campaign Compare view, but the recipient CSV export itself does not include a revenue or click column.
Can I export a campaign with 50,000 recipients without it timing out or crashing my browser?
Yes. The export streams in pages of 1,000 rows directly from the database rather than loading the entire campaign into memory first, so file size and campaign size do not cause it to fail or time out.
What does the "status" column show for a recipient whose message was later marked delivered or read?
The most current known status, delivered or read, not the original "sent" value, since delivery and read receipts arrive on a webhook after the initial send and the export always reflects the latest known state at the moment you export.
Who can export a broadcast's results?
Anyone with the "View broadcasts" permission (broadcasts:view), which is broader than the send or create permissions, since exporting is a read action.
Is an export logged anywhere?
Yes, every export is recorded in the organization's audit log with the row count, along with who ran it and when.
Can I export a campaign that is still sending?
Yes, the export reflects whatever state the recipients are in at the moment you click Export CSV; running it again later on the same campaign will show updated statuses as more recipients are processed.

Run your WhatsApp on VGraple CRM

Free forever plan, official Meta WhatsApp Business API, set up in 15 minutes. No card needed.