transaction_end Order
An order was placed: its lines, sizes and total.
When to send it
Merchant tag fmttag on the order page, or the Shopify pixel's checkout.
- Sent only after the shopper gave analytics consent; dropped, never queued, before it.
- Kept 25 months.
- Send tracking_id when you have it: without one the event is kept but marked untracked.
Required fields
| Field | Type | Rules | Description |
|---|---|---|---|
client_id |
integer |
greater than 0 | |
event |
"transaction_end" |
||
timestamp_ms |
integer |
||
order_id |
string |
1–255 characters | |
products |
array of object |
1–500 items | |
products[].id |
string |
1–255 characters |
Optional fields
| Field | Type | Rules | Description |
|---|---|---|---|
tracking_id |
string |
a UUID | |
event_id |
string |
1–255 characters | |
schema_version |
1 |
||
user_agent |
string |
at most 2048 characters | |
shop_country |
string | null |
at most 8 characters; may be null | |
channel |
string | null |
at most 64 characters; may be null | |
instance_id |
string |
1–255 characters | |
product_id |
string |
1–255 characters | |
brand_id |
integer | null |
greater than 0; may be null | |
product_associated |
boolean |
||
ab_data |
object |
||
testEvent |
true |
||
extra |
object |
||
products[].price |
number |
0 or more | |
products[].quantity |
integer |
greater than 0 | |
products[].size |
string | null |
1–64 characters; may be null | |
products[].currency |
string |
3 capital letters (ISO 4217) | |
products[].variant_id |
string |
1–64 characters | |
products[].platform_product_id |
string |
1–255 characters | |
products[].sent_id |
string |
1–255 characters | |
products[].unknown_product |
true |
||
product_ids |
array of string | null |
||
total_price |
number | null |
0 or more; may be null | |
currency |
string |
3 capital letters (ISO 4217) | |
paid_price |
object |
||
transaction_id |
string |
1–255 characters | |
products_associated |
array of boolean |
||
brand_ids |
array of integer | null |
Example
Test values only. This example passes the event's schema.
{
"event": "transaction_end",
"client_id": 1000,
"tracking_id": "3f0b8c2e-4d5a-4b6c-8d7e-9f0a1b2c3d4e",
"timestamp_ms": 1792000000000,
"order_id": "TEST-ORDER-1001",
"products": [
{
"id": "TEST-JACKET-01",
"size": "M",
"quantity": 1,
"price": 59.9,
"currency": "EUR"
}
],
"total_price": 64.9,
"currency": "EUR"
}
Checks and messages
What Tracking debug in your back office checks for this event, with its exact message. An error means the event is not counted; a warning means it is counted but something is likely wrong; an info is a hint.
| Level | Check | Message |
|---|---|---|
| error | body_data |
the field: body data is not allowed here, the value was dropped (D110) |
| error | invalid_field |
what is wrong with the field |
| error | over_limit |
the field is over the limit of <limit> |
| error | products_empty |
products is empty: an order needs at least one line |
| warning | currency_not_iso |
the field "<value>" is not an ISO 4217 currency code (3 letters, such as EUR) |
| warning | price_text |
the field was sent as text: send a number (stored as <value>) |
| warning | product_unknown |
product not found in your catalogue or has no size chart |
| warning | size_not_in_product |
size "<value>" is not one of the product's sizes |
| warning | timestamp_missing |
timestamp_ms is missing or not a time in milliseconds: the time the event was received is used |
| warning | timestamp_out_of_range |
timestamp_ms is more than 30 days old or more than 3 days ahead: the time the event was received is used |
| warning | untracked |
untracked: no tracking_id. The event is kept but cannot be joined to the widget visitor. |
| info | no_prior_cart |
no cart from this visitor in the 30 days before this order |
| info | size_lower_case |
size "<value>" was sent in lower case. Use uppercase letters or numbers. |
JSON schema
The schema the API checks this event against: transaction_end.schema.json.