Event: page.completed · Destinations: HubSpot, ActiveCampaign, Intercom, Slack
The problem
Most onboarding sequences still run on clocks instead of behavior. That creates the worst possible customer experience: users complete a step and still get nudged to do it again because the next system never heard about the progress update in time.
The technical problem is not detecting that a page or step was completed. It is getting that signal into the systems that drive email, in-app messaging, and internal follow-up without building a fragile chain of destination-specific handlers.
This pattern applies far beyond course products. It shows up in SaaS setup flows, activation wizards, membership onboarding, and any product where finishing step 3 should change what happens next immediately.
The event flow
Each use case follows the same product story: Meshes receives the source event once, maps it to the right destinations, and keeps delivery visible when downstream APIs fail.
Event 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",
"time_on_page_seconds": 522
}HubSpot
Meshes updates onboarding-step fields so lifecycle automation knows the user finished the current stage.
CRM-driven onboarding stays aligned with actual setup progress instead of stale assumptions.
ActiveCampaign
Meshes applies the next-step tag that can trigger the correct follow-up email or nurture path.
Email automation moves as soon as the user completes the page, not hours later.
Intercom
Meshes tags the user for context-aware in-app guidance tied to the new onboarding state.
The next tutorial or message can appear with the right context instead of guessing what the user already finished.
Slack
Meshes sends a progress update to the team with the sequence step and page context.
CS, implementation, or product teams can spot activation movement and stalls in real time.
How Meshes handles it
Instead of maintaining separate workers, retry logic, and visibility per destination, Meshes gives you one event path, destination-aware routing, and built-in delivery guarantees.
From your product
import MeshesEventsClient from '@mesheshq/events';
const meshes = new MeshesEventsClient(
process.env.WORKSPACE_PUBLISHABLE_KEY!,
);
await meshes.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',
time_on_page_seconds: 522,
},
});Across destinations
On every delivery
Why this matters
When step completion triggers the next sequence immediately, activation feels responsive instead of artificially delayed.
No team wants to email someone about a step they already finished. Behavior-driven routing keeps follow-up based on reality.
This is just as useful for SaaS setup flows and membership onboarding as it is for course-style sequences. Meshes gives you a reusable routing layer either way.
Related
Docs
See the event-ingestion pattern behind behavior-driven onboarding flows.
Open linkDocs
See how a single onboarding event can fan out into multiple follow-up systems.
Open linkIntegration
Keep onboarding fields and segmentation current inside HubSpot.
Open linkIntegration
Trigger context-aware in-app messaging from real onboarding progress.
Open linkBlog
See why activation workflows break when delivery logic is scattered across ad hoc jobs.
Open linkUse Case
See a companion pattern for launching in-app guidance from visit intent instead of page completion.
Open linkCompare
Compare behavior-driven onboarding with maintaining brittle step-completion workers yourself.
Open link