Ellis Agency. ANALYTICS · IMPLEMENTATION RUNBOOK
GOOGLE TAG MANAGER · APPLY & GIVING

Installing GTM on
apply and giving

Two very different jobs. apply.guilford.edu is a Slate portal that already carries Guilford's container — the work there is configuration, not installation. giving.guilford.edu is a WordPress site with no analytics on it whatsoever, which is exactly why the giving funnel has never had a baseline.

CLIENTGuilford College
PLATFORMSSlate · WordPress
AUDITED27 Jul 2026 · Live
STATUSInternal · Confidential
Ellis Agency.The estate
A

Where the four properties actually stand

Read from the live sites on 27 Jul 2026. Worth doing before any ticket is raised — two of these need nothing installed, and one of them needs everything.

PropertyPlatformGTM containerConsentWhere it stands
www.guilford.eduDrupalGTM-5BZ4942NoneThe reference implementation. Guilford's own container.
apply.guilford.eduTechnolutions SlateGTM-5BZ4942NoneSame container as the main site. Nothing to install.
www.giving.guilford.eduWordPress · DiviNothingNoneNo GTM, no GA4, no gtag, no pixel. The gap.
guilfordquakers.comSidearm SportsTW6R675 · K3TH4CCNoneVendor containers only — neither is Guilford's. See the separate runbook.
THIS SETTLES THE OPEN QUESTION FROM THE ATHLETICS RUNBOOK

Guilford's container is GTM-5BZ4942 — it is on both the main site and the Slate portal. Neither container on the athletics site matches it, so GTM-K3TH4CC is not Guilford's. That runbook's "check whether you already own it" step now has an answer: you do not, and the install there is genuinely needed.

What that means for this piece of work

  1. apply.guilford.edu needs no installation. Slate already renders the container on portal pages. Section B is configuration and one real defect.
  2. giving.guilford.edu is the only true install, and it is the easy one — WordPress, so Guilford controls it outright with no vendor ticket. Section C.
  3. Nothing anywhere has a consent gate. Not the main site, not Slate, not giving. Because all the Guilford-controlled properties share one container, consent can be fixed once, centrally. Section D.
WHY GIVING HAS NEVER HAD A BASELINE

The measurement framework records "no baseline anchors, giving-side — the gap." This is the cause, not a symptom: there has never been a tag on the giving site to produce one. Everything the campaign wants to report on starts the day this ships.

Guilford College · GTM on apply + givingConfidential · Internal02 / 6
Ellis Agency.apply.guilford.edu · Slate
B

apply.guilford.edu — already tagged, badly routed

Technolutions Slate. The container is present on portal pages, so this section is configuration plus one defect that is quietly costing you attribution on paid media.

The defect: the bare domain destroys campaign parameters

Only the root of the domain redirects. Everything below it is the live portal. But that root redirect drops the query string:

apply.guilford.edu/?utm_source=meta&utm_medium=paid&utm_campaign=fall26
  → 302  http://www.guilford.edu/admission/      (query string gone — and an insecure hop)
  → 301  https://www.guilford.edu/admission/
  → 301  https://www.guilford.edu/admissions     (lands with no campaign data)

Any ad, email or print QR code pointing at apply.guilford.edu arrives at the admissions page as Direct. With Encoura running display and paid social, this is live budget reporting as untracked traffic. Fix: make the root redirect preserve the query string and go straight to https://www.guilford.edu/admissions in one secure hop.

The portal paths that matter

URLWhat it isEvent to fire
/apply/?pk=UNDERThe undergraduate application itselfapply_startapply_submit
/register/?id=…Inquiry and event registration formsrequest_info_submit
/portal/campus_visitCampus visit schedulingvisit_scheduled
CONFIGURING, NOT INSTALLING

Because Slate already renders GTM-5BZ4942, adding conversion tracking is done entirely inside the container — no Technolutions ticket. Build triggers on the three paths above, and read the thank-you/confirmation step for the submit events rather than the button click, so you count completions and not intentions. If you need richer data than the URL exposes, Slate's custom source code per form can push a dataLayer object; that does need a Slate admin.

ONE THING TO CONFIRM

UA-9584163-1 is still rendered alongside the container here and on the main site. Universal Analytics stopped processing in July 2023, so it collects nothing — but leave it until you have confirmed nothing internal still points at it, then strip it from the Slate template and the Drupal theme together.

Guilford College · GTM on apply + givingConfidential · Internal03 / 6
Ellis Agency.giving.guilford.edu · WordPress
C

giving.guilford.edu — the real install

WordPress on the Divi theme with a grow-pro child theme, LiteSpeed caching, PHP 8.1. Guilford controls this outright, so no vendor is involved. Currently carries no analytics of any kind.

1

Divi → Theme Options → Integration Simplest

