Import & Export Guide
Your espresso data belongs to you. The Data screen lets you export everything to CSV, import from CSV, undo imports, and bulk-delete records you no longer need.
Getting There
The Data screen is one tap from the Account menu. All import and export controls live there.
Exporting Your Data
Tap Export CSV next to Shots or Beans. On mobile the share sheet opens so you can save or send the file. On web the file downloads directly to your browser's downloads folder.
The exported file includes all your records and opens correctly in Excel, Google Sheets, or any CSV editor.
Tip: Export regularly as a backup. Re-importing an export is always safe — duplicates are detected and skipped automatically.
Downloading Templates
Tap ↓ template next to Shots or Beans to download a CSV file with the correct headers and one example row. Fill it in and import it back — this is the easiest way to get the format right without guessing column names.
Importing Data
Tap Import CSV next to Shots or Beans, then pick your file.
After the import finishes you'll see a summary like:
Imported 12 shots, 3 skipped
- Imported — new records added to your account
- Skipped — duplicates that already existed (not added again)
- Had invalid data — rows with missing required fields or bad values (skipped without failing the whole import)
Every import is tracked in Import history below the buttons so you can undo it if needed.
Required columns
Shots
| Column | Required | Notes |
|---|---|---|
shot_date | Required | ISO 8601 timestamp, e.g. 2024-04-13T09:00:00 |
dose_g | Required | Number, e.g. 18.5 |
yield_g | Required | Number, e.g. 36 |
time_sec | Required | Integer seconds, e.g. 28 |
bean_name | Optional | Matched to your beans; auto-created if not found |
grind_setting | Optional | Free text |
rating | Optional | Integer 1–5 |
tasting_notes | Optional | Free text |
machine_name | Optional | Matched to your machines |
grinder_name | Optional | Matched to your grinders |
Beans
| Column | Required | Notes |
|---|---|---|
bean_name | Required | |
roaster_name | Optional | Matched to your roasters |
roast_level | Optional | Light / Medium-Light / Medium / Medium-Dark / Dark |
roast_date | Optional | YYYY-MM-DD |
origin | Optional | Free text |
process | Optional | Free text |
notes | Optional | Free text |
How duplicates are handled
The app skips records it's already seen, so re-importing an export is always safe.
- Shots: skipped if the same
shot_date+dose_g+yield_g+time_secalready exists - Beans: skipped if the same
bean_name+roaster_namealready exists
Bean auto-creation
If a shot row references a bean_name that isn't in your beans yet, the app creates a minimal
bean record automatically (name only, no other fields). You can fill in the rest later from the Beans screen.
Undoing an Import
Import history shows every import you've done with the date and record counts. Tap Undo next to any entry to delete all records from that import in one step.
Note: If you've manually edited a record that came in via import, undoing still removes it. The undo removes everything tied to that batch, regardless of later edits.
Bulk Delete
Tap Manage Data to open the bulk-delete modal. Switch between Shots and Beans with the toggle at the top.
By range
Delete a consecutive run of records using their sequence numbers (#1, #2, #3… as shown on the list screens).
- 1Enter a From # and To #
- 2Tap Preview — you'll see how many records will be deleted
- 3Tap Confirm Delete
By selection
Browse the full list and check individual records to delete.
- 1Tap any row to check it
- 2Tap again to uncheck
- 3When you're ready, tap Delete N selected at the bottom
Sequence numbers
Each shot and bean has a sequence number (#1, #2, etc.) shown on the list screens and in the Manage Data modal. These numbers reflect the current order — they shift when records are deleted. They aren't stored permanently; they're calculated fresh each time.