Signal Delivery Payloads
Deliver Funnel and Signal context to external destinations while preserving the current compatibility payload contract.
Use signal delivery when Funnel follow-up or a reviewed Signal should leave Prevenue for the teams and tools that own the next action.
Configure providers in Settings > Integrations, then select the approved team or destination behavior from the Funnel. Signal detail and Integration Activity show the resulting delivery history.
Final docs URL: https://docs.prevenue.ai/workflows/automation-routing-payloads
Team notifications
Team notifications are managed by the selected operational teams. Each selected team controls its own Slack and email notification setup in Prevenue settings.
Use team notifications for internal alerts and handoffs. Slack is not selected as an external destination because it is already controlled at the team level.
External destinations
A Funnel follow-up can route Signal context to any approved combination of external destinations:
| Destination | What happens | Setup needed |
|---|---|---|
| Webhook | Sends one signed JSON signal payload to each selected webhook endpoint. | One or more active webhook endpoints, each with its own URL and signing secret. |
| Customer.io | Syncs the signal through Customer.io Pipelines, updates managed audience state, and runs only explicitly configured Customer.io data actions. | Customer.io region and Pipelines API Key. Service Account Token plus Workspace URL or ID is required for managed audiences or manual segments. |
Selected external destinations are independent. If one webhook endpoint fails, other selected endpoints can still receive the payload. If webhook is ready and Customer.io is missing credentials, webhook can still deliver while Customer.io records a skipped delivery row.
Webhook delivery must select at least one endpoint and can select up to five endpoints. Disabled endpoints cannot be selected for publication.
Routed payload example
Each delivery receives one versioned payload. A compact webhook delivery can look like this:
{
"schema_version": "2026-06-27.lea-442",
"event": "prevenue.signal.routed",
"kind": "signal",
"workspace": {
"id": "workspace_123"
},
"delivery": {
"id": "delivery_123",
"attempt_at": "2026-06-29T15:30:00.000Z",
"idempotency_key": "2026-06-27.lea-442:workspace_123:webhook:workspace_webhook:destination:webhook_endpoint_123:signal_123:evidence:evidence_123",
"provider": "webhook",
"route_kind": "workspace_webhook"
},
"signal": {
"id": "signal_123",
"category": "grow",
"priority": "high",
"status": "new",
"type": "upgrade_ready"
},
"account": {
"id": "account_123",
"external_id": "acct_acme",
"billing_customer_id": "cus_123",
"display_name": "Acme Co",
"domain": "acme.example",
"email": "billing@acme.example",
"identities": ["acct_acme", "cus_123", "acme.example", "billing@acme.example"],
"mrr": 4800,
"plan_name": "Scale",
"status": "active"
},
"person": {
"email": "champion@acme.example",
"user_id": "user_456"
},
"recommendation": {
"reason": "Usage and feature adoption are accelerating.",
"recommended_action": "Enroll in the expansion campaign."
},
"evidence": {
"summary": "Usage and feature adoption are accelerating.",
"references": [
{
"event_id": "event_123",
"event_name": "export_completed",
"external_account_id": "acct_acme",
"occurred_at": "2026-06-29T14:45:00.000Z",
"semantic_type": "activation",
"sentiment": "positive",
"sentiment_score": 0.61,
"source": "segment",
"value": 12
}
]
},
"account_intelligence": [
{
"score_key": "expansion_readiness",
"score": 91,
"score_label": "Expansion ready",
"confidence_label": "high",
"recommended_action": "Enroll in expansion campaign.",
"source_signal_ids": ["signal_123"],
"top_reason": "Feature usage and sentiment are rising together."
}
],
"pii_policy": {
"account_display_name_included": true,
"account_metadata_included": false,
"contact_identifiers_included": true,
"contact_names_included": false,
"customer_email_included": true,
"evidence_properties_included": false,
"redacted_field_count": 0,
"truncated": false,
"truncated_sections": []
},
"prevenue": {
"schema_version": "2026-06-27.lea-442",
"automation": {
"id": "automation_123",
"name": "Expansion motion",
"routing_key": "upgrade_ready",
"rule_key": "upgrade_ready",
"version": "4"
},
"route": {
"channels": ["webhook", "customer_io"],
"destination_id": "webhook_endpoint_123",
"destination_name": "Warehouse ingest",
"provider": "webhook",
"route_kind": "workspace_webhook",
"routing_key": "upgrade_ready"
},
"signal": {
"id": "signal_123",
"category": "grow",
"confidence": 0.87,
"confidence_label": "high",
"priority": "high",
"reason": "Usage and feature adoption are accelerating.",
"recommended_action": "Enroll in the expansion campaign.",
"status": "new",
"type": "upgrade_ready"
},
"intelligence": {
"account_scores": [
{
"score_key": "expansion_readiness",
"score": 91,
"score_label": "Expansion ready",
"confidence_label": "high",
"recommended_action": "Enroll in expansion campaign.",
"source_signal_ids": ["signal_123"],
"top_reason": "Feature usage and sentiment are rising together."
}
],
"consolidated_counts": {
"category_event_counts": { "activation": 36, "usage": 92 },
"matched_evidence_events": 5,
"source_event_counts": { "direct": 92, "segment": 36 },
"total_events_scored": 128
},
"event_kpis": [
{
"key": "event_momentum_score_30d",
"value": 87,
"window": "30d",
"evidence_band": "usable",
"sample_size": 92,
"sentiment_distribution": { "negative": 2, "neutral": 9, "positive": 81 },
"semantic_distribution": { "activation": 36, "usage": 92 }
}
],
"prediction_readiness": {
"label": "ready",
"score": 0.76,
"caveats": ["Small sample for renewal events"],
"gaps": ["Missing billing renewal date"]
}
},
"payload": {
"max_serialized_bytes": 64000,
"redacted_field_count": 0,
"truncated": false,
"truncated_sections": []
}
}
}The snippets below call out the sections most receivers use for identity, branching, and intelligence.
Payload identity
Routed payloads include enough account context for the receiver to know who the signal belongs to:
- Prevenue account ID.
- External account key.
- Billing customer ID when known.
- Account display name, domain, plan, MRR, and status when known.
- Account email or person email only when Prevenue already has that identifier.
- Up to 10 account identity values.
- Up to 20 safe account metadata keys.
Example identity fields:
{
"account": {
"id": "account_123",
"external_id": "acct_acme",
"billing_customer_id": "cus_123",
"display_name": "Acme Co",
"domain": "acme.example",
"email": "billing@acme.example",
"identities": ["acct_acme", "cus_123", "acme.example", "billing@acme.example"]
},
"person": {
"email": "champion@acme.example",
"user_id": "user_456"
}
}For Customer.io, Prevenue uses the account external ID, account key, or Prevenue account ID as the account groupId. People actions such as manual segment updates require a known person.user_id or person.email.
Compatibility rule and route fields
Payloads retain the prevenue.automation object for compatibility with existing delivery workers and receivers. Treat it as rule provenance, not as a customer-facing product destination:
{
"prevenue": {
"automation": {
"id": "automation_123",
"name": "Expansion motion",
"routing_key": "upgrade_ready",
"rule_key": "upgrade_ready",
"version": "4"
},
"route": {
"channels": ["webhook", "customer_io"],
"destination_id": "webhook_endpoint_123",
"destination_name": "Warehouse ingest",
"provider": "webhook",
"route_kind": "workspace_webhook",
"routing_key": "upgrade_ready"
}
}
}Use prevenue.automation.routing_key, prevenue.automation.name, prevenue.route.destination_id, or signal.type to branch inside receiving tools.
Prevenue intelligence
Webhook and Customer.io signal payloads include Prevenue-only intelligence when available:
- Account scores from Prevenue account intelligence.
- Signal confidence and confidence label.
- Prediction readiness score, label, caveats, and gaps.
- Event KPI rows with key, value, window, evidence band, sample size, sentiment distribution, and semantic distribution.
- Consolidated counts for total events scored, matched evidence events, event categories, and event sources.
- Evidence references for the most relevant recent events.
Example:
{
"prevenue": {
"intelligence": {
"account_scores": [
{
"score_key": "expansion_readiness",
"score": 91,
"score_label": "Expansion ready",
"confidence_label": "high",
"top_reason": "Feature usage and sentiment are rising together."
}
],
"consolidated_counts": {
"category_event_counts": { "activation": 36, "usage": 92 },
"matched_evidence_events": 5,
"source_event_counts": { "direct": 92, "segment": 36 },
"total_events_scored": 128
},
"event_kpis": [
{
"key": "event_momentum_score_30d",
"value": 87,
"window": "30d",
"evidence_band": "usable",
"sample_size": 92,
"sentiment_distribution": { "negative": 2, "neutral": 9, "positive": 81 }
}
]
}
}
}Customer.io shaping
Customer.io receives:
groupcalls for account-level traits.identifycalls only when Prevenue has a person email or stable person ID.trackcalls namedprevenue_signal_routed.trackcalls namedprevenue_managed_audience_state_syncedwhen Prevenue recomputes managed audience state.
The track properties include flattened signal fields plus the nested prevenue object. Customer.io Journeys can branch on fields such as:
signal_categorysignal_prioritysignal_typeprevenue.automation.routing_keyprevenue.intelligence.consolidated_counts.total_events_scoredprevenue.intelligence.event_kpis[0].key
Customer.io identify and group traits also include active managed-audience fields when available:
{
"prevenue_signal_type": "upgrade_ready",
"prevenue_signal_category": "grow",
"prevenue_signal_priority": "high",
"prevenue_score_key": "expansion_readiness",
"prevenue_score_label": "Expansion ready",
"prevenue_active_audience_key": "upgrade_ready",
"prevenue_active_signal_type": "upgrade_ready",
"prevenue_active_signal_category": "grow",
"prevenue_active_signal_priority": "high",
"prevenue_active_signal_status": "new",
"prevenue_active_until": "2026-07-29T15:30:00.000Z",
"prevenue_conflict_group": "lifecycle_motion",
"prevenue_active_ttl_days": 30,
"prevenue_active_ttl_source": "motion_default"
}Default managed audiences are upgrade_ready, annual_conversion, team_expansion, premium_feature_intent, topup_growth, sales_assist, retention_rescue, downgrade_prevention, payment_recovery, support_recovery, trial_conversion, checkout_recovery, and free_to_paid. Active save signals suppress grow and convert audiences; resolved, suppressed, stale, disabled, won, and lost remove active managed-audience membership. Manual segment actions run only when they have been explicitly saved in Customer.io manual actions.
Values to branch on
Use machine values for routing conditions, segment membership, Journey entry, and webhook consumers. Display labels can change; these values are the stable contract.
| Field | Where it appears | Common values |
|---|---|---|
signal.type | Webhook payload, nested Customer.io prevenue.signal.type, Customer.io event property signal_type | upgrade_ready, topup_to_plan, annual_ready, team_expansion, premium_feature_intent, limit_expansion, sales_assist, usage_drop_risk, login_drop_risk, downgrade_intent, cancel_intent, support_friction, contraction_risk, payment_risk_with_low_usage, trial_activated_not_paid, checkout_abandoned, free_user_high_usage, integration_connected_trial, team_invited_trial, event_grudging_dependency, event_friction_rescue, event_healthy_momentum_growth |
signal.category | Webhook payload, nested Customer.io prevenue.signal.category, Customer.io event property signal_category | grow, save, convert, watch |
signal.priority | Webhook payload, nested Customer.io prevenue.signal.priority, Customer.io event property signal_priority | low, medium, high, critical |
account_intelligence[].score_key | Webhook payload, nested Customer.io prevenue.intelligence.account_scores, Customer.io group trait prevenue_score_key | expansion_readiness, conversion_readiness, contraction_risk, churn_risk, payment_risk, data_confidence |
account_intelligence[].score_label | Webhook payload, nested Customer.io prevenue.intelligence.account_scores, Customer.io group trait prevenue_score_label | ready, high, medium, low, critical, elevated, blocked |
prevenue.automation.routing_key | Webhook payload and nested Customer.io prevenue.automation.routing_key | Usually the signal type, such as upgrade_ready, unless the automation has a custom routing key. |
watchlist exists as an internal signal type, but watch signals are not sent to Customer.io live syncs. Webhook consumers can still see watch category values only when a route explicitly allows that workflow.
Payload safety
Prevenue bounds and redacts routed payloads:
- No raw provider payload dumps.
- No credentials, auth headers, bearer values, passwords, secrets, cookies, signatures, webhook URLs, or API keys.
- URLs and suspicious token-like values are redacted in metadata and event properties.
- Evidence references are capped.
- Event properties, metadata keys, identities, arrays, nested depth, and total serialized payload size are capped.
pii_policyandprevenue.payloadreport redaction and truncation.
If a receiver needs a field that is missing, add the field to the source event or account identity model first, then verify it in the Signal or Funnel delivery preview.
Activity rows
Routing writes delivery activity for:
- Delivery attempts.
- Successful sends.
- Failed provider responses.
- Missing credentials.
- Disabled destinations.
- Missing Customer.io person identifiers for people-only actions.
- Duplicate delivery suppression by idempotency key.
Use activity rows to debug partial delivery. A skipped Customer.io route does not mean Slack or webhook failed.