Facebook tracking pixel CRM Attribution Properties | Conversion System Skip to main content
How-To Guides 11 min

CRM Attribution Properties

CRM attribution properties track which content asset produced a form fill. Seven-field schema, CRM/email platform and Salesforce setup, five-column pipeline report.

Definition

CRM attribution properties are custom fields on the Contact or Lead object that record which content asset produced a form fill, preserving first-touch asset slug, date, type, last-touch asset slug, last-touch date, asset touch count, and content cluster. This seven-field schema enables a per-asset pipeline attribution report showing which specific blog posts, landing pages, or emails influenced closed revenue, without a third-party attribution tool. Only 41% of marketing leaders rate their organizations as mature in performance measurement (McKinsey 2024, n=100+), and the missing layer is usually the asset-level CRM property schema.

CRM attribution properties are the custom fields that record which content asset produced a form fill, not just which channel or campaign. Only 41% of marketing leaders rate their organizations as mature in performance measurement, according to McKinsey's "Connecting for Growth" research (n=100+ C-level executives, 2024), and the gap between intention and capability is rarely about picking the wrong attribution model. It comes from a CRM lacking the property schema to hold asset-level data. Standard source fields record channel, overwrite on the next submission, and cannot answer "which blog post influenced this closed deal." The per-post attribution framework covers the measurement model; this post covers the property setup that makes it work in CRM/email platform and Salesforce. Specifically: the seven mandatory fields, the deduplication rules, the platform-specific configuration, what breaks in practice, and the five-column pipeline report these properties produce.

What are CRM attribution properties, and why do standard contact fields fall short?

Channel attribution answers which traffic source brought a contact in: paid search, organic, email, or direct. Campaign attribution narrows it to which named campaign. Asset-level attribution asks a different question: which specific blog post, landing page, or email produced the form fill that opened the pipeline relationship?

The first two questions are answered by built-in CRM fields. The third is not. Asset-level attribution requires a custom property schema because the unit of measurement is the URL slug, not the campaign ID or the UTM source value.

What the built-in source fields actually record

CRM/email platform's native "Original Source" and "Latest Source" properties capture channel and subsource at contact creation and at the most recent form submission. Salesforce's Lead Source field captures one value and holds it until a workflow or a human overwrites it. Neither field stores the URL slug of the post that generated the contact, and neither has a deduplication rule that protects first-touch context once a second form fill arrives.

Why last-write-wins field logic destroys attribution history

When a contact fills three forms over 90 days, the built-in source field holds the last value. If they found a product comparison post through organic search, downloaded a guide two weeks later, then booked a demo from a direct email link, the source field reads "Direct." The post that started the relationship leaves no trace in the record.

What this costs in a pipeline attribution report

A pipeline attribution report built on native source fields can show that 62% of pipeline came from organic search. It cannot show that 44% of that organic pipeline came from three specific posts. Without asset-level custom fields, every content attribution report stops at the channel layer, and every board conversation about content investment stays at "organic performed well this quarter" rather than naming the posts that drove it.

Which CRM attribution properties do you need for per-asset tracking?

The minimal schema is seven fields on the Contact or Lead object. Each field has a specific job, a specific write rule, and a specific column in the pipeline report.

The seven mandatory fields

first_touch_asset_slug (text, 255 characters): the URL slug of the first content asset that produced a form fill. Set once. Never overwritten.

first_touch_asset_date (date): the date of the first-touch form fill. Enables time-to-qualification calculations per asset and cohort analysis by content publishing period.

first_touch_asset_type (picklist: blog-post, email, landing-page, webinar, guide): the asset format. Filters pipeline reports by content type without a regex match on the slug.

last_touch_asset_slug (text, 255 characters): the slug of the most recent content asset that produced a form fill. Updated on every submission. Identifies the conversion asset rather than the acquisition asset.

last_touch_asset_date (date): the date of the most recent submission. Pair with first_touch_asset_date to compute time-to-qualification.

asset_touch_count (number, integer): the count of unique content assets that have generated a form fill from this contact. Increment each time last_touch_asset_slug changes to a new value.

attributed_content_cluster (picklist: C1/C2/C3/C4 or equivalent topic labels): the cluster the first-touch asset belongs to. Travels on the contact record so cluster-level pipeline rollups need no join against a separate content catalog.

Optional enrichment fields for teams with structured UTM schemas

If you already run a structured UTM campaign schema, two additional fields improve cohort fidelity: first_touch_utm_campaign (text, mirrors utm_campaign at first-touch form fill) and first_touch_utm_content (text, mirrors utm_content). These let you cross-reference the asset slug against the campaign schema without a separate ETL step. Add them after the seven mandatory fields are validated and producing consistent fill rates. Adding enrichment fields before the core schema is clean leads to teams maintaining nine fields that explain less than seven would have.

The difference between utm_content and first_touch_asset_slug

