Skip to content

Participant Support Layer — Plan (Draft)

Created 2026-04-19
Status draft
Tags plancrmautomationprimerstudy-groupsengagement

Status: Draft for Patrick’s review — not approved, not in build. Depends on: People Profiles Aggregation (Phase 2, implemented 2026-04-19) as the data substrate.

Sit an engagement / support layer on top of the existing platforms so that participants in the Primer and study groups — and participants in any future program that assigns remote work — get:

  1. Acknowledgement when they cross meaningful milestones (segment completion, session attendance, first forum post, etc.)
  2. Gentle re-engagement when their rhythm drops off, pointed at the specific place they left rather than generic “come back” messaging
  3. Contextual insight drawn from (a) what their cohort is experiencing and (b) the structured KB material — surfaced at moments when it’s relevant to what they’re doing

The work the people-profiles aggregator did — indexing who each person is, what they’ve touched, what cohort they’re in, when they last showed up — is the substrate. This plan uses that substrate to drive outbound communications and (eventually) in-platform nudges.

The prompt used “gamified” loosely. In Baseworks voice, points/badges/XP/streak language would clash with the pedagogy. The goal is the same behavioral result (acknowledgement, feedback loops, momentum), but expressed as support and cadence — the system notices where a person is and responds with something relevant. No scoreboard.


Tiering — build in order of data maturity

Section titled “Tiering — build in order of data maturity”

Tier 1 — Generic cadence comms (FluentCRM-driven)

Section titled “Tier 1 — Generic cadence comms (FluentCRM-driven)”

Uses only signals already in the CRM / existing tag flow. Simplest to build, safest to ship, gets us real behavioral data to inform Tier 2.

Triggers we will use (event-first, tag-only for identity):

  • Form 67 submission → updates last_segment_completed custom field in FluentCRM (via Formidable frm_after_create_entry hook, owned by Asia). Segment-completion automations trigger off the custom field, no per-segment tag.
  • Cohort membership tag (WP-Fusion, already in use) — identity signal, drives per-cohort flows.
  • areb_bw_activity recency — pushed into CRM as last_active custom field via the bw_activity_logged hook once added to the Activity Plugin. Drives curiosity-nudge automations.
  • Session attendance — already captured in areb_bw_activity (Asia imports in-person attendance manually). Hook emission propagates this as an event the same way any other activity entry would.

Comm flows (initial set):

FlowTriggerContent shape
Segment acknowledgementForm 67 submission with segment-name field, which updates last_segment_completed custom field in FluentCRMShort email acknowledging the segment, linking to next segment + related KB material
Curiosity nudge (not drift scolding)No areb_bw_activity entry for N days (4 days inside a study group, 6–7 days for Primer-only enrollees)Teaser tied to where they are: “you’re close to Segment N, past it X becomes clearer, here’s a taste.” Never “we haven’t seen you.”
Study group mid-week promptN days after a sessionBrief prompt tied to the session’s home-study focus (generic per session, not per person)
Post-session summary pingWhen session summary is published (vault → WP)Pointer to the summary and the recording
First-forum-post acknowledgementBuddyBoss activity type = topic created, first timeLight touch — “we saw your post, here’s what’s useful near it”

Platform: FluentCRM automations only. No n8n, no agentic composition. Templates live in 02-areas/communications/email-templates/ and get copied into the CRM as automation steps. Generic copy, no per-person personalization beyond merge tags (name, cohort, last lesson title).

Voice: per voice guides. No praise language (“great job!”), no manufactured enthusiasm. Acknowledgement is neutral and functional.

Tier 2 — Personalized re-engagement (agentic composer)

Section titled “Tier 2 — Personalized re-engagement (agentic composer)”

Once Tier 1 is running and we have a read on open rates / what lands, layer personalization on the re-engagement flows.

