# Guilford College — Analytics Goals, Funnels & Audiences (Measurement Plan, Working Draft)

**Engagement:** Website & Analytics Refresh · **Project:** `website-and-analytics-refresh`
**Task:** #3 "Define analytics goals, funnels & audiences" (M1 Discovery) → seeds **Deliverable #2 "Analytics Measurement Plan"** (due Jun 30)
**GA4 property:** `359308554` · **Baseline window:** last 90 days (90daysAgo–yesterday), pulled 2026-06-22
**Status:** Working draft / framework. The Jun-30 follow-up is the polished Ellis-branded PDF; this is the structured seed. **Everything internal.**

> **Grounding (do not relitigate):** Audiences locked in Ty's order, confirmed by Jean — (1) prospective students & families, (2) external constituents: donors → alumni → wider community, (3) current students, (4) faculty/staff. Build funnels/dashboards around **enrollment + giving conversions first**; keep **current students** first-class (~60% direct/repeat). Don't narrow the site. Kickoff asks: prominent Give CTA, clear enrollment CTAs, seasonal flexibility, future personalization, automated weekly/daily reports. Event taxonomy is **tied to the page-type templates** (P0 + T1–T5 + the T6 portable frame) so it's instrumented once, globally.

---

## 0. North-star metric & the one-line story

- **North-star:** **Total qualified enrollment + giving conversions per 90 days** — the sum of `apply_submit`, `request_info_submit`, `visit_scheduled`, and `donation_complete`. Today this number is **effectively measurable only on the enrollment side** (giving is untracked), which is exactly the gap the refresh closes.
- **Today's reality from the live pull:** 7,044 conversions in 90 days, **100% enrollment-flavored** (application + RFI + email/call clicks). **Zero giving conversions tracked.** Forms fire generically (15.8k `form_start` / 12.7k `form_submit`) and aren't usable as funnel steps. Event names are vendor/ad-hoc (`guilford_*` ×3 for "application").
- **What success looks like:** a clean, standardized key-event set; a measured giving funnel where there is none; segmented forms; and a Looker dashboard + automated weekly/daily email that proves post-launch lift against the benchmarks below, with the launch date annotated in GA4 for a clean before/after.

---

## 1. Goals → KPIs (by locked audience priority)

Each KPI ties to a **real baseline number** and a **post-launch target/threshold**. Targets are framed as relative lift off the 90-day baseline (absolute targets get finalized at the Jun-30 plan once we confirm seasonality with a full-year pull and IT-side measurement is live). "New (post-launch)" KPIs have no baseline because the event doesn't exist yet — standing them up *is* the goal.

### Priority 1 — Prospective students & families (enrollment intent)

| KPI | Definition | Baseline (90d) | Post-launch target / threshold |
|---|---|---|---|
| **Apply starts** | `apply_start` key event (replaces `guilford_application_button` / `guilford_app_click_to_apply_site` / `application_page_visit`) | proxy ≈ **1,889** application-button + **1,068** click-to-apply + **183** app-page-visit (overlapping, not summable) | **+15%** apply_start vs reconciled baseline; clean single event |
| **Apply submits** | `apply_submit` (cross-domain confirmation from apply portal) | proxy ≈ **2,842** `guilford_college_application` conversions | **+10%** submits; submit:start ratio measurable for the first time |
| **RFI submits** | `request_info_submit` (segmented form, not a click) | **481** `request_information_click` + **478** `request_info` (click-level, not submit) | establish true submit metric; **+20%** vs click proxy |
| **Visits scheduled** | `visit_scheduled` (new key event) | **0 tracked** (traffic exists: `/visit` + `/visit/campus-map` rank in top ~15 pages) | stand it up; baseline first 90d, then +10% |
| **Program interest** | `program_interest` micro-event on program/major pages (T4) | not segmented (program-finder = 6,179 pv / 4,854 sessions) | stand up; correlate to apply_start as leading indicator |