Divi ships a built-in code injection panel: Divi → Theme Options → Integration, then "Add code to the < head > of your blog." Paste the head snippet, save. It applies site-wide and survives Divi updates. Use this unless you need a managed dataLayer.

2

A GTM plugin Better dataLayer

A plugin such as GTM4WP adds the container and emits a structured dataLayer — post type, author, categories, form submissions — without hand-writing pushes. Worth it if the giving site grows campaign landing pages you want to segment.

3

Child theme header.php Only if you already maintain it

The grow-pro child theme can hold the snippet via wp_head. Most robust, but it is a code deploy and it is the one route that a careless theme update can silently revert.

HEAD SNIPPET — GUILFORD'S EXISTING CONTAINER
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-5BZ4942');</script>
<!-- End Google Tag Manager -->
LITESPEED WILL HIDE YOUR WORK — TWICE

1 · Purge after saving. The site runs LiteSpeed Cache and served us a cache hit. Until you purge all caches, you will keep loading a pre-tag copy of the page and conclude the snippet failed.

2 · Exclude GTM from JS optimisation. LiteSpeed's combine/defer options will happily reorder or inline the container and break consent ordering. Add googletagmanager.com to the JS excludes before you start debugging anything else.

Guilford College · GTM on apply + givingConfidential · Internal04 / 6
Ellis Agency.Shared configuration
D

Cross-domain, the GiveCampus hand-off, and consent

All three Guilford-controlled properties share one container, so these are configured once and inherited everywhere.

1 · Cross-domain measurement

In GA4: Admin → Data streams → the guilford.edu web stream → Configure tag settings → Configure your domains. List every Guilford-controlled domain, and fire the same measurement ID from the container on each. Both halves are required — the domain list lets the linker pass the client ID, the shared ID lets GA4 stitch the session.

www.guilford.eduapply.guilford.edu www.giving.guilford.educatalog.guilford.edu guilfordquakers.com

2 · The GiveCampus hand-off — be honest about the seam

Donations leave for givecampus.com/schools/GuilfordCollege/donate. That is third-party SaaS: you cannot put the container on it, and cross-domain linking to it will not work unless GiveCampus explicitly supports the linker. So measure the seam, do not pretend it isn't there:

3 · Consent, fixed once

No Guilford property has a consent gate today. Because they share GTM-5BZ4942, do not add a banner per site: create one Consent Mode default tag on the built-in Consent Initialization — All Pages trigger, denying everything except security_storage. GTM guarantees it runs before every other tag in the container, on every property, regardless of what each platform does with script order — which is the only reliable option when Slate and Divi both control their own <head>.

The banner built for the guilford.edu redesign already pushes a consent_update dataLayer event with the same category names, so it drives the update on every domain unchanged.

Guilford College · GTM on apply + givingConfidential · Internal05 / 6
Ellis Agency.Verify · and the punch list
E

Verify before you publish

All of it in Preview first. Publishing to a shared container touches four properties at once, so a mistake here is not contained to one site.

01
Container loads on giving

GTM Preview against www.giving.guilford.edu. If Tag Assistant will not connect, purge LiteSpeed before assuming the snippet failed.

02
Consent fires first

The Consent Initialization tag must appear above everything else, with GA4 tags blocked until consent is granted. This is the single most common mistake.

03
Hits land

GA4 DebugView on property 359308554: page views from both new hostnames within seconds.

04
Cross-domain holds

Click guilford.edu → apply.guilford.edu. The URL should carry _gl= and DebugView should not show a new session_start.

05
UTMs survive

Load apply.guilford.edu/?utm_source=test. Until the root redirect is fixed, the parameter will be gone at the destination — this is your regression test for that fix.

06
Apply events fire

Walk /apply/?pk=UNDER and /portal/campus_visit and confirm the events land on the confirmation step, not the button click.

07
Giving hand-off

Click the GiveCampus donate link and confirm donation_start fires before the browser leaves.

08
Referrals stop

After 48h, the new domains should stop appearing as referrals in Traffic acquisition. They will not disappear retroactively — watch for new rows to stop.

The punch list, in the order worth doing it

  1. Fix the apply.guilford.edu root redirect to preserve the query string over a single HTTPS hop. Cheapest fix here, and it is currently costing live paid-media attribution.
  2. Add the container to giving via the Divi Integration tab, then purge LiteSpeed and exclude googletagmanager.com from JS optimisation.
  3. Ship the Consent Initialization tag to the shared container — this closes the consent gap on all three Guilford-controlled properties in one change.
  4. Configure cross-domain and the GiveCampus GA integration; agree the monthly reconciliation.
  5. Build the apply and giving events, reading confirmation steps rather than clicks.
  6. Retire UA-9584163-1 from the Slate template and the Drupal theme once nothing internal still references it.
Ellis Agency. GUILFORD COLLEGE · WEBSITE & ANALYTICS REFRESH · JUL 2026
Guilford College · GTM on apply + givingConfidential · Internal06 / 6