NEXSUM_LABS
  1. Home
  2. Work
  3. A language-school chain attributed enrollments to campaigns for the first time
Book a call

[ Case study ]

Language educationGA4Google Tag ManagerCRM webhook integrationBigQuery export

A language-school chain attributed enrollments to campaigns for the first time

Enrollments closed over phone and in person weeks after a website visit; the CRM captured the enrollment but not the source, so the chain had spent two years buying ads it could not connect to a single enrolled student.

CLIENT a nine-location language-school chain — FOCUS Carry source into the CRM automatically

GA4 SetupAnalytics & CROGA4 SetupLanguage educationRepresentative example
Client
a nine-location language-school chain
Industry
Language education
Engagement
6 weeks — growth pod — analytics specialist
Service
Analytics & CRO / GA4 Setup
Headline outcome
Every enrolled student traceable to campaign paths, reported per location: No attribution → enrolled-student attribution, read from CRM-to-GA4 match rate

Representative examplesEvery case study in this library is an illustrative composite of the kind of engagement we deliver — written to show our method and standards, not to name clients.

Where they started

Nine locations teach evening and weekend language courses across a metro region, each with its own local campaigns, its own page in the shared site, and a front desk that closes the actual sale. Enrollments happen the way adult education always has — a visitor browses, thinks for days, then calls or walks in — and the deposit is taken by a person, not a checkout. The chain grew by acquisition, so each location inherited slightly different habits and slightly different vendor relationships. Marketing spend was decided annually per location by the owners, informed mostly by which manager argued hardest.

What it was costing

Enrollments closed over phone and in person weeks after a website visit; the CRM captured the enrollment but not the source, so the chain had spent two years buying ads it could not connect to a single enrolled student.

What they could see

  • The CRM held every enrolled student and almost none of the sources; the how-did-you-hear field was blank or guessed.
  • Owners asked which campaigns enrolled students, and the honest answer had been that nobody knew for two years.
  • Web form leads were traceable but were a minority; the phone, where most students arrived, left no trail.
  • Per-location budget conversations reopened from zero every autumn because no one could show what the previous spend produced.

The constraints we worked inside

  • The enrollment decision is long and multi-touch — a last-click view would just move the argument, not settle it.
  • Locations run semi-independently with local campaigns; attribution must work per location without fragmenting the data.
  • Front-desk staff capture leads; the source field must be filled for them, not by them.

What had been tried before

The front desks were asked to ask every caller where they found the school and type the answer into the CRM.
Students say the internet, receptionists paraphrase, and the field competes with a queue of real customers — the resulting data was worse than none because it looked complete.
Each location ran its ads with platform-reported form fills as the conversion, and the owners compared locations on cost per form fill.
Form fills are a small share of enrollments, so the comparison rewarded locations whose websites collected forms — not the ones whose phones rang and whose desks enrolled students.

What we proposed

We proposed removing the front desk from the attribution problem entirely: campaign source attaches to the lead server-side when the form or call arrives, the CRM record inherits it, and staff never fill a field. Enrollment status flows back from the CRM into analytics, so a conversion means enrolled-and-deposited rather than form-submitted, and reporting runs multi-touch per location because a last-click view would just move the argument rather than settle it. The owners get one per-location path report that shows the whole journey from first campaign touch to deposit, which is the artifact the autumn budget conversation had been missing.

Just as important is what we ruled out, and why:

  • A call-tracking platform with dynamic number insertion at every locationNine locations of number pools would cost more per year than the engagement and still miss walk-ins, which are a real share of adult-education enrollments.
  • Training receptionists on a structured source question with fixed optionsIt makes the data hostage to staffing; one new receptionist, one busy Saturday, and the field degrades again — the constraint was that source arrives filled, not filled by hand.

How the work ran

01Carry source into the CRM automatically

Forms and calls inherit campaign attribution into the CRM record server-side, so no staff behavior change is required for the data to exist.

02Report multi-touch per location

Path reports with a per-location dimension settle the spend question with the whole journey, not the last ad.

03Close the loop with the CRM

Enrollment status flows back into analytics, so conversion means enrolled-and-deposited, not form-submitted.

Delivered by the growth pod — analytics specialist over 6 weeks, with working increments reviewed with the client every week.

The stack, and the reasoning

GA4
Multi-touch path reporting with a per-location dimension exists natively; the chain needed journeys compared across nine sites, not nine more silos.
Google Tag Manager
Locations publish their own pages with local vendors; one container template keeps every site's form and click capture identical without a developer per location.
CRM webhook integration
Attribution must land in the CRM record server-side, because the CRM is the system of record for enrollments — writing source there once beats reconciling two systems forever.
BigQuery export
Enrollment decisions take weeks; the export preserves the raw path history so the per-location reports can be rebuilt for any date range when the owners ask.
Looker Studio
The owners read one page per location per month; the report joins campaign paths with CRM enrollment status so neither team re-litigates the other's numbers.

What went wrong

Obstacle

The first release covered web forms only, and calls — the majority of leads at most locations — stayed invisible for a month before call capture shipped.

Handled: We rebuilt the missing month by joining the call logger's exports to CRM records server-side, backfilled source for that period, and moved call capture into every future release plan.

Obstacle

Two locations used an older CRM plugin that silently dropped the webhook's custom source field on records edited within the first minute.

Handled: We caught the pattern in a completeness check, moved the write to a post-save hook for those installs, and added a weekly source-completeness alert to the location dashboards.

How we worked together

Cadence
A 30-minute call each Wednesday with the marketing manager and, on rotation, one location director; the owners received a one-page monthly summary ahead of each budget checkpoint.
Client side
The marketing manager owned the engagement day to day; each location's director supplied front-desk context and test enrollments; an outside CRM consultant we briefed handled the plugin work.
Decisions
Implementation calls we made and demoed weekly; anything changing what a location sees in its CRM went to the location directors' shortlist for a Friday decision.
They provided
CRM administrator access, a sandbox location for test enrollments, the call logger's export access, and thirty minutes weekly from each location director on rotation.

What changed

The headline: every enrolled student traceable to campaign paths, reported per locationNo attribution → enrolled-student attribution, read from CRM-to-GA4 match rate. A second check: lead records with complete source data at 68% → 91%.

The autumn budget conversation stopped being a negotiation of confidence and became a comparison of journeys. Owners could see that some locations' phones converted beautifully from campaigns their websites barely touched, and spend moved accordingly. Front desks noticed nothing — which was the point — and the marketing manager stopped hand-building a source spreadsheet that three people quietly disbelieved. Most tellingly, a location director who had resisted central reporting asked for her dashboard to be shown first at the owners' meeting, because for the first time it made her case for her.

The result was read from CRM-to-GA4 match rate against the pre-engagement baseline over the stated window, with a guardrail check on lead records with complete source data. Where platform-reported numbers and business outcomes differ, this record says which layer it is quoting.

What they own now

  • Per-location path reports joining campaign touches to enrolled-and-deposited outcomes.
  • The CRM webhook integration with its source-field mapping documented for the CRM consultant.
  • A source-completeness alert and a weekly checklist the marketing manager runs herself.
  • The tag manager template that new location sites inherit when they launch.
  • BigQuery export access with the backfill scripts kept for future gap repairs.

What we would do differently

We would put the phone-call capture in the first release — calls were the majority of leads, and the form-first release left a month's hole in the attribution story.

Analytics & CROGA4 SetupLanguage educationGA4

Next case study

A dealer group finally saw which ads sell cars after fixing cross-domain tracking across eleven rooftops