### Priority 2 — External constituents (giving engagement) — **biggest gap**

| KPI | Definition | Baseline (90d) | Post-launch target / threshold |
|---|---|---|---|
| **Give CTR** | `cta_click {cta_type:'give'}` ÷ Give-CTA impressions/pageviews | **0 tracked** | stand up; establish homepage + footer Give CTR baseline; CTA now in hero zone (P0) |
| **Donation starts** | `donation_start` (cross-domain, fires on giving.guilford.edu / GiveCampus) | **0 tracked** | stand up cross-domain; baseline first 90d |
| **Donation completes** | `donation_complete` w/ `value` + `gift_type` | **0 tracked** | stand up; report gift count + revenue; this is the headline new capability |
| **Alumni/community engagement** | `email_signup`, `event_rsvp`, news-article engagement on alumni/community content | partial (`file_download` 660; no signup/RSVP segmentation) | stand up signup + RSVP key events |

### Priority 3 — Current students (wayfinding) — keep in view, do not narrow

| KPI | Definition | Baseline (90d) | Post-launch target / threshold |
|---|---|---|---|
| **Wayfinding success** | Quick re-entry to `/current-students`, `/account/login`, `/apply/status`, `/admitted-students`; measured via `cta_click {audience_priority:3}` + low search-refinement | `/current-students` **15,946 pv / 12,506 sessions**; `/account/login` 4,027/2,700; high direct/repeat | hold or grow engagement rate on these paths; **don't regress** |
| **Site search efficacy** | `site_search` + zero-result rate | `view_search_results` **1,349** (no zero-result/refine signal) | stand up `site_search {results_count}`; track zero-result rate, target < 15% |

### Priority 4 — Faculty/staff (wayfinding)

| KPI | Definition | Baseline (90d) | Post-launch target / threshold |
|---|---|---|---|
| **F/S re-entry** | Engagement on `/faculty-and-staff`, `/work-here`, `/directory` | `/faculty-and-staff` **8,193 pv / 6,542 sessions**; `/work-here` 2,741/2,610; `/directory` 7,627 pv | hold engagement; **don't regress** wayfinding |

### Cross-cutting — reach, quality, comparability (all audiences)

| KPI | Baseline (90d) | Post-launch target / threshold |
|---|---|---|
| Sessions | **120,036** | hold or grow; watch for tracking-migration dips (annotate) |
| Engagement rate | **45.0%** | **≥ 47%** (consistency/IA/mobile improvements) |
| Avg session duration | **~2:34 (154s)** | hold or grow on key sections |
| % Direct + % Returning (repeat audience) | Direct **31.2%**, Returning **31.2%** | hold (signals current-student/applicant loyalty retained) |
| Mobile share / mobile engagement | Mobile **35.3%**, Desktop **63.9%** | grow mobile engagement rate (mobile-first refresh) |

**Reporting cadence & owners:** automated **weekly** (account-lead + Guilford marketing) and **daily** (internal Ellis ops watch) Looker email; portal `metrics` receipts hand-entered until the GA4 auto-pull seam is adopted (see §7). Each KPI has an owner attached at the Jun-30 plan; any KPI without an owner and an attached decision gets cut per house format.

---

## 2. Audiences → GA4 segments / audiences (locked order)

Each is built **twice-purpose**: a reporting segment now, and a publishable GA4 Audience for future **personalization & remarketing** (Google Ads / display via Encoura). Defined by the **baseline behaviors/pages** observed in the pull.