Additions:

  • Smart revisit: when the drift trigger fires, an agentic step (Claude Code CLI on the agents VPS, not n8n — memory flag: Claude Max ecosystem preferred) reads the person file, finds the lesson they last touched, pulls the relevant KB material, and composes an email that references the specific point. Passes through voice-guide check. Outputs a draft that either (a) auto-sends if confidence is high, or (b) queues in a vault inbox for Patrick/Asia to approve.
  • Segment-completion insight: same pattern, but triggered on completion — composer looks at the person’s Primer form responses for that segment (Form 67 Segment Feedback) and picks a relevant KB pointer for what to sit with before the next segment.
  • Cohort-aware framing: composer can reference aggregate cohort patterns (“most participants find Segment 2 takes about X weeks” — pulled from wp_bw_activity grouped queries), without naming anyone.

Platform boundary: agentic work runs as a scheduled script on the agents VPS (same pattern as build-people-index.py). Output is either an email draft sent through FluentCRM’s transactional endpoint, or a queue file in the vault for human review. Never touches the CRM as a bidirectional system.

Reframe: curiosity mechanism, not drift scolding

Section titled “Reframe: curiosity mechanism, not drift scolding”

The re-engagement family should read more like trivia or preview than surveillance. Wrong shape: “we haven’t seen you practice very much.” Right shape: “you’re sitting near Segment 2. Participants who get past it often find X becomes clearer. Here’s a short read that points at it.”

Design requirements:

  • Grounded in real outcomes of the material, not marketing copy. Each segment needs a short “what opens up here” descriptor, editorially written and reviewed, that curiosity nudges draw from.
  • Always forward-looking. Reference where they are and what’s ahead, not the gap in their activity.
  • Specific, not generic. “Past Segment 2, X becomes clearer” beats “there’s more to discover.”
  • Generated from the person’s actual state (segment reached, last activity cluster) so the teaser lands at the right place in the curriculum.

Tier 1 implementation can use per-segment pre-composed teasers, picked by the person’s current segment. Tier 2 personalizes further by pulling in what their Segment N Form 67 response actually said.

Editorial prerequisite: per-segment teaser copy lives in the vault, voice-reviewed, and gets pulled into the automation. Not ad-hoc composition.

Tier 3 — Aggregated insight surfacing (later, speculative)

Section titled “Tier 3 — Aggregated insight surfacing (later, speculative)”

Cohort-relative and KB-cross-referenced insight, surfaced in-platform rather than only by email. Out of scope until Tier 1+2 are established. Noting here so the architecture doesn’t paint itself into a corner.



Visualization family — extensions of Primer Print

Section titled “Visualization family — extensions of Primer Print”

Principle: the artifact is the reward. Primer Print already works because nothing is added. The pattern is the person’s actual activity made visible, unique to them, non-ranked. Extend that family rather than bolt on points or badges.

Each visualization below is a query against existing data (areb_bw_activity, forum tables, Form 67 responses, BuddyBoss membership). Rendered per person, on-demand or as part of a periodic “your pattern so far” surface.

VisualizationData sourceWhat it shows
Primer Print (existing)Smart-revisit eventsUnique pattern generated from revisits, already deployed.
Segment constellationForm 67 completions + areb_bw_activity entries grouped by segment clusterSegments as nodes, the path between them as edges. Grows as they progress. Companion layer above Primer Print.
Revisit heatmapareb_bw_activity filtered to smart-revisit type, binned by lesson × weekDepth of engagement made visible. No count on display.
Forum resonance mapBuddyBoss topics + replies authored by the person, and threads those touchShape of participation in the community layer. Non-ranked.
Cadence ribbonareb_bw_activity entries over timeTexture of rhythm, not a number. Density strip. No streak.

Rules across the family:

  • Non-ranked. Never compared to other people. Never a score.
  • No loss state. No counter that drops to zero if they pause. No currency.
  • Private by default. Surface on the person’s own profile or in their email. Not a leaderboard, not a social feed.
  • Unique output. Each person’s rendering is visibly theirs because the underlying data is theirs.

The Activity Plugin is the spine. Every visualization is a renderer on top of the same table.


Commitment mechanisms — policy, not gamification

Section titled “Commitment mechanisms — policy, not gamification”

Separate track from visualization. These are stated policies around program access, designed to signal that commitment is the point. Frame in marketing copy, not hidden in logic.

Primer tier inversion.

  • Cohort Primer: subsidized, priced low.
  • Autonomous Primer: 3–4x the cohort price.