These two fields are not the same. utm_content comes from the URL the visitor clicked before arriving on your page. first_touch_asset_slug comes from the page URL where the form lives. For a blog post with an embedded form, the two often agree. For a pop-up or modal form appearing on multiple pages, utm_content reflects the click source while first_touch_asset_slug reflects the form host page. Build the schema around first_touch_asset_slug, derived from window.location.pathname on the form page. The JavaScript implementation is in Capturing UTM on Form Submit: The Wiring Guide.

How do you configure these properties in CRM/email platform?

All seven fields live under Settings > Properties > Contact Properties > Create Property in CRM/email platform. Three configuration details determine whether the schema produces reliable data.

Property type, max length, and visibility

For first_touch_asset_slug and last_touch_asset_slug, select Single-line text with max length 255. For first_touch_asset_type and attributed_content_cluster, select Dropdown select and enter your picklist values. For asset_touch_count, select Number with 0 decimal places. For the date fields, select Date picker. Set all seven to not visible in forms. These fields are written by automation. Marking them form-visible creates false data when form libraries interpret a blank visible field as an empty string rather than null, triggering premature workflow enrollment on a blank slug.

The enrollment workflow that writes values without overwriting them

Create a Contact-based workflow with two enrollment criteria: first_touch_asset_slug is unknown, AND the hidden form field carrying the page slug (name it hidden_asset_slug) is known. Set the workflow to enroll contacts once. The action sets first_touch_asset_slug to the hidden_asset_slug value, first_touch_asset_date to today, and first_touch_asset_type based on the URL prefix. A second workflow handles last_touch updates: it enrolls on every submission and overwrites last_touch_asset_slug and last_touch_asset_date, then increments asset_touch_count by 1. A JavaScript snippet reads window.location.pathname at page load and writes it to the hidden_asset_slug input, which the form carries into CRM/email platform on submit. The same pattern powers the withUtm() helper used across this site.

The enrollment criterion that protects first-touch data

The deduplication logic is the enrollment criterion itself. Because the workflow fires only when first_touch_asset_slug is unknown, it fires exactly once per contact. When the same contact submits a second form, the property already has a value, the enrollment criterion fails, and the field stays locked. No separate conditional step is needed inside the workflow. The enrollment criterion is the deduplication mechanism.

Verifying the field write in the contact timeline

After a test submission, open the resulting contact in CRM/email platform and search for first_touch_asset_slug. The value should match the page slug where the form lives. If blank, check the contact timeline for workflow enrollment. If the workflow enrolled but the field is still blank, the hidden_asset_slug field carried no value on submit, which is a JavaScript timing issue, not a workflow error.

How do you configure these properties in Salesforce?

Salesforce adds one complication CRM/email platform does not: the Lead-to-Contact conversion event. Attribution data written to Lead fields vanishes unless you explicitly map it to Contact fields before conversion happens.

Lead fields, Contact fields, and the conversion field mapping

Create all seven fields on both the Lead and Contact objects using identical API names (for example, First_Touch_Asset_Slug__c on both). In Setup, go to Lead > Fields > Map Lead Fields and map each custom Lead field to its Contact counterpart. Salesforce does not map custom fields automatically. Skip this step and the conversion event drops every attribution field; the resulting Contact has no acquisition history.

Campaign Members for the multi-touch layer

Salesforce's Campaign Member object records every Campaign associated with a Contact, with a Member Status and a created date. For multi-touch attribution across the full buying cycle, Campaign Member is the correct layer. The first-touch and last-touch fields on Lead and Contact handle the endpoints. Campaign Member records every touch in sequence between them.

To populate Campaign Member data, create a Campaign per cluster rather than per post. Add Contacts as Members when a relevant form submits. Use the same cluster labels as attributed_content_cluster so rollup reports group correctly without a custom report type.

When to use a Contact field vs. a Campaign Member field

Use custom Contact fields for first-touch identity, last-touch identity, and time-to-qualification. Use Campaign Member for multi-touch path analysis and cluster-level rollups. Contact fields give you the endpoints of the attribution path. Campaign Member gives you the sequence between them.

How do you connect CRM attribution properties to a pipeline report?

The five-column pipeline attribution report is what the property schema exists to produce. It answers the board question about which content assets generate revenue-linked pipeline, and it takes about 30 minutes to build once the data is in the CRM.

Building the content-influenced pipeline report in CRM/email platform

In CRM/email platform, create a Multi-object report with Contacts as the primary object and Deals as the secondary. Filter Contacts by attributed_content_cluster equal to the target cluster. Group rows by first_touch_asset_slug. Display Deal amount and Close date as metrics. This answers: for each content asset, how much pipeline value exists in deals where the first-touch contact arrived from that asset?

The five-column board-ready view

The board version has five columns. Column one: Content Asset (the slug or a display name). Column two: First-Touch Contacts (count of contacts with that slug as first_touch_asset_slug). Column three: Open Pipeline (sum of deal amounts across open opportunities linked to those contacts). Column four: Closed Won (closed-won revenue from those contacts in the trailing 12 months). Column five: Cost-per-First-Touch (content production cost divided by first-touch contacts, entered manually from agency invoices and internal time logs).

