Marketing operations for growth-stage device companies

A lead-source schema that survives the distributor handoff

Build 7 min read

Most CRM implementations have one field called something like Lead Source, and it is asked to answer two questions at once: where did this demand come from, and who sold it. In a direct business those are the same answer. In a channel business they are not, and the field silently records whichever one was written last.

That is usually the order. Which is why marketing-sourced pipeline in device and DME companies has a habit of shrinking as the channel grows.

Why does one field not work here?

Because the number of parties between a manufacturer and a patient is far larger than a single field can describe. In Medicare fee-for-service data, the busiest single durable medical equipment product code involves 39872 distinct suppliers and 207950 distinct referring providers. Orthotic devices reach 6225 suppliers against 62303 referrers.

Those are counts for one product code, not a whole category. A manufacturer whose product touches even a fraction of that structure has thousands of possible transaction parties and hundreds of thousands of possible clinical referrers, and a single Lead Source picklist has to represent all of it. It cannot, so it collapses to whichever value the last process to touch the record wrote.

The data

4 rows · product categories, with supplier and referring-provider counts · retrieved September 3, 2026

Download CSV (1 KB)

The schema

Five fields. Each answers exactly one question, and no field is ever written twice by different processes.

FieldWritten byWritten whenMutable
demand_idWeb/form/event captureFirst identified touchNever
demand_channelWeb/form/event captureFirst identified touchNever
demand_actorWeb/form/event captureFirst identified touchNever
transaction_partnerOrder processAt order creationOnce
attribution_stateNightly jobDerived, recomputedDerived

The values are deliberately few. A picklist that needs a training session is a picklist that will be filled in wrong.

demand_id            immutable id, minted at first identified touch
                     format: dmd_<yyyymm>_<8 random chars>

demand_channel       how the demand was created — pick exactly one
                     paid_search | paid_social | organic_search | direct
                     email_outbound | event | webinar | referral_clinical
                     referral_partner | pr_earned | unknown

demand_actor         who expressed the interest — pick exactly one
                     end_user            the patient or their carer
                     clinician_referrer  prescribes or recommends, does not buy
                     provider_org        clinic, hospital or IDN buying directly
                     distributor_rep     channel partner acting for a buyer
                     gpo_or_payer        contracting entity, not the user

transaction_partner  the entity that books the order
                     null until an order exists; partner id or "direct"
                     written exactly once, by the order process only

attribution_state    derived nightly, never hand-edited
                     direct              demand and transaction are the same party
                     partner_fulfilled   we created the demand, partner booked it
                     partner_originated  partner created and booked it
                     unresolved          demand record missing or unjoinable

How does it work?

The load-bearing idea is that demand_id is minted once and never touched again. Every later process joins to it rather than overwriting it. The order process gets exactly one field of its own, transaction_partner, and no permission to modify anything upstream.

demand_channel and demand_actor are separate on purpose, and separating them is the change that does most of the work. A clinician who recommends a device and a distributor rep who orders it are both plausible values for a single Lead Source field, and they mean completely different things. One is demand creation. The other is fulfilment. Recording them in one place makes them indistinguishable forever.

attribution_state is derived, never entered. It is the answer to the question the business actually asks — did marketing create this revenue — and deriving it means it is recomputed correctly when late-arriving data changes the picture. The partner_fulfilled value is the one that matters most, because it is the population that a single Lead Source field destroys: demand the manufacturer created, booked through someone else.

Reporting then becomes a question about attribution_state rather than an argument about definitions. Marketing-sourced pipeline is direct plus partner_fulfilled. Partner-sourced is partner_originated. The unresolved count is a data-quality metric, and watching it is how a team finds out the capture is degrading before the quarterly number does.

What does it replace, and how do you migrate?

An existing Lead Source field usually contains a mixture of all five things this schema separates. Migrating means reading the current picklist and deciding, value by value, which of the new fields each one was really describing. That exercise is short and unusually clarifying, because most teams discover their picklist has three or four values that mean the same thing and one that means four different things depending on who selected it.

