Standard events
Standard events are the vocabulary apps are built against. Your site writes each event once, and every installed app receives the same payload and transforms it for its own destination. Adding a destination is a change in the Blotout platform, never a change in your tracking code, and when a destination changes its format the app handles it for you.
Event names are free-form: track accepts any non-empty string. The eleven events on this page are a convention, not a
validation. Sending one of them is what lets an app recognise the event without per-site configuration. Your own event
name is fine too, but only an app that knows it will do anything with it.
Every parameter below is optional unless its table marks it required. You can add properties of your own next to the standard ones; an app that does not know a property ignores it.
Where to send from
Section titled “Where to send from”Each event can be sent from four places. The payload is the same in all four, so every example on this page has a tab per surface. Pick one tab and the whole page follows.
The snippet from your site’s Snippet page in the Blotout platform binds window.qinto. Call it from any script on
the page. A call made before the tag has loaded is queued and sent in order once the connection is open.
<script> qinto.track('AddToCart', { currency: 'USD', value: 10.5 })</script>The tag records PageView for you. See Browser for the snippet and its options.
@blotout/qinto-sdk-browser is the same client as the
tag, as an npm package for a bundled site: an SPA, a framework app, a TypeScript project. Call init once where your
app starts, then import track anywhere. Every call returns a promise that settles when the edge accepted the event,
so you can await a Purchase before you navigate away.
import { init, track } from '@blotout/qinto-sdk-browser'
init({ destination: 'https://q.example.com' })
await track('AddToCart', { currency: 'USD', value: 10.5 })Unlike the tag, the package does not record the page load. track('PageView') is yours to call. See
Headless for init and its options.
@blotout/qinto-sdk-server sends the same events from a
backend, a payment webhook or a scheduled job, against the same identity graph. The first argument names the person by
an anon_… id or any identifier of your own, such as an email, a phone number or a customer id. It needs an edge token
with the Track events permission from your site’s Developer tools → Edge tokens page.
import { createClient } from '@blotout/qinto-sdk-server'
const qinto = createClient({ destination: 'https://q.example.com', token: process.env.QINTO_EDGE_TOKEN })
await qinto.track('crm-user-8412', 'AddToCart', { currency: 'USD', value: 10.5 })Tracking never creates a person. An identifier the site has never seen fails with HTTP 404, so bind it first with
identify or alias, or send the anon_… id. An event that happened earlier, or outside the browser, carries its own
time and network through options.observed.
Any language can call the edge API directly. POST /v1/track on your site’s Qinto host takes the edge token as a
bearer token and a JSON body. This is what the server SDK sends.
curl -X POST https://q.example.com/v1/track \ -H 'Authorization: Bearer qwat_…' \ -H 'Content-Type: application/json' \ -d '{ "identifier": "crm-user-8412", "event": "AddToCart", "eventId": "3f2a9c1e-7b64-4d0e-9a51-2c8e6f0d4b17", "properties": { "currency": "USD", "value": 10.5 } }'| Field | Required | What it is |
|---|---|---|
identifier |
Yes | The person: an anon_… id or an identifier of your own. Internal gid_… ids are rejected. |
event |
Yes | The event name. |
eventId |
Yes | The id destinations deduplicate on. The SDKs mint one for you; over HTTP you supply it. For Purchase, use the order id. |
properties |
No | The event payload from the tables below. |
observed |
No | occurredAt, offline, network, page, session and replay for an event that did not happen just now, or that Qinto could not observe. |
installs |
No | { "mode": "only" | "except", "installIds": [] } to pick the app installs that receive the event. |
The response is { "ok": true, "id": "act_…" }, where id is the id of the accepted action, not of the person. An
unknown identifier returns 404 with { "error": "unknown_user" }, and an invalid body returns 400 with invalid_body
and the failing fields. See HTTP for the other endpoints.
Event id and recording
Section titled “Event id and recording”track returns the event id. When the payload carries a non-empty orderId, that is the event id, so a purchase you
send from both the page and your backend carries one id and destinations deduplicate it. Otherwise the SDKs mint one,
and you can pass your own through the options argument when the id has to match a record in your own system. A
supplied id always wins.
Delivery and recording are two different things, and the difference matters when you debug an app:
- Delivery. A track that survives the transform chain is delivered to every eligible app. An app’s transform hook can drop it, in which case nothing downstream sees it, or replace its payload. Consent decides which apps are eligible, and an app never receives an event it emitted itself.
- Recording. The identity graph records an event as a conversion only when it carries a finite numeric
valueand a non-emptyorderId. Of the eleven events, onlyPurchasedoes. TheorderIdis the dedupe key, so a retriedPurchasewith the same order id records once.
The other ten create no conversion row. A server-side track whose identifier resolves to a known email or phone still updates that profile. An event with neither a conversion nor an identifier is delivery-only: apps see it, the graph does not change.
The events
Section titled “The events”PageView
Section titled “PageView”A page was viewed. Takes no parameters.
qinto.track('PageView')import { track } from '@blotout/qinto-sdk-browser'
await track('PageView')import { createClient } from '@blotout/qinto-sdk-server'
const qinto = createClient({ destination: 'https://q.example.com', token: process.env.QINTO_EDGE_TOKEN })
await qinto.track('crm-user-8412', 'PageView')curl -X POST https://q.example.com/v1/track \ -H 'Authorization: Bearer qwat_…' \ -H 'Content-Type: application/json' \ -d '{ "identifier": "crm-user-8412", "event": "PageView", "eventId": "3f2a9c1e-7b64-4d0e-9a51-2c8e6f0d4b17" }'ViewContent
Section titled “ViewContent”A visit to a page you care about, such as a product or landing page.
| Name | Type | Required | Description |
|---|---|---|---|
currency |
string | No | The currency for the value specified |
value |
number | No | A numeric value associated with this event |
contents |
Content[] |
No | The products or items related to this event |
qinto.track('ViewContent', { currency: 'USD', value: 10.5, contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' } ]})import { track } from '@blotout/qinto-sdk-browser'
await track('ViewContent', { currency: 'USD', value: 10.5, contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' } ]})import { createClient } from '@blotout/qinto-sdk-server'
const qinto = createClient({ destination: 'https://q.example.com', token: process.env.QINTO_EDGE_TOKEN })
await qinto.track('crm-user-8412', 'ViewContent', { currency: 'USD', value: 10.5, contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' } ]})curl -X POST https://q.example.com/v1/track \ -H 'Authorization: Bearer qwat_…' \ -H 'Content-Type: application/json' \ -d '{ "identifier": "crm-user-8412", "event": "ViewContent", "eventId": "3f2a9c1e-7b64-4d0e-9a51-2c8e6f0d4b17", "properties": { "currency": "USD", "value": 10.5, "contents": [ { "id": "123123123", "quantity": 1, "value": 10.5, "title": "Summer Fun", "category": "bracelets", "image": "https://mysite.com/product/fun-main.jpg", "url": "https://mysite.com/summer-fun" } ] } }'AddToCart
Section titled “AddToCart”A product was added to the shopping cart.
| Name | Type | Required | Description |
|---|---|---|---|
currency |
string | Yes | The currency for the value specified |
value |
number | Yes | A numeric value associated with this event |
contents |
Content[] |
No | The products or items related to this event |
checkoutUrl |
string | No | URL of the checkout page |
qinto.track('AddToCart', { currency: 'USD', value: 10.5, checkoutUrl: 'https://www.example.com/path/to/checkout', contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' } ]})import { track } from '@blotout/qinto-sdk-browser'
await track('AddToCart', { currency: 'USD', value: 10.5, checkoutUrl: 'https://www.example.com/path/to/checkout', contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' } ]})import { createClient } from '@blotout/qinto-sdk-server'
const qinto = createClient({ destination: 'https://q.example.com', token: process.env.QINTO_EDGE_TOKEN })
await qinto.track('crm-user-8412', 'AddToCart', { currency: 'USD', value: 10.5, checkoutUrl: 'https://www.example.com/path/to/checkout', contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' } ]})curl -X POST https://q.example.com/v1/track \ -H 'Authorization: Bearer qwat_…' \ -H 'Content-Type: application/json' \ -d '{ "identifier": "crm-user-8412", "event": "AddToCart", "eventId": "3f2a9c1e-7b64-4d0e-9a51-2c8e6f0d4b17", "properties": { "currency": "USD", "value": 10.5, "checkoutUrl": "https://www.example.com/path/to/checkout", "contents": [ { "id": "123123123", "quantity": 1, "value": 10.5, "title": "Summer Fun", "category": "bracelets", "image": "https://mysite.com/product/fun-main.jpg", "url": "https://mysite.com/summer-fun" } ] } }'RemoveFromCart
Section titled “RemoveFromCart”A product was removed from the shopping cart. Same parameters as AddToCart.
| Name | Type | Required | Description |
|---|---|---|---|
currency |
string | Yes | The currency for the value specified |
value |
number | Yes | A numeric value associated with this event |
contents |
Content[] |
No | The products or items related to this event |
checkoutUrl |
string | No | URL of the checkout page |
qinto.track('RemoveFromCart', { currency: 'USD', value: 10.5, checkoutUrl: 'https://www.example.com/path/to/checkout', contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' } ]})import { track } from '@blotout/qinto-sdk-browser'
await track('RemoveFromCart', { currency: 'USD', value: 10.5, checkoutUrl: 'https://www.example.com/path/to/checkout', contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' } ]})import { createClient } from '@blotout/qinto-sdk-server'
const qinto = createClient({ destination: 'https://q.example.com', token: process.env.QINTO_EDGE_TOKEN })
await qinto.track('crm-user-8412', 'RemoveFromCart', { currency: 'USD', value: 10.5, checkoutUrl: 'https://www.example.com/path/to/checkout', contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' } ]})curl -X POST https://q.example.com/v1/track \ -H 'Authorization: Bearer qwat_…' \ -H 'Content-Type: application/json' \ -d '{ "identifier": "crm-user-8412", "event": "RemoveFromCart", "eventId": "3f2a9c1e-7b64-4d0e-9a51-2c8e6f0d4b17", "properties": { "currency": "USD", "value": 10.5, "checkoutUrl": "https://www.example.com/path/to/checkout", "contents": [ { "id": "123123123", "quantity": 1, "value": 10.5, "title": "Summer Fun", "category": "bracelets", "image": "https://mysite.com/product/fun-main.jpg", "url": "https://mysite.com/summer-fun" } ] } }'InitiateCheckout
Section titled “InitiateCheckout”A person entered the checkout flow, before completing it.
| Name | Type | Required | Description |
|---|---|---|---|
currency |
string | Yes | The currency for the value specified |
value |
number | Yes | A numeric value associated with this event |
contents |
Content[] |
No | The products or items related to this event |
checkoutUrl |
string | No | URL of the checkout page |
qinto.track('InitiateCheckout', { currency: 'USD', value: 20.5, checkoutUrl: 'https://www.example.com/path/to/checkout', contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' }, { id: '4423434343', quantity: 2, value: 5, title: 'Summer Shorts', category: 'shorts', image: 'https://mysite.com/product/shorts-main.jpg', url: 'https://mysite.com/summer-shorts' } ]})import { track } from '@blotout/qinto-sdk-browser'
await track('InitiateCheckout', { currency: 'USD', value: 20.5, checkoutUrl: 'https://www.example.com/path/to/checkout', contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' }, { id: '4423434343', quantity: 2, value: 5, title: 'Summer Shorts', category: 'shorts', image: 'https://mysite.com/product/shorts-main.jpg', url: 'https://mysite.com/summer-shorts' } ]})import { createClient } from '@blotout/qinto-sdk-server'
const qinto = createClient({ destination: 'https://q.example.com', token: process.env.QINTO_EDGE_TOKEN })
await qinto.track('crm-user-8412', 'InitiateCheckout', { currency: 'USD', value: 20.5, checkoutUrl: 'https://www.example.com/path/to/checkout', contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' }, { id: '4423434343', quantity: 2, value: 5, title: 'Summer Shorts', category: 'shorts', image: 'https://mysite.com/product/shorts-main.jpg', url: 'https://mysite.com/summer-shorts' } ]})curl -X POST https://q.example.com/v1/track \ -H 'Authorization: Bearer qwat_…' \ -H 'Content-Type: application/json' \ -d '{ "identifier": "crm-user-8412", "event": "InitiateCheckout", "eventId": "3f2a9c1e-7b64-4d0e-9a51-2c8e6f0d4b17", "properties": { "currency": "USD", "value": 20.5, "checkoutUrl": "https://www.example.com/path/to/checkout", "contents": [ { "id": "123123123", "quantity": 1, "value": 10.5, "title": "Summer Fun", "category": "bracelets", "image": "https://mysite.com/product/fun-main.jpg", "url": "https://mysite.com/summer-fun" }, { "id": "4423434343", "quantity": 2, "value": 5, "title": "Summer Shorts", "category": "shorts", "image": "https://mysite.com/product/shorts-main.jpg", "url": "https://mysite.com/summer-shorts" } ] } }'AddShippingInfo
Section titled “AddShippingInfo”The person submitted their shipping information.
| Name | Type | Required | Description |
|---|---|---|---|
currency |
string | No | The currency for the value specified |
value |
number | No | A numeric value associated with this event |
contents |
Content[] |
No | The products or items related to this event |
qinto.track('AddShippingInfo', { currency: 'USD', value: 20.5, contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' }, { id: '4423434343', quantity: 2, value: 5, title: 'Summer Shorts', category: 'shorts', image: 'https://mysite.com/product/shorts-main.jpg', url: 'https://mysite.com/summer-shorts' } ]})import { track } from '@blotout/qinto-sdk-browser'
await track('AddShippingInfo', { currency: 'USD', value: 20.5, contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' }, { id: '4423434343', quantity: 2, value: 5, title: 'Summer Shorts', category: 'shorts', image: 'https://mysite.com/product/shorts-main.jpg', url: 'https://mysite.com/summer-shorts' } ]})import { createClient } from '@blotout/qinto-sdk-server'
const qinto = createClient({ destination: 'https://q.example.com', token: process.env.QINTO_EDGE_TOKEN })
await qinto.track('crm-user-8412', 'AddShippingInfo', { currency: 'USD', value: 20.5, contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' }, { id: '4423434343', quantity: 2, value: 5, title: 'Summer Shorts', category: 'shorts', image: 'https://mysite.com/product/shorts-main.jpg', url: 'https://mysite.com/summer-shorts' } ]})curl -X POST https://q.example.com/v1/track \ -H 'Authorization: Bearer qwat_…' \ -H 'Content-Type: application/json' \ -d '{ "identifier": "crm-user-8412", "event": "AddShippingInfo", "eventId": "3f2a9c1e-7b64-4d0e-9a51-2c8e6f0d4b17", "properties": { "currency": "USD", "value": 20.5, "contents": [ { "id": "123123123", "quantity": 1, "value": 10.5, "title": "Summer Fun", "category": "bracelets", "image": "https://mysite.com/product/fun-main.jpg", "url": "https://mysite.com/summer-fun" }, { "id": "4423434343", "quantity": 2, "value": 5, "title": "Summer Shorts", "category": "shorts", "image": "https://mysite.com/product/shorts-main.jpg", "url": "https://mysite.com/summer-shorts" } ] } }'AddPaymentInfo
Section titled “AddPaymentInfo”Payment information was added in the checkout flow.
| Name | Type | Required | Description |
|---|---|---|---|
currency |
string | No | The currency for the value specified |
value |
number | No | A numeric value associated with this event |
contents |
Content[] |
No | The products or items related to this event |
qinto.track('AddPaymentInfo', { currency: 'USD', value: 20.5, contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' }, { id: '4423434343', quantity: 2, value: 5, title: 'Summer Shorts', category: 'shorts', image: 'https://mysite.com/product/shorts-main.jpg', url: 'https://mysite.com/summer-shorts' } ]})import { track } from '@blotout/qinto-sdk-browser'
await track('AddPaymentInfo', { currency: 'USD', value: 20.5, contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' }, { id: '4423434343', quantity: 2, value: 5, title: 'Summer Shorts', category: 'shorts', image: 'https://mysite.com/product/shorts-main.jpg', url: 'https://mysite.com/summer-shorts' } ]})import { createClient } from '@blotout/qinto-sdk-server'
const qinto = createClient({ destination: 'https://q.example.com', token: process.env.QINTO_EDGE_TOKEN })
await qinto.track('crm-user-8412', 'AddPaymentInfo', { currency: 'USD', value: 20.5, contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' }, { id: '4423434343', quantity: 2, value: 5, title: 'Summer Shorts', category: 'shorts', image: 'https://mysite.com/product/shorts-main.jpg', url: 'https://mysite.com/summer-shorts' } ]})curl -X POST https://q.example.com/v1/track \ -H 'Authorization: Bearer qwat_…' \ -H 'Content-Type: application/json' \ -d '{ "identifier": "crm-user-8412", "event": "AddPaymentInfo", "eventId": "3f2a9c1e-7b64-4d0e-9a51-2c8e6f0d4b17", "properties": { "currency": "USD", "value": 20.5, "contents": [ { "id": "123123123", "quantity": 1, "value": 10.5, "title": "Summer Fun", "category": "bracelets", "image": "https://mysite.com/product/fun-main.jpg", "url": "https://mysite.com/summer-fun" }, { "id": "4423434343", "quantity": 2, "value": 5, "title": "Summer Shorts", "category": "shorts", "image": "https://mysite.com/product/shorts-main.jpg", "url": "https://mysite.com/summer-shorts" } ] } }'Purchase
Section titled “Purchase”A purchase was made, or the checkout flow completed. This is the only standard event the identity graph records as a conversion.
| Name | Type | Required | Description |
|---|---|---|---|
currency |
string | Yes | The currency for the value specified |
value |
number | Yes | A numeric value associated with this event |
orderId |
string | Yes | The order ID for the transaction, and the conversion dedupe key |
contents |
Content[] |
No | The products or items related to this event |
discounts |
Discount[] |
No | The discount codes used for the transaction |
grossValue |
number | No | The gross value, for destinations configured to use it |
taxCost |
number | No | The tax cost, used to calculate net value if configured |
shippingCost |
number | No | The shipping cost, used to calculate net value if configured |
The event id is the orderId, so a purchase you also send from another system carries the same id in both places and
destinations deduplicate across them. Over HTTP you set eventId yourself, so pass the order id there.
qinto.track('Purchase', { currency: 'USD', value: 20.5, orderId: '190315', discounts: [ { code: 'OFF20', value: '20', type: 'PERCENTAGE' }, { code: 'BONUS150', value: '150', type: 'FLAT' } ], contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' }, { id: '4423434343', quantity: 2, value: 5, title: 'Summer Shorts', category: 'shorts', image: 'https://mysite.com/product/shorts-main.jpg', url: 'https://mysite.com/summer-shorts' } ]})import { track } from '@blotout/qinto-sdk-browser'
await track('Purchase', { currency: 'USD', value: 20.5, orderId: '190315', discounts: [ { code: 'OFF20', value: '20', type: 'PERCENTAGE' }, { code: 'BONUS150', value: '150', type: 'FLAT' } ], contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' }, { id: '4423434343', quantity: 2, value: 5, title: 'Summer Shorts', category: 'shorts', image: 'https://mysite.com/product/shorts-main.jpg', url: 'https://mysite.com/summer-shorts' } ]})import { createClient } from '@blotout/qinto-sdk-server'
const qinto = createClient({ destination: 'https://q.example.com', token: process.env.QINTO_EDGE_TOKEN })
await qinto.track('crm-user-8412', 'Purchase', { currency: 'USD', value: 20.5, orderId: '190315', discounts: [ { code: 'OFF20', value: '20', type: 'PERCENTAGE' }, { code: 'BONUS150', value: '150', type: 'FLAT' } ], contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' }, { id: '4423434343', quantity: 2, value: 5, title: 'Summer Shorts', category: 'shorts', image: 'https://mysite.com/product/shorts-main.jpg', url: 'https://mysite.com/summer-shorts' } ]})curl -X POST https://q.example.com/v1/track \ -H 'Authorization: Bearer qwat_…' \ -H 'Content-Type: application/json' \ -d '{ "identifier": "crm-user-8412", "event": "Purchase", "eventId": "190315", "properties": { "currency": "USD", "value": 20.5, "orderId": "190315", "discounts": [ { "code": "OFF20", "value": "20", "type": "PERCENTAGE" }, { "code": "BONUS150", "value": "150", "type": "FLAT" } ], "contents": [ { "id": "123123123", "quantity": 1, "value": 10.5, "title": "Summer Fun", "category": "bracelets", "image": "https://mysite.com/product/fun-main.jpg", "url": "https://mysite.com/summer-fun" }, { "id": "4423434343", "quantity": 2, "value": 5, "title": "Summer Shorts", "category": "shorts", "image": "https://mysite.com/product/shorts-main.jpg", "url": "https://mysite.com/summer-shorts" } ] } }'Subscribe
Section titled “Subscribe”A person applied to start a paid subscription.
| Name | Type | Required | Description |
|---|---|---|---|
currency |
string | No | The currency for the value specified |
value |
number | No | A numeric value associated with this event |
sourceId |
string | No | The unique identifier of the sign-up source |
qinto.track('Subscribe', { sourceId: 'Email', currency: 'USD', value: 49.99 })import { track } from '@blotout/qinto-sdk-browser'
await track('Subscribe', { sourceId: 'Email', currency: 'USD', value: 49.99 })import { createClient } from '@blotout/qinto-sdk-server'
const qinto = createClient({ destination: 'https://q.example.com', token: process.env.QINTO_EDGE_TOKEN })
await qinto.track('crm-user-8412', 'Subscribe', { sourceId: 'Email', currency: 'USD', value: 49.99 })curl -X POST https://q.example.com/v1/track \ -H 'Authorization: Bearer qwat_…' \ -H 'Content-Type: application/json' \ -d '{ "identifier": "crm-user-8412", "event": "Subscribe", "eventId": "3f2a9c1e-7b64-4d0e-9a51-2c8e6f0d4b17", "properties": { "sourceId": "Email", "currency": "USD", "value": 49.99 } }'Search
Section titled “Search”A search was made.
| Name | Type | Required | Description |
|---|---|---|---|
currency |
string | No | The currency for the value specified |
value |
number | No | A numeric value associated with this event |
search |
string | No | The search query the person entered |
contents |
Content[] |
No | The products or items related to this event |
qinto.track('Search', { currency: 'USD', value: 10.5, search: 'summer', contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' } ]})import { track } from '@blotout/qinto-sdk-browser'
await track('Search', { currency: 'USD', value: 10.5, search: 'summer', contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' } ]})import { createClient } from '@blotout/qinto-sdk-server'
const qinto = createClient({ destination: 'https://q.example.com', token: process.env.QINTO_EDGE_TOKEN })
await qinto.track('crm-user-8412', 'Search', { currency: 'USD', value: 10.5, search: 'summer', contents: [ { id: '123123123', quantity: 1, value: 10.5, title: 'Summer Fun', category: 'bracelets', image: 'https://mysite.com/product/fun-main.jpg', url: 'https://mysite.com/summer-fun' } ]})curl -X POST https://q.example.com/v1/track \ -H 'Authorization: Bearer qwat_…' \ -H 'Content-Type: application/json' \ -d '{ "identifier": "crm-user-8412", "event": "Search", "eventId": "3f2a9c1e-7b64-4d0e-9a51-2c8e6f0d4b17", "properties": { "currency": "USD", "value": 10.5, "search": "summer", "contents": [ { "id": "123123123", "quantity": 1, "value": 10.5, "title": "Summer Fun", "category": "bracelets", "image": "https://mysite.com/product/fun-main.jpg", "url": "https://mysite.com/summer-fun" } ] } }'A sign-up was completed. name and category are flat strings here, not a contents entry.
| Name | Type | Required | Description |
|---|---|---|---|
currency |
string | No | The currency for the value specified |
value |
number | No | A numeric value associated with this event |
name |
string | No | Title of the product or page |
category |
string | No | Category of the item |
qinto.track('Lead', { category: 'offers', name: 'Special Offer', currency: 'USD', value: 49.99})import { track } from '@blotout/qinto-sdk-browser'
await track('Lead', { category: 'offers', name: 'Special Offer', currency: 'USD', value: 49.99})import { createClient } from '@blotout/qinto-sdk-server'
const qinto = createClient({ destination: 'https://q.example.com', token: process.env.QINTO_EDGE_TOKEN })
await qinto.track('crm-user-8412', 'Lead', { category: 'offers', name: 'Special Offer', currency: 'USD', value: 49.99})curl -X POST https://q.example.com/v1/track \ -H 'Authorization: Bearer qwat_…' \ -H 'Content-Type: application/json' \ -d '{ "identifier": "crm-user-8412", "event": "Lead", "eventId": "3f2a9c1e-7b64-4d0e-9a51-2c8e6f0d4b17", "properties": { "category": "offers", "name": "Special Offer", "currency": "USD", "value": 49.99 } }'Content
Section titled “Content”One line item, in the contents array.
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | Yes | ID of the item, such as the product ID |
quantity |
number | Yes | Quantity of the item |
value |
number | Yes | Final price per unit, not the line total |
variantId |
string | No | Variation ID of the item, when a destination keys on it |
sku |
string | No | SKU of the item, when a destination keys on it |
title |
string | No | Title of the item |
description |
string | No | Product description for the item |
category |
string | No | Category of the item; comma separated for several |
brand |
string | No | Brand of the item |
type |
product | product_group |
No | Type of the item |
image |
string | No | Image URL of the item |
url |
string | No | URL of the item |
value is the price of one unit. A line of two shorts at 5 each is { quantity: 2, value: 5 }, and the event’s
own value carries the total.
Discount
Section titled “Discount”A discount code, in the discounts array on Purchase.
| Name | Type | Required | Description |
|---|---|---|---|
code |
string | Yes | The discount code that was applied |
type |
FLAT | PERCENTAGE |
No | Whether the discount is a flat amount or a percentage |
value |
string | No | The value applied for that code |
Discount.value is a string, unlike the event-level value.
Coming from EdgeTag
Section titled “Coming from EdgeTag”The vocabulary is EdgeTag’s, so a site moving from EdgeTag keeps its event names and almost all of its payloads. What differs:
edgetag('tag', …)isqinto.track(…). Same arguments, same position for the payload.Content.item_priceisContent.value. Same meaning, the final price per unit, spelled the same way as the event-level amount.- The conversion key is
orderId, which is also what EdgeTag’sPurchasecalls it. Qinto has notransactionId. sourceis set by the platform, never by the caller. Apps read it from the action.- Offline and replay state live in a server event’s
observedfield. Browser actions carry neither, because the browser transport does not replay accepted actions.