Event signal:page.completed| Destination:ActiveCampaign| Use case:Page Completion Triggers for Onboarding| Typical setup:~15 minutes
Workflow outcome
The workflow starts with page.completed from your product and ends with ActiveCampaign holding the tag or list state that tells the next onboarding automation to begin.
That keeps onboarding responsive to actual user progress. The next message starts because the user finished the step, not because a drip campaign guessed enough time had passed.
Why teams care
Onboarding-heavy products lose trust when users finish a step and still get reminders telling them to do it again. Behavior-driven sequencing fixes that timing problem.
This pattern shows up in SaaS setup flows, membership onboarding, learning portals, and activation wizards. The user finishing step three should change what happens next immediately.
Once you add multiple sequences, tags, and provider-specific retry logic, the work stops being about onboarding copy and becomes about delivery infrastructure. That is the part Meshes removes from the product code path.
What it depends on
These pages stay focused on the workflow outcome, but the setup still needs the right workspace, destination connection, and event path underneath.
You need a workspace and publishable key so your product can emit page.completed.
Create the ActiveCampaign connection and confirm the tags or lists that represent each onboarding milestone.
Read moreYour app should emit page.completed with the page and sequence-step context that explains what the user just finished.
Decide which onboarding steps deserve a tag or list action and keep the naming stable across the product and lifecycle team.
The source event
For ActiveCampaign, the event is useful when it explains which onboarding step was completed and which contact should enter the next lifecycle state. Identity plus clear step context usually matters more than a huge payload.
Event payload
page.completed{
"user_id": "usr_5012",
"email": "alex@northstar.io",
"page_id": "page_connect-crm",
"page_title": "Connect your CRM",
"sequence_step": 3,
"completed_at": "2026-03-21T15:06:00Z"
}What matters most
ActiveCampaign needs a stable contact identity before the tag or list state can move.
page_id
Keeps the onboarding milestone stable even if the visible step title changes later.
page_title
Gives delivery history and internal reviews a readable explanation of what was completed.
sequence_step
Lets lifecycle automation line up with the exact onboarding milestone that should trigger the next message.
completed_at
Preserves the actual completion moment for audits, support review, and troubleshooting.
Field mapping view
| Event field | Destination target | Why it matters |
|---|---|---|
| ActiveCampaign contact lookup | Identifies which contact should receive the tag or list action. | |
| page_id | Step-specific rule context | Keeps the rule tied to a stable onboarding milestone instead of a brittle page label. |
| page_title | Readable onboarding context | Makes delivery review easier for lifecycle and product teams. |
| sequence_step | Next-step tag or list naming | Helps map the completion signal to the onboarding path that should start next. |
| completed_at | Event history timestamp | Shows exactly when the user earned the next onboarding handoff. |
The destination connection
In your Meshes workspace, create the ActiveCampaign connection and confirm the tags or lists that represent each onboarding milestone. Keep the naming specific enough that anyone reviewing the Meshes rule can tell which onboarding step the handoff is meant to trigger.
Where Meshes matters
Most teams do not need another destination. They need the destination to stay in sync without embedding its delivery quirks, retries, and mapping logic into the product code path.
Event
page.completedDestination
In Meshes, bind page.completed to an ActiveCampaign Add Tag or Add to List rule for the milestone that just finished. The user advances because the page was completed, not because a timer elapsed. Meshes handles the handoff and delivery history; ActiveCampaign handles the sequence that watches for the new tag or list state.
A sample event
This is the part teams like: the source event stays readable and product-shaped while Meshes owns the destination-facing complexity.
TypeScript example
import MeshesEventsClient from '@mesheshq/events';
const events = new MeshesEventsClient(process.env.WORKSPACE_PUBLISHABLE_KEY!);
await events.emit({
event: 'page.completed',
resource: 'onboarding_sequence',
resource_id: 'workspace-setup',
payload: {
user_id: 'usr_5012',
email: 'alex@northstar.io',
page_id: 'page_connect-crm',
page_title: 'Connect your CRM',
sequence_step: 3,
completed_at: '2026-03-21T15:06:00Z',
},
});Destination outcome
Use Send Test Event in Meshes or emit a representative page.completed event, then confirm the contact receives the tag or list state that should start the next onboarding email. The downstream sequence should advance because the user completed the step, not because a timer happened to fire.
Operational visibility
The difference between a nice demo and a usable product workflow is whether you can see what happened when the destination is slow, misconfigured, or unavailable.
In Meshes
page.completed event appears in Meshes and the ActiveCampaign rule is matched.Why teams buy Meshes
What's next
Use Case
See the broader page.completed pattern across CRM, lifecycle automation, in-app messaging, and team alerts.
Docs
Review how Meshes connections, actions, and rules shape the ActiveCampaign handoff.
Open linkDocs
Use the Meshes events API or SDK to emit page.completed from your product.
Compare
Compare behavior-driven onboarding with maintaining custom step-completion workers and retry logic yourself.
Open linkGuide
See a related behavior-driven guide where repeated intent triggers in-app follow-up instead of onboarding email.
Open linkGuide
Use the same progress-first thinking for lesson-driven email automation in Mailchimp.
Open linkpage.completed once, let Meshes handle the ActiveCampaign handoff, and keep the next onboarding message tied to what the user actually finished.