CRM · Customer CSV export with column picker
Exports the currently filtered customer set as CSV, letting the operator choose from ~30 columns. The file is produced server-side and delivered by email.
| Area | CRM |
| Routes | crm.users.index |
| Centre modules | crm |
| Staff levels | root · admin · manager |
| Models | user |
| UI label | informative-message.export-crm-csv.success.message |
| Coverage | 3 use cases · 1 happy · 3 failure |
Known issues (1)
- 🟠 Medium — Export spinner never clears on failure
How it works
The default column set is computed in userExportColumns and grows with the centre’s modules: account_type when hasEmployeesSegments, calculated_income + calculated_postal_code when hasForegroundLocation. toggleUserExportColumns flips individual columns. load.export() POSTs to /api/v4/exports with the model name, the active filters (minus type, which is sent separately as filter-type), the chosen csv-fields and the centre id (used as the email ‘from’), and tracks a DATA_EXPORTED analytics event.
Use cases
Why someone opens this (3)
- Handing a filtered audience to an external mailing tool.
- Pulling a data-quality extract to see how many records lack a phone or postal code.
- Exporting employee-segment populations where account type matters.
Path map
flowchart LR F(["Customer CSV export with column picker"]):::feat F --> H1["Filtered export emailed"]:::ok F -.-> X1["Export request fails"]:::bad F -.-> X2["Email never arrives"]:::bad F -.-> X3["No columns selected"]:::bad classDef feat fill:#157068,stroke:#157068,color:#ffffff,font-weight:bold classDef ok fill:#e3f1ea,stroke:#0d6b42,color:#0d4a2e classDef bad fill:#f7e6e2,stroke:#9a2d1c,color:#6e1f13
Happy paths
Filtered export emailed
- Operator filters the list, then opens the export modal (
openUserExportModal).- Columns are pre-ticked from the module-aware default set; operator adjusts them.
exportUserCsvcloses the modal, sets the loading flag and callsload.export('user', filters, columns).- On resolve the success banner
informative-message.export-crm-csv.success.messageappears and the file arrives by email.
Failure paths
Export request fails
Cause — API error on
/api/v4/exports.What happens —
exportUserCsvhas no.catch(), soisExportLoadingstays true and the spinner never clears — the operator is left waiting with no error message.
Email never arrives
Cause — Export job fails asynchronously or the mail is filtered.
What happens — The UI already reported success; there is no job-status surface in the frontend.
No columns selected
Cause — Operator unticks every column.
What happens — Not validated client-side — an empty
csv-fieldsarray is sent and the outcome depends entirely on the API.
QA checklist
Tick these off while regression-testing this feature. The boxes are plain Markdown, so progress is visible in git diffs.
- ✅ Filtered export emailed
- ⛔ Export request fails
- ⛔ Email never arrives
- ⛔ No columns selected
Implementation
Translation keys (1)
Key English informative-message.export-crm-csv.success.messageThe export request has been processed successfully, you will receive an email with the exported file shortly
Related
- Same area — Customer list & filtering · Customer create & edit · Customer deletion with unsubscribe notice · Customer CSV import · Children CSV import · AI natural-language customer filter · Save current filters as a segment · Segment list, refresh & export · Segment builder with automatic tag actions · Segment categories · User tags (user types) · Customer receipts tab & ticket-stamp generation · Customer loyalty — raffle tickets · Customer loyalty — cards & stamps · Customer loyalty — rewards · Customer loyalty — coupon exchanges · Customer children (dependants) · Receipt verification queue · Store list, filters & exports · Store create & edit · Store CSV import · Store labels (store types) · Customer action log (dormant)
- Shares data with — Data-quality dashboard · Play centre stays (check-in - check-out) · Realtime updates (Pusher)
Generated from doc/feature-inventory.json · id crm-customer-export · commit 276788ca6