EV

Event Dictionary

Analytics & Tracking Reference · Generated from source

Backend Frontend Unregistered
← Back to KB
Analytics Reference

Every event the platform emits, in one place.

A code-derived catalog of the analytics & tracking events fired by platform-backend and platform-frontend. It replaces the abandoned 2021 Confluence “Event Dictionary” tree (whose per-event pages were left empty). Every row here was extracted directly from source — event name, trigger, payload, and destination — so it reflects what actually ships today.

171
Total events
135
Backend (Segment)
36
Frontend
26
Routed to ChurnZero
109
Fire but unrouted

The Events Table

Search by name or description; filter by source, domain, or destination. Click any row to expand its payload, source file, and dispatch mechanism.

EventSourceDomainDestinationsTriggerStatus

How Events Flow

Two pipelines converge on Segment, which fans out to downstream tools. Backend events are dispatched from PHP event classes; frontend events from a trackEvent() mixin.

Backend · platform-backend (Laravel)
Event class extends SegmentEvent/Contract payload('track') Segment ChurnZero
ChurnZero only when the event is registered in an EventType seeder with an integration (26 of 135). The other 109 reach Segment/its warehouse but no downstream tool.
Frontend · platform-frontend (Vue 2 / Nuxt 2)
trackEvent() segment store (enriches props) Segment ChurnZero
…or the analytics-tracking mixin → Segment + Hotjar (consent-gated). GTM is loaded globally, not per-event.

The Base Payload Envelope

Every backend event carries a common Segment track envelope; only the per-event data differs. There are two generations of base contract, and they nest data differently — worth knowing when you query Segment.

SegmentEvent · newer (28 events)
{
  "userId": "<user uuid | anonymous-…>",
  "event": "User Viewed A Lesson",
  "properties": {
    // ChurnZero identity keys
    "accountExternalId": "…",
    "contactExternalId": "…",
    "sp_global_organization_id": "…",
    "sp_global_user_id": "…",
    "external_reseller_id": "…",
    "meta": { "origin": "Platform", "accountUser": {…} },
    "data": { /* event-specific */ }
  },
  "timestamp": 1740000000,
  "context": { "active": true, "ip": "…" },
  "integrations": { "ChurnZero": true }
}
SegmentEventContract · older (107 events)
{
  "userId": "<user uuid | uniqid()>",
  "event": "Course Stored",
  "properties": {
    // eventDetails placed directly here —
    // no meta / data nesting
    "created_by": "<uuid>",
    "uuid": "<uuid>"
  },
  "timestamp": "2026-08-21T00:00:00+00:00",
  "context": { "active": true, "ip": "…" },
  "integrations": { "ChurnZero": true }
}
Frontend enrichment. Store-routed frontend events are wrapped by src/store/segment.js, which nests your data and adds accountExternalId, contactExternalId, and a meta block (accountUser, device_uuid, session_uuid, origin). Direct-mixin events bypass the store and send the raw payload to Segment, plus a name-only Hotjar event (lowercased, underscored) when statistics consent is granted.

By Domain

The same catalog, grouped by owning domain — the per-domain view the old Confluence tree promised but never filled in. Each list links into the filtered table above.

Account (4 events · 0 backend, 4 frontend)

Affiliates (3 events · 3 backend, 0 frontend)

Dashboard (4 events · 0 backend, 4 frontend)

Grouping (2 events · 0 backend, 2 frontend)

Infrastructure (1 events · 1 backend, 0 frontend)

Library (45 events · 33 backend, 12 frontend)

Onboarding (2 events · 0 backend, 2 frontend)

Resellers (9 events · 9 backend, 0 frontend)

Frontend Events

The 36 events fired from platform-frontend, by dispatch mechanism. Store-routed events get the full Segment envelope; direct-mixin events also hit Hotjar; onboarding events use the survey payload builder.

Store-routed (Segment envelope) (27)