Columns one through four come from the CRM without a third-party attribution tool. Column five requires manual input from invoices and time logs. Together, they let you name which three posts drove 60% of closed pipeline this quarter, without attribution modeling assumptions. For how the per-post model feeds into a full conversion review, see the free conversion audit.

The pipeline contribution formula

Pipeline contribution per asset equals the sum of deal amounts for all deals where the primary contact's first_touch_asset_slug matches the asset. Pipeline contribution rate equals that figure divided by total open pipeline for the period. Both are computed by the CRM's native deal aggregation, without a data warehouse. The report is available the day after the schema is validated and producing non-null values on new contacts.

What breaks asset-level attribution in practice, and how do you fix it?

Forrester's research found that 64% of B2B marketing leaders do not trust their marketing measurement for decision-making, from Forrester's B2B Marketing Measurement analysis (Forrester Marketing Survey, 2024). The most common root cause is not the attribution model. It is property infrastructure producing inconsistent data. Three failure modes account for most of it.

The three failure modes and their fixes

The first failure mode is URL encoding. If first_touch_asset_slug contains values like %2Fblog%2Fmy-post instead of /blog/my-post, the pathname is being written to the hidden field before URL-decoding. Fix: use decodeURIComponent(window.location.pathname) in the hidden field write script instead of window.location.pathname directly. Verify by reading the raw property value on the contact record after a test submission.

The second failure mode is form render timing. If first_touch_asset_slug is consistently blank on new contacts despite the workflow enrolling correctly, the hidden field is being set before the form library renders the field in the DOM. The hidden input element does not exist at DOMContentLoaded when the form renders asynchronously. Fix: move the hidden field write to a form-ready callback such as CRM/email platform's onFormReady callback, or use a MutationObserver targeting the form's parent container so the write fires after the form finishes rendering.

The third failure mode: deduplication locking on a blank value

If the enrollment workflow fires when hidden_asset_slug holds an empty string rather than null, CRM/email platform treats empty string as "known" and locks first_touch_asset_slug to an empty value. Subsequent form fills will not trigger re-enrollment because the enrollment criterion "first_touch_asset_slug is unknown" no longer matches. Fix: change the enrollment criterion from "hidden_asset_slug is known" to "hidden_asset_slug is known AND hidden_asset_slug contains data." The second condition requires a non-empty string before enrollment fires.

How long does the setup take, and what does it cost?

The Demand Gen Report 2025 B2B Demand Generation Benchmark Survey found that just under 50% of demand gen marketers actively measure campaign attribution, with implementation complexity cited as the primary barrier among those who do not. The actual property schema setup takes about six hours for a CRM admin with the right access level.

The 6-hour setup checklist

Hour 1: Create the seven contact properties (or Lead and Contact fields in Salesforce plus conversion field mapping). Hour 2: Build the two enrollment workflows: first-touch lock (enroll once, write slug and date) and last-touch update (enroll always, overwrite slug and date, increment count). Hour 3: Add the hidden field and JavaScript write snippet to every existing form. Hour 4: Submit two test fills from a blog post and a landing page; verify all seven fields populate on the resulting contacts. Hour 5: Build the five-column pipeline report. Hour 6: Save the monthly data validation query (percentage of contacts from last 30 days with non-null first_touch_asset_slug) as a recurring report.

Ongoing maintenance after setup

Two recurring tasks keep the schema clean. Picklist maintenance: update attributed_content_cluster and first_touch_asset_type picklist values within the same week you add or retire a cluster. Stale values cause contacts to land in "Other," which distorts the pipeline report silently. Form coverage: when a new form is added, confirm the hidden field and JavaScript snippet are included. A one-page brief given to every new agency or contractor before they touch a form closes this gap faster than any audit.

Methodology

McKinsey's "Connecting for Growth" research (n=100+ C-level executives, Europe and North America, March-May 2024) found 41% of marketing leaders rate their organizations as mature in performance measurement; 30% report effective dynamic-spending adjustment (McKinsey.com, October 2024). Forrester's "State of B2B Marketing Measurement" (2025, Forrester Marketing Survey 2024 field dates) found 64% of B2B marketing leaders do not trust their organization's measurement for decision-making (Forrester.com, 2025). Demand Gen Report's 2025 B2B Demand Generation Benchmark Survey found just under 50% of demand gen marketers actively measure campaign attribution; 43% name multi-touch attribution as important but struggle to implement it (DemandGenReport.com, 2025). CRM configuration guidance reflects CRM/email platform's Properties knowledge base and Salesforce's Custom Fields documentation. SEO keyword target: CRM attribution properties. GEO question: how do I set up asset-level attribution in CRM/email platform or Salesforce. Cluster: C4. Pillar: /blog/per-post-content-attribution.

Find the gap before another build.

Get a free audit and get a scored diagnosis, recommended next step, and clear route into the Revenue System Sprint if there is a real opportunity.

Get a free audit
Share this article:

Keep reading

Related Articles