Starter template. Copy this into a
.csv and replace the example rows.template.csv
Fields
Four fields are required. They are exactly the four an activity cannot be imported without, so anything missing is refused when you send it — named — rather than accepted and thrown away minutes later.string
required
Where the activity happened, as configured in Dyspach.
string
required
The charge being recorded, matching your customer’s rate card —
Picking, Packing,
Receipt - Unit, and so on. Free text.integer
required
Units of the charge. Signed — see below.
0 is not a quantity and is refused.date-time
required
When it happened, ISO-8601. This decides which billing period the charge falls into.
On a file upload, all four required columns must be present in the header row. A row
that leaves one of them blank is still refused, but per row, with the reason on the
errors endpoint — the file is not
rejected whole because of one bad line.
Value formats
Quantity is signed
Quantity is signed
Negatives are expected, not an error — they are how credits and reversals are
recorded.
-35 is as valid as 35.Timestamps must be ISO-8601
Timestamps must be ISO-8601
2026-08-10T16:00:00Z. This decides which billing period the charge falls into, so
it is never inferred. Do not send 8/10/26 — that is August to some systems and
October to others.Every push appends
Every push appends
An activity has no identity: the same charge code, reference and timestamp can
legitimately occur several times — four identical picks on one order in the same
second is normal. So nothing is de-duplicated, and sending a batch twice records it
twice. Each row is billable, so send a run once and check the import rather than
retrying blindly.

