1. How tracking works on outwardbound.org
Every action we measure on the site is an event. Segment collects events from the website and sends them to GA4, the ad platforms, Braze, and our Snowflake data warehouse. Segment is GA4's only feed, so if consent stops Segment from loading, GA4 doesn't see that visit.
2. Key terms
Page call
Records that a page loaded. Shows up in GA4 as page_view.
Track event
Records a meaningful action, like course_viewed or application_started.
Identify call
Links activity to a known person when they give an email or arrive from a Braze email with an identifier. It never fires without a real identifier.
Event property
Context attached to an event, such as course, School, page, filters, or consent. Properties let one event answer many questions.
Key event (GA4)
An event GA4 treats as an important outcome. Key events can be imported into Google Ads as conversions.
Conversion (ad platforms)
An event that Google Ads, Meta, or TikTok uses to measure results and optimize bidding.
Destination
Any system Segment sends events to: GA4, Google Ads, Meta CAPI, Braze, or Snowflake.
(not set)
Usually means a property was missing or couldn't be classified. It's typically a gap in measurement, not proof that nothing happened.
3. Current tracking plan
The events below are listed in the order a visitor typically moves through the site. "Status" reflects the most recent QA and handoff documentation we have. Items marked partial or open need to be revalidated in production.
Working Partial / revalidate Open issue Planned / confirm Documented conversion Recommended conversion
| Event | Funnel stage | Where / how it fires | Key properties | Status | Ad-platform use |
|---|---|---|---|---|---|
page_view (page call) | All | Every page load once Segment is allowed by consent. | path, page URL, title, referrer | Working | Basis for audiences and reports. Not a conversion. |
course_catalog_viewed | Discovery | Course catalog page loads. | Page context, filters present on arrival | Confirm naming | Audience building only. |
catalog_engaged | Discovery | A visitor uses catalog filters and/or stays on the catalog for 15, 30, or 60 seconds. Also intended to trigger Braze banners. | catalog_filters, page_url (required by Braze), ad_consent, engagement threshold | Partial | Audience signal. Not a conversion. |
course_catalog_clicked | Discovery | A visitor clicks a course in catalog results. | Course slug and title, the full filter state, page URL | Open Fires on the button but not on the course-title text. | Audience and analysis signal. Feeds the catalog filter analysis. |
course_viewed | Consideration | A course detail page (/course/…) loads. | course_slug, course_title, page_path, page_url, ad_consent. School and program properties still need to be added or confirmed. | Working | Documented The legacy equivalent ob_course_page_view is a GA4 and Google Ads conversion. |
course_engaged | Consideration | A visitor stays on a course detail page past set time thresholds (15, 30, or 60 seconds). | Course context, threshold_seconds, page context | Open Was firing repeatedly and inflating volume. | Possible engaged-visitor audience once fixed. Not a conversion. |
course_dates_modal_opened | Consideration | A visitor opens the dates/sessions modal on a course page. | Course slug and title, page context | Working | Strong-intent audience. |
course_session_selected | Intent | A visitor picks a specific session or date. | Course and session identifiers, date, course context | Revalidate | Recommended Secondary key event. |
application_opened | Intent | A visitor enters the application flow after clicking Apply. | Course and session context, page URL | Working | Documented The legacy equivalent ob_course_enrollment_page_view is a conversion. Meta CAPI mapping was set up in March 2026. |
application_started | Intent | A visitor begins filling out the application. An email entered here triggers an identify call. | Course and session context; email identify trait | Working | Recommended Matches "Start Application" in Meta and TikTok. |
application_completed | Conversion | A visitor successfully submits an application. | Course and session context, School | Open Didn't fire on a real application in March. Needs production validation. | Documented The legacy equivalent course_application_success is the primary conversion. |
schedule_call_clicked | Intent | A visitor clicks the schedule-a-call link. Calendly isn't embedded, so this is tracked as a click. | Page URL; course context (missing in early QA) | Open | Recommended Secondary conversion. |
schedule_call_completed | Conversion | The confirmation page loads. | Source/referrer context | Confirm trigger | Recommended if a reliable trigger exists. |
lead_form_submitted | Conversion | The lead-form confirmation page loads. | Form type, School, page context | Confirm trigger | Recommended |
| Newsletter signup + identify | Lead | A visitor submits a newsletter form, either the footer form or a School form. | Email trait, School attribution, form/page source | Identify working Event name still needs to be standardized. | Lead conversion candidate. |
cta_clicked | Any | A visitor clicks one of the defined CTAs. | CTA label, destination, page path | Confirm coverage | Analysis only. |
Live Chat Message Received | Support | A live-chat interaction occurs. | Page context | Rename Should follow snake_case. | Not a conversion. |
| Donation events | Fundraising | Donation start and completion paths. | Campaign, School, gift context | Not yet documented | Fundraising conversion candidate. |
| Identify call | Identity | Fires only when an email is captured or a Braze bxid is in the URL. | email, bxid → braze_id | Partial | Improves match rates. Not itself a conversion. |
4. Properties: the detail that makes events useful
An event tells us what happened. Its properties tell us which course, School, audience, and source it belongs to. Adding properties lets us segment existing events without creating new ones.
Global and common properties
| Property | Type | Example | Use |
|---|---|---|---|
page_url | string | https://www.outwardbound.org/course/blue-ridge-outdoor-educator/ | Required for catalog_engaged in Braze. |
page_path | string | /course/blue-ridge-outdoor-educator/ | Page grouping and Braze page targeting. |
ad_consent | boolean | true | Consent record. Must be a true/false value; an empty string causes Braze to reject the event. |
event_id | string | unique ID | Removes duplicate conversions between browser and server-side sends (Meta CAPI). |
course_slug | string | /course/blue-ridge-outdoor-educator/ | Course-level reporting and audiences. |
course_title | string | Blue Ridge – Outdoor Educator | Readable labels in reports. |
threshold_seconds | number | 20 | Engagement depth on course_engaged and catalog_engaged. |
catalog_filters | string | age-rangefilter=14-16&month=Jul 2026… | Catalog demand analysis. Typed as an object in Segment Protocols but sent as a string; the types need to match. |
Recommended additions for granular audiences and reporting
| Property | Add to | Why |
|---|---|---|
school, program_line, course_type | All course and application events | School-level reporting; specialty audiences such as Families, Veterans, Pathfinder, and Semester. |
age_range, population | Course and application events | Age is the most-used catalog filter (84% of user-driven clicks). |
region, activity, course_duration, course_start_month | Course and application events | Lets creative and audiences match how visitors narrow their search: age → month → length → region. |
catalog_filter_age, catalog_filter_month, etc. | Catalog events | Flat values GA4 can slice directly, instead of parsing one combined string. |
landing_source | Catalog and course events | Marks paid vs. organic arrival explicitly instead of inferring it from UTMs. |
course_session_id | Session and application events | Ties intent to a specific session for inventory decisions. |
cta_text, cta_location, form_type | CTA and form events | Shows which placements and forms actually drive action. |
fbclid, ttclid, and FormAssembly tokens from catalog_filters before sending. Move ad links off the retired age-groupfilter and onto the current age-rangefilter values so paid and organic traffic use the same labels.5. Conversions for ad platforms
In February 2025, GFM CenterTable added three conversions to GTM, GA4, and Google Ads. They match the Course View → Start Application → Application Submission funnel that Meta and TikTok use. The Segment events above are the newer tracking layer. The table below shows how the two line up and what we recommend.
| Funnel step | Legacy GA4 / Google Ads conversion | Current Segment event | Meta / TikTok equivalent | Recommended role |
|---|---|---|---|---|
| Course view | ob_course_page_view | course_viewed | Course view | Upper-funnel conversion. Use for audiences, not for primary bidding. |
| Session selected | None found | course_session_selected | None | Add as a secondary key event. |
| Application start | ob_course_enrollment_page_view | application_opened / application_started | Start Application / Checkout Initiated | Secondary conversion. Decide whether "opened" and "started" both need to exist. |
| Application submitted | course_application_success | application_completed | Application Submission | Primary conversion for bidding, once it's validated in production. |
| Consultation | None found | schedule_call_clicked / _completed | None | Secondary conversion once fixed. |
| Lead | None found | lead_form_submitted, newsletter signup | Lead | Secondary conversion. |
Attribution reminder: Ad-platform conversions only count people who clicked an ad within the attribution window (for example, 7-day click / 1-day view), and ad blockers and cookie limits remove some of them. Platform numbers will always come in lower than Salesforce application totals.
6. Example payloads
course_engaged, captured from Segment PROD, March 2026
analytics.track('course_engaged', {
ad_consent: '', // should be a boolean (true/false)
course_slug: '/course/blue-ridge-outdoor-educator/',
course_title: 'Blue Ridge – Outdoor Educator',
event_id: '', // should be populated for deduplication
page_path: '/course/blue-ridge-outdoor-educator/',
page_url: 'https://www.outwardbound.org/course/blue-ridge-outdoor-educator/',
threshold_seconds: 20,
userID: 'TEST123' // test value
});
Identify call when a Braze email link or form captures an identifier
analytics.identify('<user_id>', {
bxid: '<Braze identifier from URL>', // also stored as braze_id
email: 'visitor@example.org'
// subscriptionStatus was removed from identify calls
});
Recommended target shape: course_viewed with granular properties
analytics.track('course_viewed', {
course_slug: '/course/blue-ridge-backpack-rock-climb/',
course_title: 'Blue Ridge – Backpack & Rock Climb',
school: 'NCOBS',
program_line: 'Open Enrollment',
course_type: 'classic',
age_range: '14-16',
region: 'North Carolina',
activity: 'backpacking, rock climbing',
course_duration: 'two weeks',
landing_source: 'paid_social',
page_path: '/course/blue-ridge-backpack-rock-climb/',
page_url: 'https://www.outwardbound.org/course/blue-ridge-backpack-rock-climb/',
ad_consent: true,
event_id: '<unique id>'
});
Illustrative only. The values show the proposed structure, not a captured event.
7. What's next
1 · Validate
Test every critical event end to end: Segment → GA4 → Google Ads → Meta CAPI → Braze, using one shared test checklist.
2 · Fix
application_completed, schedule-call events, catalog title clicks, and course_engaged frequency.
3 · Reconcile
Map legacy conversions to the Segment events and set GA4 key events to match.
4 · Enrich
Add School, program, age, region, duration, and landing-source properties, plus flat catalog filter values.
5 · Expand
Add new events that Schools request, using the intake questions below.
8. Requesting new events (for Schools)
What action on your School's pages would you like to measure or respond to that we can't clearly see today? Example areas:
- Discovery: engagement on program pages, clicks from blog posts to courses
- Leads: brochure downloads, inquiry and group-program forms, scholarship-info requests
- Contact: phone and email clicks, starting a chat
- Fundraising and community: donations, event registrations, alumni and volunteer forms
Please include with each request
- The visitor action and the page where it happens
- The decision you'll make with this data
- Where you need it: GA4 reporting, ad optimization, an ad audience, or Braze messaging
- The details (properties) that would split it into useful groups
Event request form
Prefer a full window?
Takes about 3 minutes. Tell us the visitor action, the page where it happens, the details you'd want captured, and how you'll use the data. Requests go straight to the national marketing team.
- School and requester
- Event name and what triggers it
- Properties and an example URL
- Conversion / key event and priority