Deals, stage history and source from the CRM and marketing
A cascade of signals sets one channel per deal
Conversion by stage and channel
Dashboard, channel meeting and AI agent
What it solves
- Each deal has one channel, set by a rule every dashboard repeats.
- The comparison shows where each channel loses: at the top, in the middle or at closing.
- Deals with no source show up as such, instead of vanishing or inflating a channel.
Business questions it answers
Ask your agent these questions once the case is live.
What you need
- CRM connected with stage history and the source fields (UTM, source, channel)
- The marketing automation tool or forms that store the conversion UTM
- The official channel list and the priority order between signals
What you get
- A table with one channel per deal and the rule that classified it
- Funnel by channel and entry month, with stage to stage conversion
- Dashboard comparing channels side by side, with volume next to the rate
- An AI agent that answers by channel with the rule already applied
Where to activate
The quarter's funnel by channel, with volume, conversion by stage and cycle.
Answers where leads and sales came from with the cascade applied.
Notice when the No source share goes above the agreed limit or a channel drops to zero overnight.
The funnel already exists if the pipeline view is done. The work is decoding the source and agreeing on the channel cascade with the team. The detailed view has the business rules, the pitfalls and the acceptance test. Or send everything straight to your agent with the Nekt MCP.
The lead source is scattered: UTM on the form, an encoded traffic_source in the marketing automation tool, a free text field in the CRM, gclid and fbclid in the URL. Each dashboard picks one field, the same deal counts in different channels and a large share ends up with no channel or in a generic one. The channel comparison becomes unfair and budget follows whoever speaks loudest.
How it is usually done, and the rule
Each row is a mistake that already happened in practice.
Define an order of signals and keep the first one that exists: click id or paid UTM (gclid, gbraid, wbraid, fbclid, li_fat_id, utm_source with a paid medium), then internal identifiers (product signup, event, partner), then the session referrer (search engine becomes organic, social network becomes organic social, AI assistant becomes AI), then the CRM source field and, last, No source. Store in another column which rule classified each deal.
Use the deal's entry source (first conversion or creation), not the last interaction. A deal that comes back through another channel stays in its entry channel; a last touch reading, if useful, goes in another column. Some CRMs keep only the card's current source: rebuild the entry from the contact's first conversion.
RD Station stores the source in traffic_source with the encoded_ prefix and a base64 JSON of the first and last session; traffic_medium and traffic_campaign are almost always empty. What looks like missing tracking is encoding. On Meta's native form (Lead Ads), the lead never visits the site and arrives without UTM: link it by form or ad id, or by the first visit URL ids tested against the real campaign ids.
In HubSpot, hs_analytics_source = OFFLINE means the record was created by import, integration or by hand, not that the lead came from an offline channel. Before accepting OFFLINE, look for UTMs in the fields of the deal and of the associated contact.
Always separate paid leads from organic ones, and active prospecting (outbound, cold calls, WhatsApp blasts, SDR) from inbound. Volume that comes in through batch loads, list imports or system integrations is not a lead: in a real case, 3 in 4 conversion events were imports.
Keep a reference table with every spelling of each channel, lowercase and without accents (in a real case, 60 spelling variants for a handful of sources). Separate channel, the messenger (ad, WhatsApp, referral), from origin, the subject (the event, the campaign, the content).
Channel conversion is measured within the deal's entry month and with the same stage definition for every channel. Recent cohorts have not had time to close yet: flag the window as incomplete until the average cycle of the slowest channel has passed.
Show No source as a channel, with its own volume and conversion. Never allocate it across the other channels. If the client decides that 'unknown' counts as digital, record the decision; '(no source)' stays out.
Channels with few deals in the cohort produce rates that swing a lot from one month to the next. Show volume next to the rate and only compare channels above a declared minimum number of deals.
Channel cascade
Top to bottom: the first matching rule sets the deal's channel.
Definitions
Pitfalls that already happened
The marketing automation medium and campaign fields were empty in almost every event, and the team assumed there was no tracking. The source was in base64 inside traffic_source.
Decode traffic_source before concluding UTMs are missing.
A system integration generated 9 in 10 conversion events of the period and inflated an entire channel.
Exclude batch loads and integrations by the event source.
Leads from Meta's native forms reached the CRM with less than 1% UTM fill and fell into No source.
Link by form id or by the ad ids in the first visit URL.
The same source field held base64, query strings, free text, app URLs and blanks.
Handle each format in one step of the cascade, with a test per format.
Adding the conversions reported by Google and Meta gave more leads than the CRM, because each platform credits the conversion on the click date and neither deducts the other.
Count leads and sales by channel only in the CRM; platforms bring spend and clicks.
The channel picked by hand on the card did not match the tracked source and nobody noticed.
Cross the manual channel with the expected source in a reference table and show the mismatches.
Acceptance test
The case is done when every item passes.
- Every funnel deal has exactly one channel and one recorded classification rule.
- The sum of leads across all channels, including No source, equals the month's total leads in the funnel.
- Leads and sales by channel for a closed month match the CRM or marketing automation source report (difference under 2%).
- No import, test or integration deal appears as a channel lead.
- Running again does not change the channel of any deal already classified.
Agent package
Paste into Claude, ChatGPT or any client with the Nekt MCP connected.
Funnel by channel - Source: funnel by channel table. Deal channel = the channel column, one per deal, set at entry and frozen. - Cascade: paid click or UTM > internal identifier (product, event, partner) > session referrer > CRM source > No source. - hs_analytics_source = OFFLINE is how the record was created, not a channel. - Leads, MQLs, SQLs and sales by channel come only from the CRM. Media platforms bring only spend and clicks. - Paid, organic and outbound are separate. Imports, tests and integrations are not leads. - Channel conversion is measured in the entry month cohort. A cohort younger than the average cycle is flagged as incomplete. - No source is a visible channel. Never allocate it. - Always show volume next to the rate. Do not compare channels with fewer than <minimum> deals in the cohort. Client exceptions: - <client>: 'unknown' counts as digital; '(no source)' stays out. - <client>: channel list and spellings in <reference table>.
Build the "Funnel by channel" case in my Nekt workspace following the rules at https://academy.nekt.com/en/casos/funil-por-canal.md. 1) Find the source tables and confirm the columns the rules use. 2) Create a transformation at the stated grain applying every rule. 3) Run the acceptance test and show me the result of each item. 4) Create the case's context document in the workspace, leaving my clients' exceptions open for me to fill in.
Variations
Join spend by channel and month to get CPL, cost per MQL, cost per SQL and CAC.
Go from channel down to campaign with the normalized utm_campaign matched against the campaign name or id on the platform.
For agencies, the same cascade per client, with exceptions in a configuration table.