Psychologically inverted from the default expectation (self-paced is cheaper). The message this sends: Baseworks subsidizes people who commit to the cohort rhythm; flexibility is available, and it costs more. Surface this explicitly in enrollment copy, don’t hide the pricing logic.

Recorded-session access gated by attendance (virtual cohorts).

  • Attend the live session: recording available at no added cost.
  • Miss the live session: recording available behind a small additional payment.

Frame as “committed presence is the program; the recording is a convenience good.” Not punitive, not a fine. A clean division between the thing (the live session) and the reference material (the recording).

No streak counters, no currency-loss mechanic.

The Duolingo paywall works because the streak is currency. Baseworks doesn’t want that currency to exist. Apply the commitment principle at enrollment and session access, not as a running meter that can be broken.

Implementation note: these are pricing and access-control changes, not CRM automations. Handled at the WooCommerce / LearnDash / access-gate layer. Flagged in this plan because they sit in the same behavioral-architecture conversation, but they are not FluentCRM work.

Scope boundary. The full marketing and pricing strategy for virtual Primer cohorts (subsidized cohort tier against a higher autonomous tier, timeline, enrollment comms, how to frame the inversion in copy) will be opened as a separate plan at the point Patrick is ready to work on it. Not folded into this one, not drafted ahead of time. This plan only references the commitment mechanisms at the point where they intersect with the support layer (recorded-session gating, which is an access-control policy the CRM layer respects). Future sibling plan filename reserved: virtual-primer-cohort-strategy-plan.md under 03-resources/plans/.


Before Tier 1 flows can run, two small plumbing additions:

  1. bw-activity plugin — add event emission on insert.

    • Add do_action( 'bw_activity_logged', $activity_id, $data ) inside BW_Activity_DB::insert() after the $wpdb->insert() call.
    • Also add a corresponding do_action( 'bw_activity_updated', $id, $data ) in ::update() for completeness.
    • Turns the Activity Plugin into an event source. FluentCRM listeners, custom-field updaters, and future visualizations all subscribe to this hook rather than polling the table.
    • Belongs in the bw-activity plugin (baseworks-changelog repo, not the vault).
  2. Formidable Form 67 completion hook → FluentCRM custom field update. [Owner: Asia]

    • Small mu-plugin or snippet: on frm_after_create_entry for Form 67, read the segment-name field and update the submitting contact’s last_segment_completed and last_segment_completed_at custom fields in FluentCRM via the internal API.
    • One code path, one source of truth. FluentCRM automations trigger on custom-field change, not on a tag.
    • Belongs in the baseworks-changelog repo under sites/practice.baseworks.com/ (plugin-settings-code or a small mu-plugin, whichever matches the existing pattern).
    • Assigned to Asia. Task to be queued via Asia’s inbox once this plan is finalized.

These two pieces unlock the entire Tier 1 trigger matrix.


SignalStatusNotes
Segment completion✅ Derivable from Form 67Formidable form with segment-name field. Captured via frm_after_create_entry hook into a FluentCRM custom field. No WP-Fusion tag needed.
areb_bw_activity recency✅ Indexed per personAlready on person files as last_activity. Needs to surface into CRM as a custom field for automation triggers.
Video-time proxy for dwell✅ Partial, already capturedActivity Plugin records video duration at completion (not just the event). Imperfect (rewatch / scrubbing not reflected), but a usable depth signal. Already surfaces in the user dashboard as a daily video-time graph. Good enough for Tier 1 and Tier 2 cohort comparisons.
Text / transcript dwell❌ Not captured todayLesson pages carry long text summaries and transcripts that some participants engage with heavily. No listener today. See open question on whether to build one.
Session attendance✅ Captured in Activity PluginIn-person attendance (date, type, duration, time) lives in areb_bw_activity. Creation is manual import by Asia; once imported, fully available for users in their dashboard and for automations via the bw_activity_logged hook once added.
Forum participation✅ Indexed per personFrom forum sync (System 3). Already on person files.
Form 67 (Segment Feedback) responses✅ IndexedUsed by Tier 2 composer.

  1. Per-segment teaser copy. Patrick drafts once given direction for what to look at. Asia reviews. Editorial artifact lives in the vault, pulled into automations.
  2. Curiosity-nudge threshold. 4 days inside a study group, 6–7 days outside. Applied separately per enrollment context.
  3. Frequency ceiling. No more than one automated message per person per 6–7 days, across all flows.
  4. Sender identity. Neutral “Baseworks” across all automated flows. Rationale: an automation signed from a named human reads as impersonation. Keep the automated layer honestly automated. Personal sender identity stays reserved for messages actually written by Patrick or Asia.
  5. In-platform plus email. Duplicate every Tier 1 flow across BuddyBoss notifications and email. Two surfaces, same message, same cadence ceiling.
  6. Approval queue indefinitely. Tier 2 composer queues drafts for human review, no auto-send. Revisit the auto-send question only after the composer’s output quality is trusted. No fixed timeline.