EventAreaDestinationsTrigger
Assignment Section ExpandedAcademicSegmentExpand an assignment section
Assignment Sections Expand AllAcademicSegmentClick Expand All on assignment sections
User bookmarked a lessondynAcademicSegmentBookmark a lesson from within an assignment view
Test Attempt End FailedAssessmentsSegmentError thrown while ending a test attempt
User Answered A Test QuestionAssessmentsSegmentSubmit an answer to a quiz question
User Ended A Test AttemptAssessmentsSegmentFinish a test attempt
User Planned A Test AttemptAssessmentsSegmentTest attempt creation on assessment load
User Requested Next Question On A TestAssessmentsSegmentClick Next on a test question
User Requested Previous Question On A Test AttemptAssessmentsSegmentClick Previous on a test question
User Started A Test AttemptAssessmentsSegmentStart a test attempt
Inactive User Notification ShowndynDashboardSegmentInactive-status notification is displayed
User Clicked Buy NowDashboardSegmentClick the Buy Now / membership link
User Downloaded SOLIDWORKS Add-inDashboardSegmentClick the SOLIDWORKS add-in download link
courseVersion Bookmarked ClickeddynLibrarySegmentClick a course-version bookmark card
lesson Bookmarked ClickeddynLibrarySegmentClick a lesson bookmark card
Related Lesson ClickedLibrarySegmentClick a related-lesson recommendation
Related Lessons DisplayedLibrarySegmentRecommendation list is rendered
User Bookmarked a LessondynLibrarySegmentToggle a lesson bookmark (add)
User Bookmarked Course VersiondynLibrarySegmentToggle a course-version bookmark (add)
User Selected Bookmarked FilterLibrarySegmentSelect the Bookmarked filter
User Toggled Layout ViewLibrarySegmentToggle theater mode in the lesson player
User Unbookmarked a LessondynLibrarySegmentToggle a lesson bookmark (remove)
User Unbookmarked Course VersiondynLibrarySegmentToggle a course-version bookmark (remove)
User Viewed a LessonLibrarySegmentView a lesson in the player
User Viewed an Entire LessonLibrarySegmentLesson video playback ends
User Clicked Search ResultSearchSegmentClick a search result item
User Searched for ContentSearchSegmentExecute a search query

Direct mixin (Segment + Hotjar) (7)

EventAreaDestinationsTrigger
User clicked Leave School menu itemAccountSegmentHotjarClick Leave School menu item
User clicked Update Email linkAccountSegmentHotjarClick Update Email link
User closed Leave School ModalAccountSegmentHotjarClose the Leave School modal
User confirmed Leave SchoolAccountSegmentHotjarConfirm Leave School in the modal
User clicked Lesson (Learning Carousel)DashboardSegmentHotjarClick a lesson in the learning carousel
User Copied a ClassGroupingSegmentHotjarSubmit a copy-class form successfully
User Copied a GroupGroupingSegmentHotjarSubmit a copy-group form successfully

Onboarding (survey payload builder) (2)

EventAreaDestinationsTrigger
User Submitted Initial Onboarding StepdynOnboardingSegmentSubmit an onboarding survey step
User Updated Onboarding Interests and GoalsdynOnboardingSegmentSave interests-and-goals updates on the profile page

Methodology & Freshness

This page is a static snapshot generated by extracting event definitions from both repositories. To keep it fresh, re-run the commands below and regenerate.

Backend enumeration

# From platform-backend/src — the authoritative catalog is the class glob,
# NOT the seeders (seeders register only 26 of 135 to a destination).
grep -rlE "extends SegmentEvent(Contract)?\b" app --include='*.php' | wc -l   # 135
grep -rhoE "eventName = ['\"][^'\"]+['\"]" app --include='*.php'
grep -rhoE "const EVENT_NAME = ['\"][^'\"]+['\"]" app --include='*.php'
grep -rA15 "eventDetails = \[" app --include='*.php'   # payload keys

Frontend enumeration

# From platform-frontend
grep -rhoE "trackEvent\(['\"][^'\"]+['\"]" src --include='*.vue' --include='*.js' | sort -u
Two gotchas. (1) There are two base contracts — SegmentEvent (newer) and SegmentEventContract (older) — and they nest payload differently. (2) The seeders are a registration list, not the catalog: an event absent from every seeder still fires, it just isn’t routed to a destination (shown here as None).

To keep this fresh

  • Re-run the greps above; diff the backend class count and the frontend unique-name list against the stat strip.
  • Re-run the generator (prototypes/.build-event-dictionary.py) to rebuild the embedded data and this page.
  • Flag naming inconsistencies you find — e.g. the frontend fires both User Bookmarked a Lesson and lowercase User bookmarked a lesson, which Segment sees as two events.