Piano Analytics
Datafly Signal delivers events to Piano Analytics (formerly AT Internet) server-to-server using the Collection API. This sends page views, on-site search, clicks, and the full Sales Insights ecommerce funnel directly from your infrastructure — no client-side SDK, immune to ad blockers and browser tracking prevention.
Prerequisites
Before configuring Piano Analytics in Signal, you need an active Piano Analytics property and two pieces of information.
Step 1: Find your Site ID
- Sign in to Piano Analytics.
- Open the property you want to send data to.
- Note the numeric Site ID (also called
s) from your property settings. It looks like123456789.
Step 2: Find your Collection Domain
Piano assigns each organisation a dedicated collection domain so data is only ingested on hosts you own.
- In Piano Analytics, go to Data Collection > Collection Domains.
- Copy your assigned domain (for example
xxxxxxxx.pa-cd.com). - Use the domain without
https://and without a trailing slash.
The Collection API has no API key or access token. Your account is identified by the dedicated collection domain plus the Site ID — both are required.
Configure in Signal
Configuration Fields
| Field | Required | Description |
|---|---|---|
collection_domain | Yes | Your dedicated Piano collection domain, e.g. xxxxxxxx.pa-cd.com (no scheme, no trailing slash). |
site_id | Yes | Your numeric Piano Analytics Site ID. Sent as the required s query parameter on every event. |
Management UI Setup
Add the integration
Go to Integrations > Add Integration > Piano Analytics.
Choose a preset
- Default — page displays, on-site search, and click actions.
- Retail — adds the Sales Insights ecommerce funnel (product impressions, add-to-cart, cart display, transaction confirmation).
Enter your details
Fill in collection_domain and site_id.
Select consent categories
Choose the consent category that governs analytics (typically analytics or marketing). Signal maps the visitor’s consent state to Piano’s visitor_privacy_mode and visitor_privacy_consent properties.
Save
Click Save. Events begin delivering on the next matching browser event.
API Endpoint
POST https://{collection_domain}/event?s={site_id}&idclient={visitor_id}
Content-Type: text/plainThe request body is a JSON object containing an events array. Each event has a dotted name and a data object of snake_case properties:
{
"events": [
{
"name": "page.display",
"data": {
"page": "Homepage",
"page_full_name": "https://example.com/",
"user_id": "user-123"
}
}
]
}The Collection API uses Content-Type: text/plain — the raw body is parsed as JSON server-side. Signal sets this automatically.
Identity Signals
Piano Analytics matches events to a visitor using the idclient value — a stable per-visitor identifier passed as a URL query parameter.
| Signal | Where | Description |
|---|---|---|
idclient | Query parameter | Visitor ID. Signal sends its first-party anonymous_id (a UUID stored in the _dfid cookie). This is what stitches a visitor’s events together. |
user_id | data.user_id | Authenticated user ID, set when a visitor is identified via datafly.identify(). |
How to identify a user
Call datafly.identify() when a user logs in or registers:
datafly.identify("user-123");Signal sends the supplied ID as user_id. The visitor’s idclient remains stable across sessions so logged-out and logged-in activity are linked.
Piano Analytics’ Collection API does not require hashed PII for matching — identity is carried by the first-party idclient and the optional user_id. Signal does not send raw email or phone to Piano.
Consent
Signal maps the visitor’s canonical marketing consent to Piano’s two consent properties on every event, so your Piano privacy treatment and exemption rules apply correctly:
| Consent state | visitor_privacy_mode | visitor_privacy_consent |
|---|---|---|
| Granted | optin | true |
| Denied / unknown | exempt | false |
The exact mode names (optin, exempt, optout, etc.) depend on the consent modes configured in your Piano Analytics privacy settings. Adjust the value map in the integration’s Field Mappings if your organisation uses custom mode names.
Event Mapping
Default preset
| Signal event | Piano event |
|---|---|
page | page.display |
Products Searched | internal_search_result.display |
Element Clicked | click.action |
Retail preset
| Signal event | Piano event |
|---|---|
page | page.display |
Product Viewed | product.page_display |
Product Added | product.add_to_cart |
Cart Viewed | cart.display |
Order Completed | transaction.confirmation |
To customise, edit the integration’s Field Mappings in the Management UI.
Example: Purchase event
Datafly.js call:
datafly.track("Order Completed", {
order_id: "TXN-001",
cart_id: "CART-9",
revenue: 129.99,
currency: "EUR",
coupon: "SUMMER10",
payment_method: "card"
});Piano Analytics Collection API request sent by Signal:
POST https://xxxxxxxx.pa-cd.com/event?s=123456789&idclient=9e8d6d5f-143a-4a21-a7d5-7348b56e130d
Content-Type: text/plain{
"events": [
{
"name": "transaction.confirmation",
"data": {
"idclient": "9e8d6d5f-143a-4a21-a7d5-7348b56e130d",
"cart_id": "CART-9",
"transaction_id": "TXN-001",
"cart_currency": "EUR",
"cart_turnovertaxincluded": 129.99,
"transaction_promocode": "SUMMER10",
"payment_mode": "card",
"visitor_privacy_mode": "optin",
"visitor_privacy_consent": "true"
}
}
]
}Testing
Trigger an event
Browse your site (or run a datafly.track() call) so an event flows through Signal.
Watch it in Signal
Open the Event Debugger in the Management UI and confirm the outgoing Piano request shows the correct name, data properties, and a 200 response.
Confirm in Piano Analytics
In Piano Analytics, open Data Flow (real-time) or run a Data Query for the last few minutes. Your page.display / transaction.confirmation events should appear, attributed to the visitor’s idclient.
Troubleshooting
| Problem | Solution |
|---|---|
| No events in Piano | Verify the collection_domain is your dedicated domain (from Data Collection > Collection Domains) and site_id is correct. A wrong domain returns 404. |
| Visitors not stitching together | Confirm idclient is present on the request URL. It is sourced from Signal’s anonymous_id; if the _dfid cookie is missing, each event will look like a new visitor. |
400 errors | A property name exceeds 40 characters or uses unsupported characters. Piano property keys must be lowercase, alphanumeric plus underscore, max 40 chars. |
| Consent treatment looks wrong | Check that the visitor_privacy_mode value map matches the consent mode names configured in your Piano privacy settings. |
| Ecommerce analyses empty | product.page_display requires product_id; cart.display requires cart_id; transaction.confirmation requires both cart_id and transaction_id. Ensure these are mapped. |