Skip to main content
Case Study

Marketing Operations from intake to attribution —
built as a system, not a process.

A full-stack Marketing Operations system designed for a health technology company scaling from pilot to multi-channel engagement. The brief: replace spreadsheets, Slack threads, and tribal knowledge with a coherent, repeatable campaign engine that an ops team of three can run at scale.

7
Steps per campaign (intake → closed)
6
Integrated platforms
5
Audience lifecycle stages
30→5
Min: human QA time reduction
The Problem
  • No standard intake — campaigns arrived via Slack, email, or hallway conversation. No structured brief meant Ops spent every Monday reverse-engineering what the requester actually wanted.
  • No naming convention — UTMs were handmade (spelling errors, missing fields, duplicates), making cross-channel attribution unreliable.
  • No QA process — campaigns went out without automated checks. Missed suppressions, broken links, and wrong segments were caught by the channel owner after launch — not before.
  • No feedback loop — no consistent measurement tied campaigns back to business outcomes. The team couldn't answer "which campaigns actually move retention?"
The Approach
  • Structured intake form in Monday with taxonomy-driven dropdowns. Campaign name auto-generated from selections — no typos, no guesswork.
  • UTM convention enforced at intake. Every link is tagged consistently for clean attribution across Braze, HubSpot, Short.io, and Lightdash.
  • Two-layer QA — AI handles the 10 binary checks (did the sync run, does the link resolve, is suppression applied). Human reviews the AI report plus content/compliance in ~5 minutes.
  • Two-tier measurement — Tier 1 executive scorecard (retention, pipeline, protected revenue). Tier 2 per-campaign reports with anomaly detection.
Key Design Principle

Every campaign follows the same path: structured brief → architecture → build → QA → launch → close. The system makes it easy to do the right thing and hard to skip a step. The UTM convention — not a dashboard — is the attribution layer.

System Architecture

Two tracks. One convention. Clean attribution.

The marketing stack splits into two functional tracks — one for the business-to-business pipeline (employer/partner sales), one for the business-to-consumer engagement layer (member communication). The UTM naming convention is the thread that ties them together.

Two-Track Model
Separate stacks, shared attribution layer
DimensionB2B PipelineB2C Engagement
CRM / SourceSalesforceData warehouse
Marketing AutomationHubSpotBraze
Audience SyncHubSpot workflowsHightouch (reverse ETL)
Link TrackingShort.ioShort.io
ReportingLightdashLightdash
Naming Convention
The glue that makes attribution possible
{team}_{motion}_{audience}_{quarter}
  • Team: client / growth / brand
  • Motion: engagement / retention / acquisition / reactivation
  • Audience: active-members / at-risk / b2b-clients / prospects
  • Quarter: auto-generated from date
Example: client_retention_at-risk_2026q3
Standardized Campaign Lifecycle
Every status maps to exactly one lifecycle stage — no ambiguity across teams
Planning
  • Planned — brief accepted, no work started
  • Building — assets in production
Execution
  • In QA — AI checks + human review
  • Approved — signed off by channel owner
  • Live — campaign is sending
Closed
  • Complete — performance read, learnings logged
  • On Hold — paused by Ops, not dead
  • Cancelled — documented with reason
Team Coverage Model

Campaigns are owned by one of three marketing teams. Each team's motion maps to specific audience stages:

TeamPrimary MotionsAudiences
Client MarketingEngagement, RetentionB2B Clients, Active Members
Growth MarketingAcquisition, ReactivationProspects, Churned
BrandEngagement, AwarenessAll, broad market
Ownership & Visibility
  • Single named owner per campaign — not a team, a person
  • Status tracked: planned → build → QA → approved → live → complete
  • Weekly ops review: what's live, launching, slipping
  • Tier 1 dashboard aggregates by motion type — leadership sees health, not volume
  • Delays flagged proactively — not discovered after launch
Intake & Workflow

Brief to results — no guesswork.

