E-FACTSDocs
Receipt payload

Receipt payload

The generic adapter accepts a flexible JSON receipt, so most POS systems can send what they already have with little mapping. This page lists the accepted fields and how each one is normalized.

Example

{
  "store_id": "STORE_001",
  "transaction_id": "TXN_0001",
  "timestamp": "2026-09-26T15:04:05Z",
  "currency": "CAD",
  "amounts_in_cents": true,
  "subtotal": 1400,
  "tax": 175,
  "total": 1575,
  "payment_token": "tok_from_your_processor",
  "items": [
    { "sku": "GEN-001", "description": "Notebook", "quantity": 2, "unit_cents": 500, "category": "Stationery" }
  ]
}

Receipt fields

When several names are listed, the first one present wins.

Field (accepted names)Normalized toNotes
store_id, storeId, location_id, locationId, merchant_idStoreMust match a store ID registered during onboarding. Unmapped stores are held.
transaction_id, transactionId, idTransaction IDUnique per sale. Reuse it on retries.
timestamp, purchased_at, created_atPurchase timeISO 8601. Defaults to the time received.
currencyCurrencyISO 4217, e.g. CAD. Defaults to USD.
total_cents, or grand_total, grandTotal, total, amountGrand total
tax_cents, or tax_total, taxTotal, taxTax total
subtotal_cents, or subtotalSubtotalDefaults to grand total minus tax.
payment_token, paymentTokenPayment referenceProcessor token or fingerprint. Never a card number.
card_last4Last four digitsUsed as the payment reference when no token is sent.
items or line_itemsLine itemsSee below.

Line item fields

Field (accepted names)Notes
skuUsed for recall matching. Send it whenever you have it.
description or nameShown on the receipt.
quantityDefaults to 1.
unit_cents, or unit_price, unitPrice, pricePrice of one unit.
categoryOptional. Used for shopper spending categories.

Money

Send money in integer cents and set "amounts_in_cents": true, or use the *_cents fields, which are always read as cents. Without either, amounts are read as decimal currency units and converted to cents. Integer cents avoid rounding surprises, so prefer them.

Unknown fields

Extra fields are accepted and ignored by normalization, so you can send your POS's native payload with the fields above added.