Export
The Export feature allows you to export your brew data as JSON for backup, analysis, or integration with other tools.
Overview
Beanstats provides several export options:
- Single Brew Export: Export any individual brew as JSON
- Bulk Export: Export all your brews at once
- Full Backup: Export all data including beans, methods, equipment, and freeze entries (see Import & Backup)
Single Brew Export
Export any brew from its detail view:
- Open a brew’s detail view
- Tap the menu in the toolbar
- Select Export as JSON
- Share or save the JSON file
Single brew export is always available to all users.
Bulk Export
Export all your brew data from Settings:
- Navigate to Settings > Data & Storage
- Tap Export Data
- Choose to include flow data (optional)
- Select Export Home Brews or Export Cafe Brews
Export Options
Include Flow Data
When exporting brews that have scale data, you can optionally include the raw weight samples. This increases file size but preserves the full brew profile for analysis.
Pretty Print
JSON is formatted with indentation for human readability.
JSON Format
Home Brew Export
{
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-01-07T08:30:00Z",
"bean": {
"uuid": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
"name": "Ethiopia Yirgacheffe",
"roaster": "Local Roaster",
"roastLevel": "Light",
"tastingNotes": "Blueberry, Jasmine"
},
"recipe": {
"style": "filter",
"doseGrams": 18.0,
"waterGrams": 300.0,
"ratio": "1:17",
"grindSize": "Medium-fine",
"waterTempCelsius": 94.0,
"brewTimeSeconds": 210,
"bloomTimeSeconds": 45
},
"flowData": {
"peakFlowRate": 4.2,
"wasAutoCapture": true,
"weightCurve": [0, 2, 5, 10, 18, 25, 32, 36]
},
"evaluation": {
"rating": 4.5,
"notes": "Great brew!"
},
"method": { "name": "V60" },
"equipment": [
{ "name": "Comandante C40", "type": "Grinder" }
]
}Cafe Brew Export
{
"uuid": "abc12345-6789-def0-1234-567890abcdef",
"timestamp": "2026-01-07T10:00:00Z",
"cafe": {
"name": "Local Coffee Shop",
"url": "https://localcoffee.com",
"location": "Downtown",
"coordinates": {
"latitude": 52.3702,
"longitude": 4.8952
}
},
"coffeeStyle": "Cappuccino",
"variety": {
"name": "Gesha",
"originCountry": "Panama"
},
"evaluation": {
"rating": 5.0,
"notes": "Best cap in town"
}
}Bulk Export Wrapper
Bulk exports include metadata:
{
"metadata": {
"exportedAt": "2026-01-07T15:30:00Z",
"appVersion": "1.0.0",
"exportVersion": "1.0"
},
"brews": [...]
}Units
All exported values use consistent units regardless of your display preferences:
| Field suffix | Unit |
|---|---|
*Grams | Grams (g) |
*Celsius | Celsius (°C) |
*Seconds | Seconds (s) |
*Bars | Bar pressure |
This ensures data consistency for external tools and integrations.
Recipe Fields by Style
| Field | Filter | Espresso |
|---|---|---|
doseGrams | ✓ | ✓ |
waterGrams | ✓ | — |
yieldGrams | — | ✓ |
ratio | ✓ | ✓ |
grindSize | ✓ | ✓ |
waterTempCelsius | ✓ | ✓ |
brewTimeSeconds | ✓ | ✓ |
bloomTimeSeconds | ✓ | — |
pressureBars | — | ✓ |
preInfusionSeconds | — | ✓ |
Flow Data Format
When includeFlowData is enabled and the brew has scale and/or pressure data:
{
"flowData": {
"peakFlowRate": 4.2,
"wasAutoCapture": true,
"detectedPreInfusionEnd": 5.5,
"weightCurve": [0, 2, 5, 10, 18, 25, 32, 36],
"peakPressureBars": 9.2,
"pressureCurve": [0, 50, 200, 200, 500, 850, 900, 910]
}
}Weight curve: Weight in grams at each second (index 0 = 0s, index 1 = 1s, etc.). Uses linear interpolation between raw 10Hz samples.
Pressure curve: Pressure in hundredths of a bar at each second. Divide by 100 to get bars (e.g. 900 = 9.00 bar). Only present when pressure sensor data was recorded. Uses linear interpolation between raw samples.
Flow data is included when either scale data or pressure data is available.
File Naming
Exported files follow these naming patterns:
| Type | Pattern |
|---|---|
| Single brew | brew-{bean-name}-{timestamp}.json |
| Cafe brew | cafe-brew-{cafe-name}-{timestamp}.json |
| Bulk export | home-brews-{count}-{timestamp}.json |