The mapping is mechanical once the distinction is clear. Values naming a marketing activity — a campaign, a trade show, a webinar — were describing demand_channel. Values naming a kind of person or organisation — clinician, distributor, hospital — were describing demand_actor. Values naming a specific partner were describing transaction_partner. Values like “referral” were ambiguous between all three and have to be split by inspection or retired.

Keep the old field, stop writing to it, and leave it read-only. Deleting it destroys the only record of how historic deals were classified, and the year in which both models run side by side is the year anyone can check whether the new one behaves sensibly. Renaming it to something with legacy in the name is usually enough to stop people populating it out of habit.

One decision is worth making early rather than by default: whether demand_channel records first touch or last touch. This schema assumes first, because the question it exists to answer is who created the demand. A team that wants last-touch reporting should add a separate field rather than redefining this one, since a field that changes meaning halfway through a year is worse than either choice.

How do you know it is working?

Four checks, run monthly, each of which fails loudly rather than quietly.

The first is the unresolved rate. It will never be zero, and its level matters less than its direction. A rate that climbs month over month means capture is degrading somewhere upstream — a form that stopped passing the key, a new landing page that was never instrumented, a partner portal that was rebuilt.

The second is a reconciliation. Total pipeline across all four attribution_state values must equal total pipeline in the finance system. If those two numbers disagree, the join is dropping records, and no amount of reporting sophistication on top of a lossy join produces a trustworthy answer.

The third is a mutation audit: count records where demand_id changed after creation. The correct answer is zero. Any other answer means a process has write access it should not have, and finding that in a monthly check is much cheaper than finding it during a board review.

The fourth is a distribution check on demand_actor. If one value accounts for almost everything, the field is not being captured — it is being defaulted. That usually traces to a form that sets a hidden value rather than asking, which is a five-minute fix that nobody notices for two quarters.

Where does it break?

Four places, all worth knowing before adoption rather than after.

Demand with no digital touch. A clinician who recommends a device in conversation generates real demand and no demand_id. Those records land in unresolved and always will. The schema does not solve offline demand; it makes the size of it visible, which is more than most implementations manage.

Partners who do not report. transaction_partner depends on the order process knowing which partner booked the order. Where a distributor reports aggregated sell-through with no order-level detail, the field cannot be populated honestly and should be left null rather than guessed at.

Retroactive application. The schema only describes deals that closed after it existed. Backfilling demand_id onto historic records means inventing data, so the correct move is to run the old and new models side by side for a year and report both, rather than restating history.

Picklist drift. Every value added to demand_channel after launch reduces the comparability of the series. Adding values is a governance decision, not a ticket, and the smallest sustainable list is the one that survives.

There is also a failure mode that is organisational rather than technical, and it is the one that kills most implementations. The schema takes write access away from the order process, which in practice means telling sales operations that a system they own may no longer change a field they have always been able to change. That conversation goes better when the reason is framed as protecting a number sales also gets judged on, and badly when it is framed as a marketing requirement. The technical work here is a few days. The agreement is the project.

What is the smallest first step?

Add demand_id alone, and make it immutable. Nothing else in this schema delivers value without it, and it delivers some value on its own — even with the other four fields absent, an immutable demand key means the demand history stops being destroyed at the moment of the close.

The sequence that works is deliberately slow. Mint demand_id at every identified touch and write it nowhere else. Then add demand_channel and demand_actor at capture, since both are known at that moment and neither depends on the order process. Then give the order process transaction_partner and revoke its write access to everything upstream, which is usually the politically hardest step and the one that makes the rest hold. Finally add the nightly job that derives attribution_state.

A team that gets through the first two steps before a fiscal year starts will have a defensible marketing-sourced number twelve months later. A team that tries to do all four at once generally ships none of them, because the fourth requires agreement from sales operations that the third has not yet earned.

The reason to do any of it is narrow and worth stating plainly. In a channel business the question is not whether marketing created demand. It is whether the company can still prove it after the order is written. One immutable field is most of that proof.

Want this kind of rigor pointed at your pipeline?

Book a Call