
Cross-Channel CRM Reporting Engine for EA SPORTS FC
For EA SPORTS FC, I built a CRM reporting pipeline that brings email, in-game, and companion app performance into one source of truth. It replaced manual, channel-by-channel pulls with automated week-over-week and year-over-year views. As a result, leadership gets a clear read on campaign support levels and channel efficiency across key launch beats.
- CRM Reporting
- Marketing Operations
- Data Pipelines
- Entity Resolution
- Data Quality
- Measurement Frameworks
- AI Automation
My Role
I owned it end to end. That covered the measurement framework and KPIs, the data model, the pipeline, the data-quality fixes, and the executive dashboards.
What the CRM Reporting Pipeline Does
One Source of Truth
Campaign plans, send data, and in-game placements now meet in one model. Because of that, every channel is measured against the same beats and windows.
Data Quality by Design
I found and fixed a deduplication flaw that caused an order-of-magnitude metric inflation in in-game reporting. Then a backfill process resolved the large majority of unclassified records.
AI-Assisted Classification
I built an LLM agent that proposes campaign classifications. Safety gates and human approval come first, before anything changes. As a result, 99 raw planning values became 9 standardized beats.
Built to Scale Across Titles
I designed the framework once. Then I reused it for Madden NFL and EA SPORTS College Football, with no rebuild needed.
The Hard Part: Making Platforms Talk

Each platform described the same campaign differently. Email, in-game, the companion app, Airtable, and Looker each had their own naming, granularity, and IDs. However, no shared key connected them. So before any reporting could happen, the CRM reporting pipeline had to trace every record back to its campaign.
A Common Denominator
I built a shared campaign taxonomy as the “language” every platform translates into. It condensed 99 inconsistent planning labels into 9 standardized beats and 6 program pillars. As a result, a send, an in-game placement, and a planning record can all sit under the same moment.
A Matching Ladder, Not a Single Join
Where a clean key existed, I used it. Where it didn’t, the pipeline steps down:
- 1Exact match: campaign UID joined to the Airtable plan
- 2Contextual match: sales window and date logic when no UID exists
- 3Keyword match: custom overlap scoring links in-game placements to campaigns by name
- 4Default bucket: anything unresolved is isolated and flagged, never silently miscounted
Together, these steps resolved the large majority of unclassified records.

Custom Code Where Tools Fell Short
Off-the-shelf connectors covered the easy paths. For the rest, I wrote custom logic in Apps Script and n8n. However, large in-game datasets kept timing out the automation runner. So I moved the matching engine entirely into Apps Script, where it runs reliably at volume.
A Unique ID for What Comes Next
To prevent this problem going forward, I designed a campaign UID convention: Title + Content Name + Phase + Channel. It fits a 15–20 character slot inside a 50-character field that another team extends downstream. Every new request now carries a key. Because of that key, future parameters merge cleanly into the CRM reporting pipeline, with no matching ladder needed.
Results
The biggest wins were time and clarity.
- ~6 hrs → under 30 min Estimated weekly reporting time. Manual, channel-by-channel pulls became an automated refresh.
- 3 channels, 1 view Email, in-game, and the companion app are now measured against the same beats.
- A clear read on lift Leadership can see the lift each new campaign, effort, and channel adds. As a result, they know where extra support pays off.
Tech Stack
The CRM reporting pipeline runs in three layers:
01 · Inputs
Airtable (campaign planning) and Looker (performance metrics).
02 · Transform
n8n and Google Apps Script for joins, deduplication, and classification.
03 · Output
PostgreSQL and Grafana for executive WoW/YoY dashboards.
- Airtable
- Looker
- Google Sheets
- n8n
- Google Apps Script
- JavaScript
- SQL
- PostgreSQL
- Grafana
Next, see how the same thinking powers live football data triggers for EA SPORTS FC, or browse all projects.
Hero photo: Luke Chesser / Unsplash.