1. **Prospective students & families** *(priority 1)*
   - **Defined by:** sessions touching `/admissions*`, `/admissions/apply`, `/apply/*`, `/program-finder`, program/major (T4) pages, `/visit*`, `/admissions/financial-aid/*`; or firing `apply_start` / `request_info_submit` / `program_interest`.
   - **Baseline anchors:** `/admissions/apply` 7,840 pv / 7,378 sessions; `/apply/` 2,752/1,434; `/program-finder` 6,179/4,854; financial-aid/tuition page in top ~15.
   - **Sub-audiences (preserve, don't narrow):** HS / Transfer / Graduate / Adult / International — set as `program_interest {level}` and apply-path params for later personalization.
   - **Remarketing seed:** apply_start-without-submit (cart-abandon analog) for Encoura retargeting.

2. **External constituents: donors → alumni → community** *(priority 2)*
   - **Defined by:** Give CTA clickers (`cta_click {cta_type:'give'}`), `donation_start` (cross-domain), giving-landing viewers; alumni/community via news-article engagement, `email_signup`, `event_rsvp`, `/news/*` depth.
   - **Baseline anchors:** **none giving-side** (the gap); news is the highest-volume page type (sitemap is overwhelmingly `/news/YYYY/MM/slug`); referral incl. `guilfordquakers.com`, `facebook.com`, `linkedin.com`.
   - **Remarketing seed:** donation_start-without-complete → giving retargeting (highest-ROI new audience).

3. **Current students** *(priority 3 — heavy/recurring)*
   - **Defined by:** Direct + Returning sessions landing on `/current-students`, `/account/login`, `/apply/status`, `/admitted-students`, `portal.mist.com` referrers; branded-organic to those paths.
   - **Baseline anchors:** Direct **31.2%** + Returning **31.2%**; `/current-students` 15,946 pv; `/account/login` 4,027 pv; `portal.mist.com/referral` 1,834. This is the "~60% direct/repeat" the kickoff intuited — **confirmed directionally.**
   - **Use:** guard wayfinding regressions; personalization candidate (returning → student quick-links module).

4. **Faculty / staff** *(priority 4)*
   - **Defined by:** sessions on `/faculty-and-staff`, `/work-here`, `/directory`, internal-tool referrers.
   - **Baseline anchors:** `/faculty-and-staff` 8,193 pv; `/work-here` 2,741 pv; `/directory` 7,627 pv.

**Cross-cut audiences (operational):** Mobile (35.3%) vs Desktop (63.9%); New (≈61% of sessions) vs Returning; Encoura-sourced (`encoura/display` 6,113 + `encoura/paidsocial` 3,080) for paid-media attribution.

---

## 3. Conversions (GA4 key events) + legacy reconciliation

**Primary key events** (marked "key" in GA4; these drive the north-star and funnels):

| New key event | Trigger | Key parameters | Reconciles / retires (legacy) |
|---|---|---|---|
| `apply_start` | Click into the application from any Apply CTA / `/GuilfordApp` / `/admissions/apply`; cross-domain handoff to apply portal | `cta_type`, `template`, `page_type`, `audience_priority`, `apply_level`, `device` | **Replaces** `guilford_application_button` (1,889), `guilford_app_click_to_apply_site` (1,068), `application_page_visit` (183) |
| `apply_submit` | Application submitted (confirmation page in apply portal, captured via T6 frame + cross-domain) | `apply_level`, `source_template`, `device` | **Replaces** `guilford_college_application` (2,842 conv) |
| `request_info_submit` | RFI form **submit** (segmented `form_submit {form_type:'rfi'}`) | `program_interest`, `audience_priority`, `template` | **Replaces** `request_information_click` (481), `request_info` (478) — moves from click to true submit |
| `visit_scheduled` | Visit/tour scheduled (form submit or scheduler confirmation) | `visit_type`, `date`, `template` | **NEW** — no current equivalent (`/visit*` traffic untracked) |
| `donation_start` | Give flow begins on `giving.guilford.edu` / GiveCampus (cross-domain via T6) | `gift_designation`, `source_template`, `entry_cta` | **NEW** — biggest gap |
| `donation_complete` | Donation confirmation page (cross-domain) | `value`, `currency`, `gift_type` (one-time/recurring), `gift_designation` | **NEW** — biggest gap |

**Micro / supporting events** (not all marked key; engagement + leading indicators):

| Micro event | Trigger | Key parameters | Legacy note |
|---|---|---|---|
| `cta_click` | Any CTA in the shared CTA system | `cta_type` (apply/give/visit/rfi/login/learn), `label`, `template`, `page_type`, `audience_priority`, `position`, `device` | replaces scattered ad-hoc click tracking; **Give CTR built from this** |
| `program_interest` | View/engage program-major (T4) or program-finder | `program`, `level`, `template` | new (program-finder is currently raw pageviews) |
| `viewbook_view` | "Uniquely Guilford" viewbook open | `viewbook_id`, `template` | new |
| `email_signup` | Newsletter/interest signup submit | `list`, `audience_priority` | new (segments out of generic form_submit) |
| `event_rsvp` | Event RSVP/register (T4 event detail) | `event_id`, `event_type` | new |
| `video_play` / `video_progress` | Media play / 25-50-75-90% | `video_title`, `percent`, `template` | enhances existing handful of `video_*` |
| `site_search` | Internal search executed | `search_term`, `results_count` | enhances `view_search_results` (1,349) with zero-result signal |
| `file_download` | PDF/doc download | `file_name`, `file_type`, `template` | standardizes existing `file_download` (660) |
| `click_to_email` / `click_to_call` | mailto / tel clicks | `audience_priority`, `template` | keep as micro (was 483 / 98) |

**Reconciliation/retirement path (so the baseline reconciles forward):** during the transition window, fire **both** the legacy `guilford_*` events and the new standardized events in parallel for ~30 days; build a mapping table in Looker (legacy ↔ new) so the pre-launch baseline stitches cleanly to post-launch; then retire the legacy events from "key" status (keep collecting briefly for audit) and mark the new ones key. **Do not delete legacy events from history** — annotate the cutover date.

---

## 4. Event taxonomy tied to the page-type templates (instrument once, globally)

**Principle:** one standardized GA4 event schema is baked into the **shared component kit** that powers P0 + T1–T5 (Drupal) **and** the **T6 portable frame** (non-Drupal: catalog, events, giving). A CTA, a card, a filter, or a form emits the *same* event with the *same* params no matter which template renders it — so we instrument the component, not the page. This is the direct synergy with the inventory's "consistency by reuse" thesis.

### Component → event map

| Shared component (from inventory §5) | Event | Notes |
|---|---|---|
| **CTA system / bands** (Apply / Give / Visit / RFI) | `cta_click` (+ `apply_start` / `donation_start` when the CTA is the funnel entry) | Give CTR and all CTA reporting come from here |
| **Card grids** (3-up/6-up, story/event/profile cards) | `card_click` | `{card_type, label, template, page_type, position}` |
| **Filter/sort + pagination (Load More)** (T3 listings) | `filter_use`, `load_more` | `{filter_type, value, results_count, template}` |
| **Forms** (RFI, apply, contact, newsletter, event RSVP) | `form_start`, `form_submit` **segmented by `form_type`** | fixes the generic 15.8k/12.7k problem; `form_submit {form_type:'rfi'}` → `request_info_submit` |
| **Article body / media** (T2) | `video_play`, `video_progress`, `file_download`, scroll-depth | engagement on the highest-volume type |
| **Stat callout / promo banner** (viewbook, Guilford Gives) | `cta_click`, `viewbook_view` | giving + viewbook promos |
| **Search** (global) | `site_search` | `{search_term, results_count}` |

### Canonical parameter dictionary (every event carries the applicable subset)

| Parameter | Type | Allowed values / format | Purpose |
|---|---|---|---|
| `template` | string | `P0`, `T1`–`T6` | which template fired it (cross-template consistency check) |
| `page_type` | string | `homepage`, `hub`, `article`, `listing`, `profile`, `program`, `event`, `interior`, `landing`, `external` | maps to inventory's 10 page types |
| `audience_priority` | int | `1`–`4` | locked audience order; powers audience-priority dashboards |
| `cta_type` | string | `apply`, `give`, `visit`, `rfi`, `login`, `learn`, `email`, `call` | CTA classification (Give CTR, enrollment CTAs) |
| `label` | string | human-readable CTA/card text | debugging + content reporting |
| `position` | string | `hero`, `nav`, `body`, `sidebar`, `footer`, `banner` | did the prominent Give placement work? |
| `device` | string | `mobile`, `desktop`, `tablet` | mobile-first validation (35.3% mobile) |
| `form_type` | string | `apply`, `rfi`, `visit`, `contact`, `newsletter`, `event_rsvp` | **the fix** for generic forms |
| `program` / `level` | string | program name / `hs,transfer,grad,adult,intl` | prospect sub-audiences + personalization |
| `value` / `currency` / `gift_type` / `gift_designation` | num/string | gift amount / `USD` / `one_time,recurring` / fund | giving revenue reporting |
| `results_count` | int | search/filter result count | zero-result + filter efficacy |
| `source_template` / `entry_cta` | string | template/CTA that started a cross-domain flow | attributes off-domain conversions back to on-site origin |

**dataLayer contract:** the component kit pushes a uniform `dataLayer` object (`{event, ...params}`); **GTM** maps it to GA4. The T6 frame ships the same dataLayer push + GTM snippet so non-Drupal systems emit identical events with zero per-system custom work.

---

## 5. Funnels

Steps are expressed as the standardized key/micro events. Baseline drop-off is noted only where the pull gives us data; most ratios are **first-measurable post-launch** (that's the point).

### A. Enrollment funnel (primary)
`session_start` → `cta_click {cta_type:'apply'|'learn'}` or program/hub view (`page_type:'hub'|'program'`, `program_interest`) → Admissions hub (`/admissions`) → `cta_click {visit|rfi|apply}` → **`apply_start`** → **`apply_submit`** (cross-domain confirm).
- **Baseline anchors:** `/admissions/apply` 7,378 sessions; apply_start proxy ≈ 1,889+1,068 button/click events; `guilford_college_application` 2,842 conv. **True start→submit ratio not currently computable** (overlapping legacy events) — standardization makes it computable.

### B. Giving funnel (priority 2, **net-new, cross-domain**)
entry (homepage hero / article footer CTA / promo) → **`cta_click {cta_type:'give'}`** → giving landing (`giving.guilford.edu` / GiveCampus, T6-framed) → **`donation_start`** → **`donation_complete` {value}**.
- **Baseline anchors:** **none** — there is zero giving tracking today. Stand up the full funnel; first 90d post-launch is the giving baseline. Prominent homepage Give CTA (P0) is the top-of-funnel lever.

### C. Visit funnel
entry → `/visit` or `/visit/campus-map` (`cta_click {cta_type:'visit'}`) → scheduler/form → **`visit_scheduled`**.
- **Baseline anchors:** `/visit` + `/visit/campus-map` in top ~15 pages but **no `visit_scheduled` event** — net-new conversion.

### D. RFI funnel
entry → program/admissions/hub → `cta_click {cta_type:'rfi'}` → `form_start {form_type:'rfi'}` → **`request_info_submit`** (`form_submit {form_type:'rfi'}`).
- **Baseline anchors:** click proxies `request_information_click` 481 + `request_info` 478; generic `form_start` 15,767 / `form_submit` 12,708 (un-segmented). Segmenting forms gives the first true RFI start→submit rate.

### E. Current-student wayfinding "funnel" (success = fast exit, not conversion)
entry (Direct/Returning) → `/current-students` / `/account/login` / `/apply/status` → `cta_click {audience_priority:3}` or `site_search` → task complete (low refinement, quick re-entry).
- **Baseline anchors:** `/current-students` 12,506 sessions; `/account/login` 2,700; Direct 31.2% + Returning 31.2%. Metric is **engagement + low search-refinement**, and the guardrail is **no regression** post-refresh.

---

## 6. Cross-domain & technical

- **Audit first, enhance — don't rebuild.** The existing GA4 (property `359308554`) has live data and an Encoura-driven setup. Inventory the current GTM container / gtag deployment, existing key events, and data streams **before** changing anything; map legacy → new (per §3) so we never lose history.
- **Standardize via GTM.** Move event firing into a single GTM container fed by the component-kit `dataLayer`. One container, one mapping, all templates.
- **Cross-domain measurement** (GA4 "configure your domains") across: `guilford.edu`, the **apply portal** (`/apply/*`, `portal.mist.com`), **`giving.guilford.edu` / GiveCampus**, **`catalog.guilford.edu`**, and the **events platform**. This is what makes `apply_submit` and `donation_*` attributable to their on-site origin.
- **Referral exclusions:** add `portal.mist.com`, `giving.guilford.edu`, GiveCampus host, `catalog.guilford.edu`, and the apply-portal host to GA4 referral exclusions / cross-domain list so cross-domain hops don't fragment sessions or self-attribute as referrals (today `portal.mist.com/referral` = 1,834 sessions, evidence of an un-joined hop).
- **T6 is the injection vehicle.** The portable frame ships the GTM snippet + the same `dataLayer` push, so non-Drupal systems (catalog, events, giving) emit identical events with no per-system custom engineering. This is the only practical way to measure off-domain giving + apply.
- **Consent mode / ADA-privacy:** implement **GA4 Consent Mode v2** (analytics_storage / ad_storage), respect the site's privacy/ADA posture, and keep the consent banner keyboard-accessible (consistent with the refresh's WCAG AA commitment). Note any consent-driven gaps loudly in the first post-launch report so consent changes don't make trends lie.

---

## 7. Dashboards + automated reports

- **Looker Studio dashboard, organized by audience priority** (one page/section each):
  1. **Enrollment** — apply_start/submit, RFI submit, visit_scheduled, start→submit funnel, by template & device.
  2. **Giving** *(net-new)* — Give CTR, donation_start/complete, revenue (`value`), funnel.
  3. **Audience reach** — sessions, new vs returning, **% Direct + % Returning** (the current-student loyalty signal), channel mix (Encoura split called out).
  4. **Content / top pages** — top pages & sections (news article volume), engagement rate, duration.
  5. **Wayfinding / search** — current-student + faculty/staff path engagement, `site_search` + zero-result rate.
  6. **Mobile vs desktop** — split + engagement, validating the mobile-first refresh.
- **Distribution:** Looker URL goes into the **project link library (kind `analytics`)** and into **Deliverable #2 `embedUrl`** so it renders as a **live embed** for the client. Automated **weekly + daily** email via **Looker Studio scheduled delivery** (weekly → account-lead + Guilford marketing; daily → internal Ellis ops watch). This satisfies the kickoff "automated weekly/daily reports" ask.
- **Portal `metrics` auto-pull:** the GA4 seam is now live in `src/lib/ga4.ts` (`isGA4Configured()` / `pullGA4Metrics()`) with Guilford's `projects.gaPropertyId = 359308554`, feeding report deliverables and weekly statuses. **Note:** the manual `metricsField()` (`src/fields/metrics.ts`) stays the **source of truth** until the auto-pull is formally adopted; the pull is additive receipts, not yet authoritative.

---

## 8. Baseline + lift

**Restated benchmarks (90d, property 359308554, pulled 2026-06-22):**

| Benchmark | Baseline |
|---|---|
| Sessions / Users / New users | 120,036 / 78,234 / 72,013 |
| Pageviews | 219,389 |
| Engagement rate | 45.0% |
| Avg session duration | ~2:34 (154s) |
| Conversions (current key events) | 7,044 (100% enrollment-flavored) |
| Channel mix | Organic 51.8% · **Direct 31.2%** · Display 5.1% · Referral 4.0% · Organic Social 3.1% · Paid Other 2.6% |
| New vs Returning | New ≈61% · **Returning 31.2%** |
| Device | Desktop 63.9% · **Mobile 35.3%** · Tablet 1.1% |
| Top pages | `/` 44,537 pv · `/current-students` 15,946 · `/faculty-and-staff` 8,193 · `/admissions/apply` 7,840 · `/program-finder` 6,179 |
| Enrollment conv. proxies | guilford_college_application 2,842 · guilford_application_button 1,889 · app_click_to_apply 1,068 · request_information_click 481 |
| Giving conversions | **0** (untracked) |

**Success thresholds (post-launch, vs reconciled baseline):**
- **Enrollment:** apply_start **+15%**, apply_submit **+10%**, RFI submit **+20%** (vs click proxy); visit_scheduled standing up with a first-90d baseline.
- **Giving:** donation_start/complete + Give CTR **established from zero** — the headline new capability; first 90d sets the giving baseline.
- **Quality:** engagement rate **≥ 47%**, mobile engagement up, **no wayfinding regression** on current-student/faculty paths.
- **Comparability:** standardized events live, legacy `guilford_*` reconciled and retired-from-key, forms segmented.

**Clean before/after:** annotate the **launch date** (and the **tracking-cutover date**) as GA4 annotations/events so the dashboard's before/after comparison is honest. Flag the dual-fire reconciliation window and any consent-mode gaps in the first post-launch report rather than letting trends lie.

---

## Open questions / dependencies for the human

1. **Cross-domain GA/GTM injection with IT — Gloria Thornton.** Confirm we can deploy a single GTM container + the T6 `dataLayer`/GTM snippet on the apply portal (`portal.mist.com`), `giving.guilford.edu`/GiveCampus, `catalog.guilford.edu`, and the events platform. This is the gate on all off-domain measurement (giving, apply_submit).
2. **GiveCampus / giving-platform access.** Need confirmation page reachability + ability to fire `donation_start`/`donation_complete` (and pass `value`). If GiveCampus doesn't allow custom tags, we need their native analytics export or a webhook as the fallback — flag early; giving is priority-2 and currently zero-tracked.
3. **Legacy `guilford_*` event ownership & retirement.** Who owns the current (Encoura-era?) event setup? Confirm we can run the 30-day dual-fire reconciliation and then retire the legacy events from "key" without disrupting Encoura's optimization.
4. **GTM container ownership.** Is there an existing GTM container, and do we get edit/publish (or a new container)? Audit-first depends on this.
5. **Apply portal confirmation page.** Confirm `/apply/*` / portal.mist.com exposes a reliable submit/confirmation signal for `apply_submit` (vs. inferring from the legacy `guilford_college_application` event).
6. **Visit scheduler.** What platform powers `/visit` scheduling, and can it fire `visit_scheduled`? (Net-new conversion.)
7. **Seasonality.** This baseline is 90 days; the Jun-30 plan should set absolute targets against a **full-year** pull (admissions cycle seasonality) — flagging now so targets aren't anchored to a single quarter.
8. **Consent mode / privacy posture.** Confirm Guilford's consent/ADA-privacy requirements so Consent Mode v2 is configured correctly before launch.

---

### Source files
- `artifacts/guilford-ga4-baseline.md` (live baseline — every benchmark above is built off it)
- `artifacts/guilford-page-type-inventory.md` (P0 + T1–T6 templates + shared component kit the taxonomy is tied to)
- `src/lib/ga4.ts` (GA4 auto-pull seam — live; `metricsField` stays source of truth)
- `src/fields/metrics.ts` (manual metrics receipts the pull populates)
