Run your workspace
Conversation export
Bulk-export your workspace's conversations as CSV or JSON for retention, analytics, or compliance handover. Admin and Owner roles only.
How it works
- Admin POSTs to
/app/conversation-exportswith format (csvorjson) and optional filters (agent_id,from,to). - A
ConversationExportrow is inserted withstatus=pendingandBuildConversationExportJobis queued. - The job runs in the background, streaming conversations in
chunks of 200 to a private-disk file at
storage/app/private/exports/conversations/{uuid}.{format}. - On completion,
status=ready, the file size + row count are stamped, andexpires_atis set 7 days out. - The requesting admin downloads from
/app/conversation-exports/{id}/download. The endpoint streams the file with the right MIME and rejects the request if the export is not ready, expired, or belongs to another workspace.
What's in the export
Each row carries the conversation's lifecycle metadata, the
visitor's lead profile (email / phone / name / status), and
every message in the conversation. CSV format flattens the
transcript to first_user_message +
last_assistant_message for spreadsheet use; JSON
keeps the full message array per conversation.
Retention
Exports expire 7 days after they're created. The
conversations:prune-exports Artisan command runs
nightly at 02:15 UTC and deletes both the DB row and the file.
Re-trigger the export if you need it again after expiry.
Tenant isolation
The build job only reads conversations whose
agent_id belongs to the requesting workspace.
Download requests verify workspace_id match before
streaming. A leaked export id is harmless without an authed
session in the right workspace.
Limits
The job has a 600-second hard timeout. Workspaces with very large conversation volume should narrow with date / agent filters; we'll lift the timeout if buyers ask. The export file is held on the application's local private disk; very large files may push the disk usage warning thresholds on shared hosts.