Export
Let users take their data out in the format they need, with a clear scope and no surprises about what's included.
6 states5 edge casesDesktop + Mobile
01The problem
Users export to share with finance, analyse in a spreadsheet, or leave for another tool. The export button usually hides the hard questions: does it include the filtered rows or everything? Which columns? What about the 50,000-row case that times out? A file that silently contains the wrong rows is worse than no export at all.
02When to use
Use when
- Tables and lists users analyse elsewhere
- Reports that need to be shared outside the product
- Account-level data portability
Avoid when
- Users need a live connection to the data — offer an integration or API instead.
- The data is a single record — use print or share instead.
03Recommended UX
Statecraft recommendation
Make the export scope explicit before the file is created — “42 filtered invoices” or “All 1,284 invoices” — let users choose columns and format in one small dialog, and move exports above a size threshold to a background job that notifies when the file is ready.
Stating the scope with a count prevents the most common export complaint: “this isn't the data I was looking at”.
Defaulting to the visible columns matches what users see; offering “all fields” covers analysis needs.
Large exports that block the browser fail on slow connections. A background job with a download link is reliable.
04Interaction flow
- 01
Click Export
From the list toolbar or selection toolbar.
- 02
Choose scope
Selected, filtered, or all — each with a count.
- 03
Choose format and columns
CSV, Excel, PDF; visible or all columns.
- 04
Generate
Small: immediate download. Large: background job.
Result
- Downloaded
- Ready by email
- Failed
05Desktop behaviour
On desktop, export opens a compact dialog with scope, format and columns, then downloads directly or hands off to a background job.
Desktop rules
- Scope options with counts: Selected (3) · Current view (42) · All invoices (1,284).
- Default to the current view and visible columns.
- Above ~10,000 rows, say it will be emailed and continue in the background.
- Name files descriptively: invoices-overdue-2026-11-01.csv.
06Mobile behaviour
On mobile, exports are usually for sharing. Keep options minimal and hand the file to the share sheet.
Mobile rules
- One sheet: scope and format, with sensible defaults.
- Small files open the native share sheet; large ones are emailed.
- Skip column selection on mobile — use the current view.
07States
Choosing
Dialog with scope, format and columns.
Generating
Immediate exports show progress in the button.
Queued
Background job; user can leave; notified on completion.
Ready
Download link with expiry date.
Expired
Link expired; one-click regenerate.
Failed
Reason and Retry; partial files never delivered as complete.
08Edge cases
EC-01
Filtered vs all
The user filtered to 42 rows and clicks Export.
Recommendation
Default to the 42, state it with the count, and offer “All 1,284” as an explicit alternative.
EC-02
Formula injection
A customer name starts with “=HYPERLINK(…)”.
Recommendation
Prefix cells starting with = + - @ so spreadsheet apps treat them as text.
EC-03
Permissions
A member exports data including fields they can't see in the UI.
Recommendation
Exports apply the same field and row permissions as the interface; log every export.
EC-04
Dates and numbers
A European user opens the CSV in Excel and dates are swapped.
Recommendation
Use ISO dates (2026-11-01) and plain numbers without currency symbols in CSV; offer Excel format for formatted output.
EC-05
Huge exports
An admin exports 2 million activity rows.
Recommendation
Run in the background, split into multiple files or a zip, and email a time-limited link.
09Microcopy
Scope
Avoid
“Export data”
Prefer
“Export 42 invoices in Overdue view”
Background
Prefer
“This is a large export. We’ll email you a download link, usually within 5 minutes.”
Ready
Prefer
“Your export is ready · invoices-2026-11-01.csv · link expires in 7 days”
Failed
Avoid
“Export failed”
Prefer
“The export didn’t finish. Nothing was sent. Retry”
10Accessibility
- Scope and format are radio groups with counts in the labels.
- Background export status is announced and also delivered by email/notification.
- Exported spreadsheets include header rows with human-readable column names.
11Developer notes
- 01
Generate exports from the same query that renders the view, including filters and permissions.
- 02
Stream large exports to storage in a background job; deliver via signed, expiring URLs.
- 03
Escape formula-leading characters in CSV output.
- 04
Log export events (who, scope, row count) for audit.
12Implementation prompt
For Claude Code, Codex or Cursor
Implement data export for list views. Requirements: - Export dialog: scope (Selected / Current view / All) with counts, format (CSV, Excel), columns (visible / all). - Same query, filters and permissions as the view; audit log per export. - Small exports download immediately; above a threshold, background job + notification/email with a signed expiring link. - Descriptive filenames with view name and date. - CSV: ISO dates, plain numbers, formula-prefix escaping; header row with readable names. - States: generating, queued, ready (with expiry), expired (regenerate), failed (retry, never partial-as-complete). - Mobile: single sheet with defaults; native share sheet for small files. Do not redesign the existing interface.