Event signal:lesson.completed| Destination:Mailchimp| Use case:Lesson Completion Flows| Typical setup:~15 minutes
Workflow outcome
The workflow begins with one lesson.completed event from your course product and ends with the learner inside the Mailchimp audience state that should trigger the next relevant sequence.
That replaces generic drip timing with behavior-based timing. Instead of hoping the student is ready when the next email is scheduled, the email path starts because the lesson was actually completed.
Why teams care
Course creators, coaching businesses, and LMS teams usually know that progress-based email works better than a fixed drip. The hard part is delivering that signal into the email system consistently.
A student who just finished a lesson needs a different follow-up from a student who registered three days ago and has not started. Behavioral timing keeps the message aligned with the learner state.
Once you have several module paths, milestone reminders, and re-engagement branches, hand-built audience sync scripts become one more brittle system to debug whenever a learner misses the right sequence.
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 app can emit lesson.completed.
Create the audiences or list states that should represent next lesson, module recap, milestone reminder, or completion follow-up.
Your product should emit lesson.completed with the student and progress fields Mailchimp needs.
Use the connection and rule docs for the implementation details behind the Mailchimp handoff.
Read moreThe source event
For Mailchimp, the event needs enough context to place the learner into the right audience state and give the downstream email logic a useful view of what just happened.
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
Mailchimp needs a stable contact identity so the student lands in the right audience entry.
lesson_title
Gives the next email path human-readable context about what the learner just completed.
module_id
Supports module-specific follow-up instead of one generic post-lesson sequence.
course_id
Keeps audience entry logic explicit when multiple programs share one workspace.
completion_percentage
Helps you reserve milestone sequences for the progress thresholds that matter most.
Field mapping view
| Event field | Destination target | Why it matters |
|---|---|---|
| Mailchimp subscriber identity | Identifies which contact should be added to the audience or list state. | |
| lesson_title | Merge field or internal context | Makes the resulting Mailchimp automation more specific than a generic course follow-up. |
| module_id | Rule selection or module-specific audience | Lets you split follow-up by module instead of funneling every student into one path. |
| course_id | Audience boundary | Keeps different course programs from sharing the same nurture path by mistake. |
| completion_percentage | Milestone audience logic | Supports milestone reminders or completion pushes when a threshold matters more than the exact lesson name. |
The destination connection
In your Meshes workspace, connect Mailchimp and confirm the audiences or lists that represent the next lesson, recap, milestone reminder, or completion follow-up. Once that connection is available in Meshes, you can bind lesson.completed to the exact audience state your Mailchimp automation watches.
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.
In Meshes, create a Mailchimp add_to_list rule for each meaningful lesson-completion outcome. Meshes delivers the learner into the audience state selected in the rule, and Mailchimp handles the automation that starts once the student lands there.
lesson.completed as the only source event and let the routing structure decide which Mailchimp audience should receive it.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: '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 a representative lesson.completed event from your product, then inspect Mailchimp. The learner should be added to the audience or list state that owns the next lesson, recap, reminder, or completion sequence for that milestone.
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
lesson.completed event appears in Meshes and the Mailchimp rule is matched.Why teams buy Meshes
What's next
Use Case
See the broader lesson.completed fan-out pattern across CRM, lifecycle email, Slack, and milestone automation.
Docs
Review how Meshes connections, actions, and rule metadata shape the Mailchimp handoff.
Open linkDocs
Use the Meshes event API or SDK to emit lesson.completed from your product.
Compare
Compare progress-based Mailchimp routing with maintaining your own list-sync and retry logic.
Open linkGuide
Project the same lesson.completed signal into HubSpot progress fields and lifecycle lists.
Guide
See another guide where the next lifecycle message starts from actual progress instead of generic timing.
Open linklesson.completed once, let Meshes handle the audience handoff, and keep your course emails aligned with real student progress.