Overview
Validation is the last gate before an integration goes live: decide whether it should own outbound resources, check the built shape against the model, then publish the version you checked. Connecting its business events to a marketing program is a separate, approved step.Gate Outbound Resources
This applies to an inbound custom build someone proposes to extend outbound; the webhooks and credential an outbound library install ships with are part of its finished shape, not gated here. Create outbound resources only when all of these hold:- The requested scope includes a defined outbound use case.
- A program action or reward rule produces the event or reward.
- The destination endpoint and authentication contract exist.
- Retry, idempotency, error handling, and ownership are defined.
- The integration or program has a configuration surface for required values.
- The path can be tested before it is enabled.
- Disable the webhook.
- Remove its filters and component references, then archive it.
- Remove reward-supplier references from rules and components, then archive the supplier.
- Remove and archive the client key once no active references remain.
- Remove unused component settings and sockets.
- Publish and verify the resulting campaign.
Validate Before Publishing
Read the latest campaign and its built components, then confirm:Campaign and Component Identity
- Campaign type is
INTEGRATIONand program type isintegration. - The root and integration model components exist, the model component carrying an
integration-v10.xtype. - Where the build must appear as an installed integration, its owner and tags match what Build a Packaged Integration with the Management API describes; read the tags back.
- No unrequested reward supplier, webhook, client key, or socket exists.
- No legacy custom controller duplicates a reusable business event.
- Read from
/v1/components/built, every webhook’senabledresolves to the integration’s own toggle rather than to a literalfalse. A webhook holding a literalfalsenever starts, regardless of what the installer does. Confirm every use case the integration promises has a webhook that can fire.
Events and Data
businessEventsacceptsbusiness-event-v10.0, and each canonical event is a duplicated reusable template.- Every partner wire event in scope reaches a business event, and no two outcomes a report needs apart share one.
- Each event has an
input_eventrule carrying the partner event names, or the names a prehandler produces — not the canonical names, since a rule listening forconvertedmatches everyconvertedevent in the account. - Each event has its own reporting names: no two share a noun or rate name, and no alias appears on more than one.
- Every business event has data components in its
datasocket, each with the intended source expression and key type. - Every event carries an email address, or an identity the account can reach. Where a prehandler flattens the payload, confirm the email is among its emitted keys.
Reachability
- Whoever sends the inbound event can send the shape the rules expect. Where the sender is the partner’s own webhook, a prehandler exists, is
enabled, carries at least one condition, and is referenced to the integration component — a disabled prehandler, or one with no conditions, passes every structural check here and leaves the integration inert. Read the evaluatedorderwhere more than one participates (Normalize Inbound Events with a Prehandler). - Whoever configures the partner is given the endpoint: the configuration view’s setup instructions render the URL the partner posts to, computed from the campaign, rather than naming the event endpoint without producing it.
Views
viewsacceptsview-v10.0, and the configuration view is attached to the model component withsettingsToDisplayreferencing existing parent settings.- The socket holds the three baseline views, plus the
reward-suppliersconfiguration view on a reward fulfillment build. - Read from
/v1/components/built,reportRunnerIdon the report-runner view andeventStreamIdon the event-stream view each resolve to an identifier rather than null — a null means the element was never created, or was attached to the integration component instead of the view that reads it, and neither fails loudly. - Every column named in
reportColumnsMappingis one the report runner’smappingsexpression produces, and the event stream carries its filters.
Display Settings
Read all eight display settings from/v1/components/built and check each against the value convention in Create the Integration Campaign and Component Model. Present is not usable: short.description and about describe this partner rather than integrations generally, documentation.url points at the partner-facing page rather than this build guide, and categories spells a string other integrations already use.
logo on the integration component and rewardSupplierLogo on every supplier template each hold an absolute URL. An empty value, or one still showing a spel@buildtime: expression, renders the grey placeholder tile.
Publish the Validated Version
Publish the version you validated:Connect the Integration to a Program
A finished integration turns partner events into business events inside its own campaign, while the account’s marketing programs still run on the events their theme shipped with. Until the two are joined, the integration produces activity no program acts on. Close the build by proposing two things, and do neither without an answer:- Publish the integration campaign, which makes the inbound endpoint accept events.
- Install the integration’s business events into a marketing campaign.
converted supersedes the theme’s converted on the same journey; shipped and canceled are usually additions.
On approval, work through the target campaign’s journey socket:
- Duplicate each partner business event into the socket holding the program’s equivalent, sourcing from the integration’s component.
- Remove the superseded default event once its replacement is installed.
- Add the partner events the program lacks into the same socket.
- Read the built campaign and confirm the journey lists the expected events in lifecycle order.
Reference Structure for an Order Lifecycle Integration
Most commerce platforms map onto the same three canonical events; adjust this shape to what the partner emits:
Map Inbound Partner Events names the fields each event captures. A complete integration of this shape carries the model component, three business events, one
input_event rule per event, one data component per captured field, and the three baseline views. It is inbound-only: no reward-supplier socket, reward webhook, or client key.
Platforms with a different lifecycle keep the same construction and change the event set: a lending or account platform maps to account_opened, application_approved, and funded; a subscription platform to converted, renewed, and canceled. The canonical name describes the business outcome, never the partner’s transport name.
