I built the data platform and identity-matching engine that let a global enterprise finally see the ROI of its Market Development Funds — resolving 460K+ messy partner-marketing touches to real CRM accounts, and putting one trustworthy MDF-ROI view in front of partner leadership across three theaters.
MDF-funded partner demand-gen ran through resellers and distributors worldwide, but the customer and partner names in the claims were free-text, multi-language, and didn't tie to CRM. So no one could say what any MDF dollar actually sourced.
A BigQuery pipeline that unified the marketing, CRM, and ERP sources; a Python fuzzy-matching engine that resolved touches to real accounts; currency normalization; and a Tableau suite that reported MDF ROI, sourced pipeline, and cost-per-opportunity by partner and geo.
Program scope & impact
The challenge
Every quarter the business spent real Market Development Funds on partner-led demand generation — events, webinars, telemarketing, campaigns — booked through a global network of resellers and distributors. Leadership's question was simple: which of that spend actually sources pipeline, and where? The answer was buried under four data problems.
Names that don't match
The end-customer and partner names in the funding claims were hand-typed free text — abbreviations, legal suffixes, typos — with no shared key to the CRM's account records.
Three systems, one truth
The story was split across the partner-marketing attribution platform (claim + touch data), Salesforce, and SAP — each with its own account identifiers.
Global & multilingual
Touches spanned North America, EMEA, and Asia Pacific in seven currencies and multiple non-Latin scripts — none of it comparable as-is.
Until those touches could be tied to real accounts, MDF ROI simply didn't exist as a number anyone could trust. My job was to build the data foundation that made it exist.
The platform I built
One pipeline, three stages: unify and harmonize the raw data, resolve every touch to a real account, then normalize and report. Here it is source to dashboard.
Before anything could be matched, the raw claim data had to be made trustworthy. In BigQuery I parsed a delimited partner-level string into a clean geo → country → area hierarchy across the three theaters, wrote MDF-spend logic tied to each claim's lifecycle status (in-flight claims use the requested amount; closed claims use the paid amount), and collapsed years of inconsistent free-text — activity types, business objectives, product and solution names — into a stable taxonomy. Unglamorous, but every downstream number depends on it.
Identity resolution
This is the engine at the center of the whole platform: a Python entity-resolution pipeline that decides, for every free-text company name in a partner touch, which real CRM account it actually is.
An exact-string join would have matched almost nothing — "Acme Corp.", "ACME CORPORATION", and "acme co" are the same customer to a human and three different rows to a database. Fuzzy identity resolution is the only way to attribute real-world, hand-typed data at scale.
| Step | What I do | Why |
|---|---|---|
| Cleanse | Strip legal suffixes and punctuation; remove any word appearing in >0.5% of names. | Removes noise ("Inc", "GmbH", "Technologies") that would otherwise inflate false matches. |
| Standardize | Convert every country to a clean ISO-2 code; translate non-Latin names to Latin script. | Lets an APAC touch and a US account name be compared on the same footing. |
| Block | Only compare candidates within the same country (sorted-neighbourhood indexing). | Cuts the comparison space by orders of magnitude — accuracy and compute cost. |
| Score | Six similarity metrics — Jaro-Winkler, Damerau-Levenshtein, token-set and partial ratios over two cleansing passes — combined by harmonic mean. | Harmonic mean punishes any single weak signal, so one flattering metric can't carry a bad match. |
| Resolve | Add a composite city/country tie-break, rank, and keep the single best account per touch. | One touch resolves to exactly one account — no double-counting downstream. |
Non-Latin-script markets (Japan, Korea, Taiwan, Israel) were pulled and translated on a separate path rather than translating everything. Translation is the most expensive step; isolating the ~small share of records that actually need it kept the monthly refresh fast and cheap without losing coverage.
The attribution model
With every touch tied to a real account, the model itself is deliberately simple and explainable — a rules-based, account-based attribution model, not a black-box statistical one. Partner leaders have to trust it and defend it in a review, so every credited dollar traces back to a specific touch and a specific account.
A statistical attribution model — Markov or Shapley — would have looked more sophisticated, but partner heads need to see exactly why a dollar was credited to stand behind the number in a QBR. An explainable, account-based model earns trust a black box never would.
How I ran it
The platform was only useful if it landed reliably every cycle and the right leaders trusted it. That was a program-management job as much as an engineering one.
| Dimension | How I ran it |
|---|---|
| Cadence | A monthly refresh + QA cycle — re-run the pipeline, validate the match quality, reconcile spend and pipeline, publish the updated Tableau suite. |
| Stakeholders | Partner global heads and regional geo leads across North America, EMEA, and Asia Pacific. I tailored the read for each — a global head wants ROI and where to reallocate; a geo lead wants their own partners and activities. |
| Planning & tracking | Ran the roadmap, refresh schedule, and enhancement backlog in Asana, and mapped it into the wider program plan in Microsoft Project so it stayed visible alongside the broader partner-marketing calendar. |
| Trust | Surfaced the match-confidence score in the dashboard itself, so stakeholders could see how sure a given attribution was — credibility comes from showing the seams, not hiding them. |
The recurring theme in the stakeholder work: partner leaders had been burned by numbers that didn't reconcile before. I earned trust by being transparent about match confidence and by making the same number mean the same thing in every geo's view.
What it enabled
The Tableau suite turned the matched model into decisions leadership could actually make. What it put on one screen:
MDF ROI, finally
For the first time, spend could be tied to sourced and influenced pipeline — by partner, geo, activity type, and solution — instead of living in disconnected, unmatched spreadsheets.
Efficiency, not just totals
Cost-per-opportunity and cost-per-won-opportunity views showed which partners and activities returned the most per MDF dollar — the input to where the next dollar should go.
Promise vs. reality
A "solutions promoted vs. products actually purchased" view exposed where funded campaigns and real buying diverged — a signal the business couldn't see before.
An illustrative, anonymized rebuild of the kind of monthly view partner leaders used — the layout and KPIs are generalized and the figures are placeholders, not real data.
The honest version of the impact
I won't put an inflated ROI multiple on this. What's true and defensible: partner leadership went from no trustworthy MDF attribution to a single monthly view — 460K+ touches resolved, three systems and seven currencies reconciled — that they used to judge partner and geo performance and steer where MDF gets invested.