Pendo
Datafly Signal delivers product analytics events to Pendo server-to-server, enriching visitor and account profiles with backend-resolved traits.
Why route Pendo through Datafly Signal
- Your numbers stop depending on what the browser allows. Client-side analytics loses every visit where the tag is blocked or the page unloads early. Signal delivers from the server, so Pendo receives the complete event stream.
- Client IP and user agent are carried in the payload. Both are taken from the original visitor request rather than your server, which is what Pendo needs to attribute the event to the right session.
- One consent decision governs every destination. Pendo is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.
Prerequisites
A Pendo subscription with admin access to the application you want to send events into, and that application’s Track Event shared secret.
Get your Pendo credentials
Step 1: Find the Track Event shared secret
- In Pendo, go to Settings > Subscription settings > Applications and open your app.
- Under App Details, click Show next to Track Event shared secret and copy it.
The Track Event shared secret authenticates server-side Track Events (sent as the x-pendo-integration-key header). It is not the API key in your install snippet, and it is not an integration key.
Step 2: Note your data region
Your region is the host you log in to: app.pendo.io (US), app.eu.pendo.io (EU), us1.app.pendo.io (US1), app.jpn.pendo.io (Japan) or app.au.pendo.io (Australia). Signal sends Track Events to the matching host: data.pendo.io, data.eu.pendo.io, us1.data.pendo.io, data.jpn.pendo.io or data.au.pendo.io.
Configure the integration in Signal
Configuration Fields
| Field | Required | Description |
|---|---|---|
integration_key | Yes | The Track Event shared secret from Step 1. |
region | No | us (default), eu, us1, jpn or au. Selects the Track Event host. |
Management API Setup
curl -X POST http://localhost:8084/v1/admin/integration-catalog/pendo/install \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Pendo",
"variant": "saas",
"config": {
"integration_key": "your_track_event_shared_secret",
"region": "eu"
},
"delivery_mode": "server_side"
}'What Signal sends
Each event is one Track Event (POST https://data.pendo.io/data/track, or your region’s host):
{
"type": "track",
"event": "subscription_started",
"visitorId": "crm-user-7",
"accountId": "acme-co",
"timestamp": 1758500000123,
"properties": { "plan_name": "Pro", "revenue": 99, "currency": "GBP" },
"context": { "ip": "203.0.113.7", "userAgent": "Mozilla/5.0 ...", "url": "https://app.example.com/billing", "title": "Billing" }
}| Pendo field | Source |
|---|---|
visitorId (required) | The signed-in user ID, else the Signal anonymous ID. Use the same ID your Pendo snippet passes as visitor.id. |
accountId | The group() ID. |
timestamp (required) | Event time, epoch milliseconds. Pendo processes past timestamps in its daily reprocessing and may ignore events older than seven days. |
context | Visitor IP, user agent, page URL and title. |
properties | The event’s documented properties (see the event specs), currency upper-cased. Pendo rejects a properties object over 512 bytes, so only mapped properties are sent: no item arrays and no free-text feedback. |
No personal data is sent.
Presets
| Preset | Events |
|---|---|
| Default | sign_up, login, logout, onboarding_completed, trial_started, trial_converted, subscription_started, subscription_upgraded, subscription_downgraded, subscription_cancelled, feature_used, support_ticket_created, feedback_submitted |
| B2B / SaaS | The full SaaS event spec: leads and demos, authentication, onboarding, trial and subscription, product usage, reports and exports, integrations, support, referrals, invitations and seats. |
Page views are not sent: the Pendo snippet records pages and clicks itself. Event names are Signal’s canonical names; rename them on the installed integration to match your Pendo naming convention.
Consent
Default consent category: analytics.
Verify it’s working
- In the Signal Management UI, open your Pendo integration and watch the Live Events stream as you trigger events.
- Confirm 200 responses from the Track Event endpoint.
- In Pendo, open Track Events; new event names appear after Pendo’s hourly processing.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
401 or 403 | Wrong secret | Use the Track Event shared secret, not the snippet API key. |
404 | Wrong region | Set region to the region you log in to. |
| Events on the wrong visitor | visitorId mismatch | Make sure the user ID passed to datafly.identify() is the one your Pendo snippet uses. |
| ”event properties JSON too large” in Pendo | Properties over 512 bytes | Map fewer or shorter properties on the installed integration. |
Blueprint
The Pendo blueprint version is 0.4.0 (not yet tested against a live Pendo subscription).