Piano Analytics
Piano Analytics is an enterprise
analytics and audience platform. The destination configures the official Piano
pa SDK with your site id and collection domain, and forwards events via
pa.sendEvent. With loadScript: true it also loads the SDK.
Piano is a web destination in the walkerOS flow:
Installation
npm install @walkeros/web-destination-piano- Integrated
- Bundled
import { startFlow } from '@walkeros/collector';
import { destinationPiano } from '@walkeros/web-destination-piano';
await startFlow({
destinations: {
piano: {
code: destinationPiano,
config: {
loadScript: true,
settings: {
site: 123456789,
collectDomain: 'https://example.pa-cd.com',
},
},
},
},
});Add to your flow.json destinations:
"destinations": {
"piano": {
"package": "@walkeros/web-destination-piano",
"config": {
"loadScript": true,
"settings": {
"site": 123456789,
"collectDomain": "https://example.pa-cd.com"
}
}
}
}Configuration
This destination uses the standard destination config wrapper (consent, data, env, id, ...). For the shared fields see destination configuration. Package-specific fields live under config.settings and are listed below.
Settings
| Property | Type | Description | More |
|---|---|---|---|
site | number | Piano Analytics site id (numeric), from your collection settings | |
collectDomain | string | Collection domain endpoint, like https://xxxxxxx.pa-cd.com | |
options | Record<string, any> | Additional Piano setConfigurations options merged on init |
Mapping
This package does not define custom rule-level settings. For the standard rule fields (consent, condition, data, batch, name, policy) see mapping.
Examples
Custom event
A generic entity action fires a custom Piano event with mapped properties.
{
"name": "entity action",
"data": {
"string": "foo",
"number": 1,
"boolean": true,
"array": [
0,
"text",
false
]
},
"context": {
"dev": [
"test",
1
]
},
"globals": {
"lang": "elb"
},
"custom": {
"completely": "random"
},
"user": {
"id": "us3r",
"device": "c00k13",
"session": "s3ss10n"
},
"nested": [
{
"entity": "child",
"data": {
"is": "subordinated"
}
}
],
"consent": {
"functional": true
},
"id": "a4d76856b028d464",
"trigger": "test",
"entity": "entity",
"action": "action",
"timestamp": 1700000202,
"timing": 3.14,
"source": {
"count": 1,
"trace": "0a1b2c3d4e5f60718293a4b5c6d7e8f9",
"type": "collector",
"schema": "4"
}
}{
"name": "click.action",
"data": {
"map": {
"label": "data.string",
"value": "data.number"
}
}
}pa.sendEvent("click.action", {
"label": "foo",
"value": 1
})Initialization
Destination bootstrap configures Piano with the site id and collection domain.
{
"settings": {
"site": 123456789,
"collectDomain": "https://example.pa-cd.com"
}
}pa.setConfigurations({
"site": 123456789,
"collectDomain": "https://example.pa-cd.com"
})Page view
A page view fires a Piano page.display event with the page name and chapter.
{
"name": "page view",
"data": {
"domain": "www.example.com",
"title": "walkerOS documentation",
"referrer": "https://www.walkeros.io/",
"search": "?foo=bar",
"hash": "#hash",
"id": "/docs/"
},
"context": {
"dev": [
"test",
1
]
},
"globals": {
"pagegroup": "docs"
},
"custom": {
"completely": "random"
},
"user": {
"id": "us3r",
"device": "c00k13",
"session": "s3ss10n"
},
"nested": [
{
"entity": "child",
"data": {
"is": "subordinated"
}
}
],
"consent": {
"functional": true
},
"id": "f0cc5f6fec3d8eeb",
"trigger": "load",
"entity": "page",
"action": "view",
"timestamp": 1700000200,
"timing": 3.14,
"source": {
"count": 1,
"trace": "0a1b2c3d4e5f60718293a4b5c6d7e8f9",
"type": "collector",
"schema": "4"
}
}{
"name": "page.display",
"data": {
"map": {
"page": "data.title",
"page_chapter1": "globals.pagegroup"
}
}
}pa.sendEvent("page.display", {
"page": "walkerOS documentation",
"page_chapter1": "docs"
})Purchase
A completed order fires a Piano transaction.confirmation event with the transaction id, revenue and currency.
{
"name": "order complete",
"data": {
"id": "0rd3r1d",
"currency": "EUR",
"shipping": 5.22,
"taxes": 73.76,
"value": 555
},
"context": {
"shopping": [
"complete",
0
]
},
"globals": {
"pagegroup": "shop"
},
"custom": {
"completely": "random"
},
"user": {
"id": "us3r",
"device": "c00k13",
"session": "s3ss10n"
},
"nested": [
{
"entity": "product",
"data": {
"id": "ers",
"name": "Everyday Ruck Snack",
"color": "black",
"size": "l",
"price": 420
},
"context": {
"shopping": [
"complete",
0
]
},
"nested": []
},
{
"entity": "product",
"data": {
"id": "cc",
"name": "Cool Cap",
"size": "one size",
"price": 42
},
"context": {
"shopping": [
"complete",
0
]
},
"nested": []
},
{
"entity": "gift",
"data": {
"name": "Surprise"
},
"context": {
"shopping": [
"complete",
0
]
},
"nested": []
}
],
"consent": {
"functional": true
},
"id": "235d0d7bd7a213f2",
"trigger": "load",
"entity": "order",
"action": "complete",
"timestamp": 1700000201,
"timing": 3.14,
"source": {
"count": 1,
"trace": "0a1b2c3d4e5f60718293a4b5c6d7e8f9",
"type": "collector",
"schema": "4"
}
}{
"name": "transaction.confirmation",
"data": {
"map": {
"transaction_id": "data.id",
"revenue": "data.value",
"currency": "data.currency"
}
}
}pa.sendEvent("transaction.confirmation", {
"transaction_id": "0rd3r1d",
"revenue": 555,
"currency": "EUR"
})Loading the SDK
With loadScript: true, the destination adds the SDK script
https://tag.aticdn.net/piano-analytics.js and configures pa with site,
collectDomain and options once the script has loaded. Events pushed while
the script loads wait for it, including the page view a browser source sends
when the flow starts. If the script is blocked or fails to load, later pushes
fail and show up as failed events. A missing site or collectDomain fails
the destination with a config error, and a rule with silent: true sends no
event.
If Piano's SDK is already on your page before walkerOS starts, leave
loadScript unset. The destination then configures pa at init.
Event names
Each rule's name becomes the Piano event name and its data object the event
properties, as in the examples above. Without a rule, the destination sends the
walkerOS event name, like page view, with no properties.