Lesson text and transcript dwell listener — deferred until Tier 1 is running (decided 2026-04-20). Video dwell is already captured as a proxy via completion duration. Text and transcript engagement is not. Rather than invest ahead of signal, wait until Tier 1 behavioral data tells us whether the gap actually matters for composition quality, then reassess.

Rough shape if we build it later:

  • Front-end script on the LearnDash lesson template. Uses the Page Visibility API plus mouse, keyboard, and scroll activity to detect active engagement. Idle threshold around 30 seconds, then pause counting. Send heartbeats every 15 seconds while active.
  • Back-end REST endpoint aggregates heartbeats per user, per lesson, per session, and writes a row (or updates one) in areb_bw_activity with activity_type = 'lesson_dwell_text' and duration_dec as minutes engaged.
  • Privacy-transparent. Surface the fact that text engagement is tracked, same way the video dashboard already does.
  • Scope estimate: one focused build session for the listener and endpoint, one session to verify against real traffic, one to expose on the existing dashboard.

  • Session A — open-question resolution (this draft → Patrick/Asia input → finalized plan).
  • Session A.5 — Prerequisite plumbing. Two parallel tracks:
    • Activity Plugin do_action( 'bw_activity_logged' ) emission. [Claude / Patrick]
    • Formidable Form 67 → FluentCRM custom-field hook. [Asia, queued via her inbox once this plan is finalized] Both land in the baseworks-changelog repo. Unblocks every Tier 1 flow.
  • Session B — Tier 1 flows 1–3: segment acknowledgement + curiosity nudge + session prompt. Copy drafted against voice guides, per-segment teaser descriptors written, FluentCRM automations built, tested with one cohort before general rollout.
  • Session C — Tier 1 flows 4–5: summary ping + first-post acknowledgement. Only after flows 1–3 have run clean for a cohort cycle.
  • Session D — Tier 2 composer scaffold: queue-to-inbox flow, one trigger only (smart revisit on drift). Human review required for every send.
  • Session E — Tier 2 expansion: add segment-completion personalization and cohort-aware framing once the composer’s output quality is trusted.

Tier 3 is deferred until Tier 2 is a year old and we have enough signal to know what’s worth surfacing in-platform.


  • No praise language. Voice guide applies; acknowledgement is neutral.
  • Frequency ceiling enforced. One automated message per person per 6–7 days maximum, across all flows, counting email and in-platform notifications together (not separately).
  • Sender is neutral Baseworks. Automated flows never carry a named human signature. Honest about being automated.
  • No leaderboards, no badges, no streak counters. Ever.
  • Unsubscribe respected everywhere. Tier 2 agentic flows check CRM unsubscribe status before composing, not after.
  • Editorial ownership. Every template is reviewed against the voice guides before it goes into FluentCRM. Every Tier 2 prompt is reviewed against the guides before it ships.
  • No coaching language (per memory). Guide, instruct, offer — not coach.

  • people-profiles-aggregation-plan — data substrate
  • project-campaign-infrastructure — existing comms infrastructure
  • 02-areas/communications/email-templates/ — where Tier 1 templates will live
  • 02-areas/primer/reports/generate_primer_prints.py — existing Primer Print renderer; visualization family extends from here
  • sites/practice.baseworks.com/plugins/bw-activity/ (baseworks-changelog) — Activity Plugin, to receive do_action emission