completed_order
An order was paid: the buyer and what was bought, with the campaign it came through.
One per order, at the moment the payment reached paid (a free order at its creation). The buyer's email and phone are identifiers with role buyer; their answers to the shop's questions become attribute observations on the buyer. The ticket and product lines are separate activities (issued_ticket, issued_product), which carry the revenue; total_paid here is reporting money, not revenue. The touch is the campaign the order is attributed to.
| Sent with | platform keys (see write keys) |
| Mode | strict: exactly the declared fields; an undeclared key, a wrong type or a missing required key quarantines the event |
| Version | 3 (_schema_version on the stored row) |
| State | active |
| Required fields | order_id |
| Revenue | none: the revenue block is refused. Money-like names allowed in features: payment_surcharge, total_paid |
| Identity evidence | email (buyer) ↔ phone (buyer), strength 100, verifieddevice ↔ email (buyer), strength 40, verified |
| Before consent | no |
| Geo | carries a geo block in practice; any activity may |
Fields
The activity's own fields, sent as features. Identifier and attribute fields are moved out of features by the processor; see identifiers and attributes.
| Field | Type | Required | What happens to it | Meaning |
|---|---|---|---|---|
city | string | no, may be null | becomes the city attribute observation (weight 50) on the buyer; it leaves features | The city as answered. Stored exactly as typed; the place it names is resolved beside it (see the geo block). |
country | string | no, may be null | becomes the country attribute observation (weight 50) on the buyer; it leaves features | The country as answered: a code or a name in any language. Stored as typed. |
currency | string | no, may be null | stays in features | ISO 4217 code of the amounts on the activity. |
date_of_birth | string | no, may be null | becomes the date_of_birth attribute observation (weight 50) on the buyer; it leaves features | As answered, YYYY-MM-DD. |
event_date_ids | array of string | no | stays in features | The dates (editions) the order's tickets are for. |
event_ids | array of string | no | stays in features | The events the order's tickets are for; an order can span events, so completed_order itself has no _event_id. |
first_name | string | no, may be null | becomes the first_name attribute observation (weight 50) on the buyer; it leaves features | The person's first name, as answered. |
gender | string | no, may be null | becomes the gender attribute observation (weight 50) on the buyer; it leaves features | As answered, in the shop's own terms. |
is_seated | boolean | no, may be null | stays in features | Whether the order holds seated tickets. |
last_name | string | no, may be null | becomes the last_name attribute observation (weight 50) on the buyer; it leaves features | The person's last name, as answered. |
locale | string | no, may be null | becomes the language attribute observation (weight 50) on the buyer; it leaves features | The language and region of the buyer's session, such as nl_NL. |
order_id | string | yes | stays in features | The order in the ticketing system, as its own id. The same value on every activity derived from one order, so they can be joined. |
payment_method | string | no, may be null | stays in features | How the order was paid, in the payment provider's terms (ideal, creditcard, …). |
payment_surcharge | string | no, may be null | stays in features | The payment fee charged to the buyer, as a decimal string in the order's currency. |
postal_code | string | no, may be null | becomes the postal_code attribute observation (weight 50) on the buyer; it leaves features | The postal code as answered. Stored as typed; its district is resolved beside it. |
product_count | integer | no | stays in features | How many product lines the order holds. |
purchase_channel | string | no, may be null | stays in features | Where the order was made: shop, box_office, import, cancel, … |
shop_id | string | no, may be null | stays in features | The shop the basket is in. |
ticket_count | integer | no | stays in features | How many tickets the order holds. |
total_paid | string | no, may be null | stays in features | What the buyer paid in total, as a decimal string. Reporting money; the activity's own revenue is on the lines. |
touch | object | no, may be null | stays in features | The campaign the activity came through; see the touch block. The same block on every revenue-bearing activity. |
Notes
The Weeztix mapper (order-v10) derives this from the order webhook: first_name/last_name from the order, the address and other answers from the shop's questions under their standard names or the shop's own ("Woonplaats", "Postleitzahl"), the touch from the shop's tracking info, and a geo block from the address answers and the purchaser IP.
Example
One activity in a batch to POST /v1/activities, with debug so the answer says what the processor made of it. The envelope page explains every top-level field.
{
"batch": [
{
"activity_id": "0192f1a4-4931-7bc5-8000-4931bc5a0000",
"activity": "completed_order",
"ts": "2026-10-17T20:00:00+02:00",
"owner_ref": "own:own_01M4XX0033FV7QXDRB5BQBRPGR",
"identifiers": [
{
"type": "email",
"value": "ana@example.com",
"role": "buyer"
},
{
"type": "phone",
"value": "+31624681357",
"role": "buyer"
}
],
"features": {
"city": "Amsterdam",
"country": "Nederland",
"currency": "EUR",
"date_of_birth": "1990-05-17",
"event_date_ids": [
"9c0e1f2a-0000-4000-8000-000000000002"
],
"event_ids": [
"3a114ef5-6105-48fd-aafc-0ae609d0536c"
],
"first_name": "Ana",
"gender": "female",
"is_seated": false,
"last_name": "de Vries",
"locale": "nl_NL",
"order_id": "1f2d3c4b-0000-4000-8000-000000000001",
"payment_method": "ideal",
"payment_surcharge": "0.35",
"postal_code": "1012 AB",
"product_count": 0,
"purchase_channel": "shop",
"shop_id": "shop_01M4XVBYC3FGXCPFRZEPGV20RZ",
"ticket_count": 2,
"total_paid": "45.35",
"touch": {
"captured_by": "touch.captured by",
"click_ids": {},
"landing_url": "touch.landing url",
"referrer": "touch.referrer",
"utm": {
"campaign": "touch.utm.campaign",
"content": "touch.utm.content",
"medium": "touch.utm.medium",
"source": "touch.utm.source",
"term": "touch.utm.term"
}
}
},
"geo": [
{
"kind": "home",
"role": "buyer",
"city": "Amsterdam",
"postal_code": "1012 AB",
"country": "Nederland",
"locale": "nl_NL"
},
{
"kind": "ip",
"role": "buyer",
"ip": "192.0.2.10"
}
]
}
],
"debug": true
}
Try it
Sends this request from your browser. The key and the endpoint are kept in this browser only.
Versions
| Version | Mode | Key classes | Change |
|---|---|---|---|
| 1 | strict | platform | first version |
| 2 | strict | platform | adds city, country, date_of_birth, gender, postal_code |
| 3 (current) | strict | platform | same fields |
A published version never changes; a change is a new version, and every stored row says which version it was checked against.