Usage CSV formats
The monthly aggregate and line-level usage CSV schemas TrueUpp imports, with validation, deduplication, idempotency and billed-amount rules.
On this page
All files are UTF-8 with a header row, ISO 8601 dates, a decimal point and no thousands separators. period_end is exclusive: September is 2026-09-01 to 2026-10-01.
Monthly aggregate
account_id,metric_name,period_start,period_end,usage_units
2077,api_requests,2026-07-01,2026-08-01,22000
2077,exports,2026-07-01,2026-08-01,200A row spanning more than one month is assigned to the month it starts in and flagged. With aggregate rows, rollover expiry applies at month granularity, and statements say so.
Line-level events
account_id,metric_name,usage_at,quantity,event_id,status,retry_of
2077,api_requests,2026-07-14T09:31:02Z,1,evt_8f2c,ok,
2077,api_requests,2026-07-14T09:31:05Z,1,evt_8f2d,failed,
2077,api_requests,2026-07-14T09:31:09Z,1,evt_8f2e,ok,evt_8f2devent_idis optional. Rows with the same account, metric and event id are counted once, within a file and across files.statusisokorfailed;retry_ofnames the event a row retries. Each contract decides whether failed requests and retries count.- Timestamps are stored in UTC; your workspace's close time zone decides which day an event falls on.
Imports are all-or-nothing and idempotent
- If any row is invalid, nothing is imported, and every invalid row is listed with its line number and reason.
- Uploading a byte-identical file again changes nothing.
- Two different files that cover the same account and month both import, and the overlap is flagged until you void one.
- Usage for an account id with no contract is held. It counts nowhere until you attach it to a contract or ignore it.
- A month with no usage is treated as zero and blocks approval of its period until someone acknowledges it.
Billed amounts
To compare expected with what was actually invoiced, upload account_id,period_start,period_end,billed_amount,note. Once Stripe is connected, finalized invoices are recorded automatically.