Every campaign follows the same path. Requests come through a structured form. Nothing gets built without a brief. Nothing launches without QA sign-off. Nothing closes without a performance read.

01
Intake Form
Team fills form in Monday. Campaign name auto-generated from selections.
02
Triage
Ops reviews: date feasible? Assets ready? Compliance flag? P1/P2/P3 priority assigned.
03 AI
Architecture
AI generates channel plan, audience spec, UTM string, and QA checklist from the brief.
04
Build
Campaign built in Braze or HubSpot. Audience synced. UTMs logged. Assets staged.
05 AI
QA
AI agent runs automated checks via API. Human reviews the report. Channel owner approves.
06
Launch
Campaign fires. AI monitors in-flight for anomalies. Day 1/3/7 briefings sent automatically.
07 AI
Monitor & Iterate
AI flags anomalies (open rate drop, unsubscribe spike). Ops reviews Day 7 report. Learnings logged and fed into the next brief.
Live Naming Generator
Select fields to see the campaign name auto-generate — same logic as the intake form.
Generated Campaign Name
client_engagement_active-members_2026q3
Prioritization Framework
P1 — Immediate
High impact + hard-to-reverse. Member-facing sends, partner commitments.
P2 — This Sprint
High impact + reversible. Paid campaigns, internal comms.
P3 — Backlog
Lower impact or long lead time. Scheduled by deadline proximity.
Tools & Stack

Connected tools. One source of truth.

No tool lives in isolation. Every platform passes data to the next. The UTM convention is the thread that ties them all together for clean attribution.

Data Flow
Two parallel tracks — B2B (employer/partner) runs through HubSpot; B2C (member engagement) runs through Braze.
B2B Track — Employer & Partner
Salesforce
CRM
Pipeline data
HubSpot
Marketing automation
Campaigns
Short.io
Link tracking
UTM attribution
Lightdash
Reporting
Pipeline influenced
B2C Track — Member Engagement
Data Warehouse
Source of truth
Member data
Hightouch
Reverse ETL
Audience sync
Braze
Member engagement
Email, SMS, in-app
Short.io
Link tracking
UTM attribution
Lightdash
Reporting
Retention + engagement
+ Monday — Intake + campaign tracking + Claude API — AI layer + RRD — Direct mail vendor
Tool Ownership by Role
ToolOwnerMarOps Role
HubSpotMarOpsB2B campaigns, build + launch
Data WarehouseData & MarTechValidate outputs
HightouchData & MarTechScope + validate syncs
BrazeShared / MarOpsMember campaigns, QA, launch
Short.ioMarOpsOwn all UTM links
LightdashAnalyticsScope reports, review
MondayMarOpsOwn the intake queue
APIs Powering Automation
  • HubSpot API — B2B campaign automation, contact management
  • Braze REST API — segment validation, subscription status, unsubscribe list
  • Hightouch API — sync status, timestamp, error count, row validation
  • Short.io API — link creation, click analytics, UTM validation
  • Lightdash API — dashboard queries, scorecard updates
  • Claude API — architecture generation, QA reports, briefings
Audience & Segmentation

Right message. Right person. Right time.

Five lifecycle stages. Every campaign targets one. Overlap is managed by suppression — not audience design. Audiences are built from the data warehouse and synced to the engagement platform via reverse ETL.

Prospect
Motion: Acquisition
Employer/partner decision-makers, not yet a client. Channels: paid, partner email, direct mail, organic.
B2B Client
Motion: Engagement / Retention
Active employer or partner accounts. Channels: email, direct mail, webinar, in-person events.
Active Member
Motion: Engagement
Enrolled members actively using the health platform. Personalized by program milestone and engagement level.
At-Risk Member
Motion: Retention
Disengagement signals: no activity for 7+ days, reduced check-ins, lapsing engagement markers. Trigger-based.
Churned / Inactive
Motion: Reactivation
Members who exited or went fully dark. Lower frequency, higher personalization. Channels: email, direct mail.
Audience Build Process
1.MarOps scopes criteria → submits to Data & MarTech
2.MarTech builds model in data warehouse
3.Reverse ETL syncs to engagement platform on schedule
4.MarOps validates: sync ran, count within tolerance, suppressions applied
5.Segment documented in campaign log before launch
Suppression Logic
Always Applied
  • Global unsubscribe list (email + SMS)
  • Subscription group opt-outs
  • Members in active onboarding sequence
  • Frequency cap: same motion within [X] days
