• Use Cases
  • Pricing
  • Security
  • Docs
Sign InStart free

The outbound integration layer for SaaS products: emit once, then let Meshes handle routing, retries, fan-out, and delivery history.

© Copyright 2026 Meshes, Inc. All Rights Reserved.

About
  • About
  • Security
  • Blog
  • Contact
  • FAQ
Product
  • Pricing
  • Demo
  • Integrations
  • Guides
  • Changelog
  • Status
Compare
  • All comparisons
  • Build vs buy
  • vs Zapier
  • vs Make
  • vs n8n
  • vs Paragon
  • vs Merge
Use Cases
  • All use cases
  • Payment failed
  • User signup fan-out
  • Churn prevention
  • Trial expired events
  • Lesson completion flows
  • Page completion triggers
  • Page visit Intercom flows
Developers
  • Documentation
  • Agents
  • API Reference
  • MCP Server
  • llms.txt
Legal
  • Terms of Service
  • Privacy Policy
  • Acceptable Use Policy
  • Cookie Policy

WorkflowCourse progress workflow

Update HubSpot on Lesson Completion

Use Meshes to turn lesson.completed into current HubSpot progress properties and milestone list state so lifecycle messaging, coaching follow-up, and upsell timing react to real student movement.

Start freeView documentation

Event signal:lesson.completed| Destination:HubSpot| Use case:Lesson Completion Flows| Typical setup:~15 minutes

Workflow outcome

The product event is small. The downstream effect is not.

The workflow starts with lesson.completed from your course product and ends with HubSpot holding the lesson, module, and progress context your lifecycle team actually uses.

Before this pattern, progress lives inside the LMS while CRM follow-up stays generic or delayed. After it is in place, your app emits one event, Meshes handles the HubSpot delivery, and HubSpot-native automation can react from current progress state.

Why teams care

This is the kind of workflow buyers judge fast

Education products, coaching programs, and cohort-based offers need more than signup data in the CRM. They need the CRM to reflect where the student is in the program right now.

That turns HubSpot into a live progress surface for nurture, customer success outreach, and milestone-based upsells instead of a static lead database that never catches up to the learning experience.

This is also where custom sync code gets messy fast. Every added milestone, list, or property change creates more delivery logic unless the event handoff is handled by a routing layer.

What it depends on

The supporting pieces behind a credible rollout

These pages stay focused on the workflow outcome, but the setup still needs the right workspace, destination connection, and event path underneath.

Meshes workspace

You need a workspace and publishable key so your app can emit lesson.completed.

Read more

HubSpot connection

Authorize HubSpot in Meshes and confirm the progress properties or milestone lists you plan to use already exist.

Read more

Lesson completion event path

Your product should emit lesson.completed with the course, lesson, and progress context HubSpot needs.

Read more

A clear progress model

Decide which fields belong in HubSpot properties and which milestones should be represented as separate list membership states.

The source event

The payload that creates the downstream business outcome

For HubSpot, the event is useful when it carries the identity and progress fields your lifecycle or coaching team actually segments on. That usually means who completed the lesson, what lesson it was, and how far through the course the student has moved.

Event payload

lesson.completed
{
  "student_id": "stu_2048",
  "email": "nina@academyflow.io",
  "lesson_id": "lesson_customer-research",
  "lesson_title": "Customer Research Fundamentals",
  "module_id": "module_growth-foundations",
  "course_id": "course_creator-accelerator",
  "completion_percentage": 62
}

What matters most

  • email

    HubSpot uses email as the stable contact identifier for the progress handoff.

  • lesson_title

    Makes the current student milestone readable inside the CRM without another lookup.

  • completion_percentage

    Supports progress-aware lifecycle branching, milestone reporting, or success outreach timing.

  • module_id

    Lets you distinguish which stage of the curriculum the student just reached.

  • course_id

    Keeps multi-course workspaces explicit so the CRM state reflects the right program.

Field mapping view

What the destination needs from the event

Event fieldDestination targetWhy it matters
emailHubSpot contact emailIdentifies which contact record should receive the progress update.
lesson_titleCurrent lesson propertyShows the exact milestone the student just completed.
completion_percentageProgress percentage or milestone propertyGives downstream HubSpot workflows a progress signal they can react to.
module_idModule property or milestone list logicSeparates one module milestone from another without guessing from timestamps.
course_idCourse property or audience boundaryKeeps different programs from sharing the same CRM follow-up by accident.

