PagerDuty
Datafly Signal triggers PagerDuty incidents from Signal events using the Events API v2. Useful for waking the on-call engineer when delivery error rates spike, payments fail at the threshold, or a business-critical event needs an immediate human response.
Alpha integration. Events API v2 triggers work end-to-end and the default preset covers Error Occurred and Payment Failed. Acknowledge and resolve actions ship behind the same spec but currently require manual blueprint editing. Contact your account team for help mapping Signal events into your PagerDuty service hierarchy.
Prerequisites
- A PagerDuty account with at least one service.
- Permission to add integrations to that service.
- A clear sense of which events should page on-call — PagerDuty is for “wake someone up” alerts, not general notifications. For general notifications use Microsoft Teams instead.
Get your credentials
Step 1: Pick or create a PagerDuty service
- In PagerDuty, go to Services > Service Directory.
- Click New Service if you do not already have one for Signal alerts.
- Set the name (e.g. Signal Delivery Alerts), an escalation policy, and an incident urgency policy.
- Click Create.
Step 2: Add an Events API v2 integration
- On the service page, open the Integrations tab.
- Click Add an integration.
- Search for and select Events API V2.
- Click Add Integration.
Step 3: Copy the routing key
PagerDuty now shows the Integration Key (also called the Routing Key) — a 32-character hex string.
Store this routing key as a secret. Anyone holding it can create incidents on the service. Treat it like a password.
- Copy the key.
Configure in Signal
Configuration fields
| Field | Required | Description |
|---|---|---|
routing_key | Yes | The 32-character Events API v2 integration key from PagerDuty. Stored as a secret. |
severity_default | No | One of critical, error (default), warning, info. Applied when severity is not mapped from the event. |
source_default | No | The PagerDuty payload.source to use when not overridden by the blueprint. Defaults to datafly-signal. |
Management UI setup
- Go to Integrations > Add Integration > PagerDuty.
- Paste the
routing_key. - Select the General preset.
- Leave consent categories at the default (
essential) — PagerDuty traffic is operational alerting. - Click Save.
Management API setup
curl -X POST http://localhost:8084/v1/admin/integrations \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"source_id": "src_abc123",
"vendor": "pagerduty",
"name": "PagerDuty - Signal Delivery Alerts",
"enabled": true,
"config": {
"routing_key": "0123456789abcdef0123456789abcdef",
"severity_default": "error"
},
"consent_categories": ["essential"]
}'API endpoint
POST https://events.pagerduty.com/v2/enqueue
Content-Type: application/jsonThe routing key is sent in the JSON body, not in a header. Signal handles this automatically — the customer never embeds the key in mappings.
Event mapping
General preset
| Signal event | PagerDuty event_action | Severity | dedup_key source |
|---|---|---|---|
Error Occurred | trigger | error | properties.error_class |
Payment Failed | trigger | warning | properties.order_id |
Every event renders into the Events API v2 payload shape. Default mappings are:
| PagerDuty field | Source |
|---|---|
routing_key | from integration config |
event_action | static "trigger" (override per event for acknowledge / resolve) |
dedup_key | per-event mapping (groups related events into one incident) |
payload.summary | per-event mapping (the human-readable headline) |
payload.severity | per-event mapping (critical, error, warning, info) |
payload.source | static "datafly-signal" |
payload.custom_details | full properties object |
Example: Error Occurred
Datafly.js call (or server-side Datafly.track()):
datafly.track("Error Occurred", {
message: "Stripe webhook handler timed out after 30s",
error_class: "stripe.webhook.timeout",
order_id: "ORD-001",
attempt: 3
});PagerDuty payload sent by Signal:
{
"routing_key": "0123456789abcdef0123456789abcdef",
"event_action": "trigger",
"dedup_key": "stripe.webhook.timeout",
"payload": {
"summary": "Stripe webhook handler timed out after 30s",
"severity": "error",
"source": "datafly-signal",
"custom_details": {
"message": "Stripe webhook handler timed out after 30s",
"error_class": "stripe.webhook.timeout",
"order_id": "ORD-001",
"attempt": 3
}
}
}PagerDuty creates a new incident on the first event with a given dedup_key and folds subsequent matching events into that incident until it is resolved.
Recommended use patterns
- Delivery error thresholds. Configure a pipeline filter so events fire only when a vendor’s error rate crosses a threshold. Avoid raw error pass-through, which will drown the on-call rotation.
- Business-rule incidents. Trigger for high-value events (e.g. an order above £10,000 fails) so the right team intervenes before the customer churns.
- Payment processor outages. Wire
Payment Failedwithdedup_keyset to the processor name to surface a single incident per outage window.
Identity
Signal sends no identity data to PagerDuty. The Events API v2 payload contains only the event headline, severity, source, dedup key, and the explicitly mapped property values inside custom_details. IP address, user agent, and cookie identifiers are stripped before delivery.
PagerDuty is for on-call signalling, not analytics. If you map sensitive customer fields into custom_details they will appear in incident timelines — review what you forward.
Consent
The default consent category is essential. PagerDuty traffic is treated as operational alerting and fires regardless of the end-user’s marketing-consent state. This matches how most legal teams classify on-call paging.
If your governance policy requires this integration to honour marketing or analytics consent, change the consent category in the Management UI — but be aware that withdrawing consent will then silence incidents about events triggered by that user.
Verify it’s working
Step 1: Fire a test event
datafly.track("Error Occurred", {
message: "Test incident from Datafly Signal",
error_class: "signal.test"
});Step 2: Check PagerDuty
Within a few seconds, a new incident titled Test incident from Datafly Signal should appear on the service.
Step 3: Inspect the Signal event debugger
In the Signal Management UI, open the integration’s Recent Events tab. You should see the event with a 202 response (PagerDuty’s success code) and the full Events API v2 payload.
Step 4: Resolve the test incident
Resolve the test incident manually in PagerDuty so it does not leave on-call noise behind.
Troubleshooting
| Problem | Solution |
|---|---|
| Events return 400 with “Routing key invalid” | The routing_key is wrong or the integration was deleted in PagerDuty. Recreate the Events API v2 integration and update the config. |
| Events return 202 but no incident appears | Check the service’s incident urgency rules — events with severity: info may not generate paging incidents under certain configurations. |
| Multiple incidents created for the same root cause | The dedup_key mapping is not set or maps to a unique value per event. Map a stable identifier (error class, processor name) rather than a transaction ID. |
| Incidents trigger but on-call is not paged | This is configured in PagerDuty’s escalation policy, not Signal. Check the service’s escalation rules. |
| 429 rate-limit response | PagerDuty caps the Events API at 120 events/minute per integration key. Signal rate-limits below this; if you still see 429s, add upstream filtering so only true alerts reach the integration. |
See also
- PagerDuty Events API v2 reference
- PagerDuty deduplication guide
- Microsoft Teams integration — for general-purpose channel notifications instead of paging