Campaign-Specific
  • Audience overlap with concurrent campaigns (P1 wins)
  • Member-level flags (medical hold, account dispute)
QA System

QA is a system, not a habit.

Habits slip under pressure. Systems don't. Every campaign runs through an AI pre-flight before a human reviews the report — not a blank checklist starting from zero.

Two-Layer Model

AI handles everything binary — did the sync run, does the link resolve, is suppression applied, does the UTM match the convention. The human reviews the AI's report + content/compliance items AI can't assess. Human QA time: 30 min → 5 min.

Layer 1 — AI QA Agent
Automated
🔗
Sync freshness
Last sync <6hrs, zero errors, row count as expected
API
👥
Segment size validation
Count within ±10% of expected — flag if outside
Braze API
🚫
Suppression applied
Unsubscribe list + subscription group status confirmed
Braze API
🔖
UTM present on all links
Every link has source, medium, campaign — no bare URLs
Link scan
UTM convention compliance
Campaign slug matches intake taxonomy exactly
String match
🌐
Short.io links resolve
All shortened links return 200 — no 404s
Short.io API
Layer 2 — Human Review
~5 min
✍️
Subject line + preheader
On-brand, accurate, no typos
Human
📋
Copy + health claims
Factually accurate, compliance reviewed if flagged
Human
🖼️
Imagery + alt text
Renders correctly, alt text present
Human
Send time + timezone
Correct for target audience geography
Human
👤
Channel owner sign-off
Content approved before launch
Human
Human reviews the AI report, not a blank checklist. Any FAIL from AI stops the launch.
Days 1–30
Human-Only QA
Run the checklist manually. Build baseline error rate. Document current state.
Days 31–60
AI QA Introduced
AI runs automated checks. Human reviews report. Track AI accuracy rate.
Day 60+
Human Review Narrows
AI accuracy verified → human review narrows to content + compliance. Goal: <10 min per campaign.
Measurement Framework

Tier 1 answers "Are we healthy?"
Tier 2 answers "Why?"

Leadership lives in Tier 1 — outcomes, retention trends, protected revenue. Ops and channel owners live in Tier 2 — channel performance, UTM attribution, anomalies.

Tier 1 — Executive Scorecard
Always-on
MetricBusiness Value
Member Retention Rate
% active at 30/60/90 days
Each retained member ≈ $8K+ annualized savings
At-Risk Reactivation Rate
% re-engaged within 14 days
Proxy for churn prevention ROI
B2B Pipeline Influenced
Deals touched by marketing
Revenue attribution to marketing
Protected Revenue
Retained members × average savings
Estimated value of retention campaigns
Non-revenue campaigns use a proxy: re-engagement event × estimated lifetime value. The $8K figure is based on published industry benchmarks for health engagement programs.
Tier 2 — Campaign Report
Per campaign
ChannelKey Metrics
Email (Braze)Open rate ±baseline, CTR, unsubscribe, conversion
SMS (Braze)Delivery, click rate, opt-out rate
Paid MediaCPL, CTR, UTM-attributed pipeline via CRM
Direct MailDelivery confirmation, response via short link
In-AppImpression rate, click, action taken post-view
Attribution Chain
CampaignUTM-tagged
Short.io links
Short.ioClick recorded
with full UTM
CRMConversion captured
with UTM params
LightdashAggregated by
utm_campaign filter
ScorecardBusiness outcome
attributed to campaign
Because utm_campaign always matches the intake-generated name, the analytics team can query reports with a simple filter — no manual tagging, no cleanup. The convention is the attribution layer.
navigate tabs