IntegrationsAnalyticsPiano Analytics

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

  1. Sign in to Piano Analytics.
  2. Open the property you want to send data to.
  3. Note the numeric Site ID (also called s) from your property settings. It looks like 123456789.

Step 2: Find your Collection Domain

Piano assigns each organisation a dedicated collection domain so data is only ingested on hosts you own.

  1. In Piano Analytics, go to Data Collection > Collection Domains.
  2. Copy your assigned domain (for example xxxxxxxx.pa-cd.com).
  3. 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

FieldRequiredDescription
collection_domainYesYour dedicated Piano collection domain, e.g. xxxxxxxx.pa-cd.com (no scheme, no trailing slash).
site_idYesYour 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.

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/plain

The 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.

SignalWhereDescription
idclientQuery parameterVisitor 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_iddata.user_idAuthenticated 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.

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 statevisitor_privacy_modevisitor_privacy_consent
Grantedoptintrue
Denied / unknownexemptfalse

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 eventPiano event
pagepage.display
Products Searchedinternal_search_result.display
Element Clickedclick.action

Retail preset

Signal eventPiano event
pagepage.display
Product Viewedproduct.page_display
Product Addedproduct.add_to_cart
Cart Viewedcart.display
Order Completedtransaction.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

ProblemSolution
No events in PianoVerify 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 togetherConfirm 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 errorsA property name exceeds 40 characters or uses unsupported characters. Piano property keys must be lowercase, alphanumeric plus underscore, max 40 chars.
Consent treatment looks wrongCheck that the visitor_privacy_mode value map matches the consent mode names configured in your Piano privacy settings.
Ecommerce analyses emptyproduct.page_display requires product_id; cart.display requires cart_id; transaction.confirmation requires both cart_id and transaction_id. Ensure these are mapped.