The destination connection

The destination matters, but the connection quality matters just as much

In your Meshes workspace, create the HubSpot connection that will receive lesson.completed. Before you build the rule, confirm the custom progress properties and any milestone lists already exist in HubSpot so Meshes can map the event into the CRM cleanly.

  • Authorize the correct HubSpot account in the workspace that owns the lesson.completed events.
  • Confirm the progress properties and any milestone lists already exist in HubSpot.
  • Decide whether this workflow needs only update_property rules or an additional add_to_list rule for milestone entry.
  • Name the connection and rules clearly so delivery history reads like student-progress logic instead of generic plumbing.
HubSpot IntegrationMeshes quickstart

Where Meshes matters

The product stays simple while the destination still gets the right shape

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

lesson.completed

Destination

HubSpot

Use case

Lesson Completion Flows

Docs

HubSpot Integration

In Meshes, create one or more HubSpot rules for lesson.completed. Use Update Property to project the lesson, module, and progress fields into the contact record, and add an Add to List rule when a milestone should move the student into a HubSpot-managed sequence.

  • Keep the CRM projection focused on the fields lifecycle, coaching, or success teams actually use.
  • Use list membership for meaningful milestones, not every small lesson update.
  • If different courses share the workspace, keep the rules explicit with course-specific resource or resource_id values where needed.
  • Let HubSpot own the nurture or success workflow after Meshes updates the contact.

A sample event

The product-side code stays close to the business event

This is the part teams like: the source event stays readable and product-shaped while Meshes owns the destination-facing complexity.

TypeScript example

One emit call stays close to the business event

import MeshesEventsClient from '@mesheshq/events';

const events = new MeshesEventsClient(process.env.WORKSPACE_PUBLISHABLE_KEY!);

await events.emit({
  event: 'lesson.completed',
  resource: 'course',
  resource_id: 'course_creator-accelerator',
  payload: {
    student_id: 'stu_2048',
    email: 'nina@academyflow.io',
    lesson_id: 'lesson_customer-research',
    lesson_title: 'Customer Research Fundamentals',
    module_id: 'module_growth-foundations',
    course_id: 'course_creator-accelerator',
    completion_percentage: 62,
  },
});

Destination outcome

Use Send Test Event in Meshes or emit one representative lesson.completed event from your product, then inspect the HubSpot contact. You should see the mapped progress fields updated immediately, and any milestone list rule should place the student into the next HubSpot-managed lifecycle path.

Send EventsSDK docs

Operational visibility

Delivery history is where this stops feeling like glue code

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

What a healthy workflow looks like

  • Confirm the lesson.completed event appears in Meshes and the HubSpot rules are matched.
  • Check delivery history for successful update_property or add_to_list attempts.
  • Open the HubSpot contact and verify the lesson, module, or progress fields now reflect the new milestone.
  • If the handoff fails, use replay after fixing the mapping, auth, or property configuration so the progress signal does not stay stranded.

Why teams buy Meshes

The workflow stays sellable after launch

  • Retries keep a temporary HubSpot issue from forcing CRM-sync logic back into the lesson-completion path.
  • Replay gives you a recovery path when a property or list configuration changes after students have already progressed.
  • Per-rule delivery history makes it obvious whether the CRM handoff happened or quietly failed behind the scenes.

What's next

Keep exploring the same workflow from different angles

Use Case

Lesson Completion Flows

See the broader lesson.completed fan-out pattern across CRM, lifecycle email, Slack, and milestone automation.

Open link

Integration

HubSpot Integration

Review the HubSpot connection flow, supported actions, and event result details.

Open link

Docs

Send Events

Use the Meshes event API or SDK to emit lesson.completed from your product.

Open link

Compare

Meshes vs. DIY

Compare one progress-aware CRM handoff with maintaining student-sync glue code yourself.

Open link

Guide

Send Lesson Completion Events to Mailchimp Sequences

Route the same lesson.completed signal into progress-based Mailchimp email automation.

Open link

Guide

Trigger ActiveCampaign Onboarding Sequences from Page Completion

See another behavior-driven guide where lifecycle follow-up starts from real progress instead of a timer.

Open link

Next stepStart free or keep reading the docs

Keep HubSpot current from the lesson your student actually finished

Emit lesson.completed once, let Meshes update the CRM handoff, and keep progress-based nurture or coaching workflows grounded in real student movement.

Start freeView documentation