You probably do not need this page. It covers packaging a partner platform as a reusable integration — a connector meant to be installed and maintained across accounts. To get your own purchases, shipments, or account activity into Extole, send them to the Events API or use one of the paths in Integrating with Extole; if Extole already maintains a source for the platform, install it from the My Extole Integrations page.When packaging is the job, run the build through the Extole MCP server in an agentic coding tool rather than issuing these calls by hand — see Build with Extole AI Tools.
Overview
A packaged inbound integration receives events from a partner platform and turns each one into a canonical Extole business event:input_event trigger rule, the canonical name on the business-event component.
The three views are the same for every category — see Integration Categories. Chart and stream this integration’s canonical business events, and build the sender against Send Platform Events to Extole.
This page assumes the event arrives with a name in event_name and its fields readable in data. When the partner’s own webhook defines the payload instead, a prehandler renames and flattens it first — see Normalize Inbound Events with a Prehandler.
Add Reusable Business Events
Choose the template by meaning:template_transacted_business_event— the event carries transaction value or represents the program outcome.template_tracked_business_event— a lifecycle milestone without transaction value.
businessEvents socket:
Name Each Event for Its Outcome
Use the canonical v10 name for the business outcome:converted, shipped, canceled, returned, account_opened, application_approved. Do not use a transport-specific name such as partner_order_created, and do not create duplicate legacy controllers alongside the reusable component.
Create one business event per distinct outcome. Two wire events share one only when nobody would need them apart in a report, a rule, or a clawback: a refunded charge is returned, not canceled.
Set the Reporting and Ordering Variables
Set these on every duplicate:
Two events from the same template report under identical labels until you override these: a tracked template calls everything “Tracked Events” with a “Tracked Event Rate”, and
singularNounName defaults to an expression echoing the display name.
Set the Alias Set the Platform Already Uses
Setaliases to the set the platform already uses, read from an existing program’s business event of the same name. They are additional names the business event matches, and platform consumers subscribe to them: an extension listening for outcome sees a converted event only because converted carries that alias.
Do not invent partner-flavored aliases or clear a set the template provides. One alias must never appear on two business events in one campaign, which makes the match ambiguous.
Preserve the Journey and Role Defaults
Inspect the duplicated component’s evaluatedjourneyName and roleName. Both depend on the surrounding role and journey hierarchy, so keep the template’s defaults unless the contract requires otherwise, and record the published values during verification.
Configure Input Event Rules
Duplicateinput_event from the rules program into each triggerRules socket:
input_event, and put the partner event name in triggerEventNames. When a prehandler renames the event, list the name the prehandler produces — an integration-owned name such as example_order_completed, never the canonical name the business event carries. A rule still listening for the wire name never matches, and reads as correct in the component tree. Add a legacy alias only when a real sender still emits it.
Configure Event Data
Create the data components in the same run as their business events. A business event with an emptydata socket produces a step with no transaction identifier, no person key, and no value, so nothing downstream can deduplicate, attribute, reward, or report on it.
Take the field names from the partner’s documented payload — a partner page in this documentation set, the partner’s developer documentation, or a captured sample. One unknown field does not defer the rest.
Define the mapping first:
Duplicate one
business_event_data component into the data socket for each field:
valueExpression explicitly when the partner field and Extole field have distinct names — do not rely on the name-derived default — and verify it against a real sanitized partner payload. Use NO_ADDITIONAL_DATA when the event must store only declared fields, and capture no more than identity, deduplication, attribution, rules, and reporting need.
Give every business event its own data components; a field captured on one is not visible on another:
- Identity, on every event: the partner customer identifier as
PARTNER_PROFILE_KEYwhen the partner sends a stable one,emailwhen it is the only identity available. - The transaction identifier as
UNIQUE_PARTNER_EVENT_KEY, on transaction events, so an event tied to a partner-side record can deduplicate. A standalone event such asaccount_openedhas none. - The amount as
VALUE, on revenue events.
shipped and canceled arrive independently, so repeat the identity set on each: they must resolve to the same person and, through the transaction identifier, the same original transaction.
How to Test
Send a synchronous test event throughPOST /v6/events with an event-submission token, not the one that created the campaign. Put the current program label in data to target this campaign; it is a testing convenience and does not belong in the partner’s payload.
person_id to list the resulting events:
- Every preferred partner input event.
- Every supported legacy alias.
- Missing required identity.
- A repeated unique partner event identifier.
- Invalid amount and status values.
- Partner retry behavior.
- Campaign targeting with the current program label.
- Configuration view contents and status.
