Skip to main content
fct_order_attribution_signals is the customer-facing row-level table for custom attribution modeling, order-level traceability, and debugging. It keeps the winning traffic source and the supporting signal rows side by side so you can rebuild SourceMedium’s rules, inspect explicit overrides, and trace source hierarchy without dropping into raw staging models.
Use this table when you need to answer “why did this order end up attributed this way?” rather than “how much revenue did a channel get?” For aggregated attribution reporting, stay in the report and MTA tables.

What this table is for

  • Trace every evidence row that SourceMedium considered for a single order.
  • See the difference between raw captured values and canonicalized sm_utm_* values.
  • Identify which traffic source won the primary ranking for each order.
  • Inspect zero-party and discount-code context without leaving the order-grain workflow.

Current evidence model

evidence_type tells you what class of evidence you are looking at:
mta_first_touch and mta_last_touch use evidence_type = traffic_source_candidate, but they are supporting-context rows. They always have sm_utm_final_source_priority = NULL, and an order can have at most one row of each type when that order appears in MTA journey data.

How primary traffic ranking works

SourceMedium keeps multiple traffic candidates on the order, then assigns a per-order rank in sm_utm_final_source_priority.
  • 1 means “this was the winning primary traffic source for the order.”
  • Higher numbers are lower-ranked fallbacks kept for debugging.
  • NULL means the row is contextual rather than part of the primary traffic ranking.
For the current customer-facing evidence sources, the preferred traffic-source order is:
  1. shopify_custom_attribute_override
  2. shopify_landing_site
  3. shopify_note
  4. website_event_tracking_purchase
  5. google_analytics_transaction
  6. shopify_order_referring_site_utms
The numeric priority values in the table are ordering signals, not a reusable source code system. Some numbers are skipped, so you might see values such as 1, 3, 4, 5, 7, and 8 instead of a compact 1..6 sequence. The relative ordering matters, not the specific numeric values.
mta_first_touch and mta_last_touch rows are kept in the signals table as traffic context, but they do not compete for the primary traffic winner. They always have sm_utm_final_source_priority = NULL, and an order will have at most one of each when the order appears in MTA journey data.

Column guide

Identifiers

  • sm_order_attribution_signal_key: Stable key for the evidence row.
  • sm_store_id: Customer-facing store identifier for tenant scoping.
  • source_system: Commerce platform that produced the order record.
  • sm_order_key: Stable SourceMedium order key for joins back to order-grain tables.
  • order_id: Platform-native order id for stakeholder-friendly lookups.

Timestamps

  • order_processed_at: UTC order processed timestamp.
  • order_processed_at_local_datetime: Reporting-timezone datetime for customer-facing analysis and date filters.

Evidence classification

  • evidence_type: Broad class of evidence, such as traffic_source_candidate, zero_party_candidate, or order_discount_code.
  • evidence_source: The specific capture mechanism or upstream source.
  • evidence_row_id: Source-specific identifier that distinguishes one evidence record from another on the same order. Examples include shopify_landing_site:1, ga4:2, segment_website_event_tracking:evt_123, an MTA touch id, or a normalized discount code such as welcome10.

Canonicalized attribution fields

  • sm_utm_source, sm_utm_medium, sm_utm_campaign, sm_utm_content, sm_utm_term, sm_utm_id: Final normalized traffic fields for the row.
  • sm_utm_source_medium: Canonical source / medium pair that usually makes debugging faster.
  • sm_marketing_channel: Final channel grouping for traffic rows after normalization. See Channel Mapping if the final grouped value is what you need to debug.

Raw captured fields

  • raw_utm_source, raw_utm_medium, raw_utm_campaign, raw_utm_content, raw_utm_term, raw_utm_id: Values captured before inference or cleaning.
  • raw_referrer, raw_landing_page_url, raw_referring_site: Supporting raw URL context that often explains (none) and (other) outcomes.

Inference metadata

  • sm_attribution_inference_method: Explains how SourceMedium derived the canonicalized values.
  • sm_utm_final_source_priority: Per-order ordering among traffic candidates. 1 is the winner for that order.

Zero-party and discount signals

  • attribution_signal_raw: Raw non-traffic signal captured on the row.
  • attribution_signal_parsed: Parsed or normalized version of that non-traffic signal.
  • attribution_signal_type: Non-traffic signal category, currently zero_party or discount_code.

Inference methods you will see

sm_attribution_inference_method explains how SourceMedium produced the canonicalized fields on the row.

Common debugging workflows

Trace a single order

Use this when a stakeholder asks “show me everything SourceMedium knew about this order.”

Why did this order become (none) or (other)?

Start with the priority-1 traffic row, then compare the raw captured fields against the canonicalized fields and the final channel mapping.

Which evidence source usually wins?

This is the fastest way to understand which capture mechanism is actually driving the primary traffic winner for a store.

What non-traffic signals exist for this order?

Use this to separate survey, tag, and discount-code context from the primary traffic ranking.

Attribution Source Hierarchy

Learn how SourceMedium orders the traffic candidates that feed this signals table.

MTA Models Reference

See how row-level order auditing complements purchase-journey and MTA reporting.

Attribution Health

Move from a store-level attribution-health alert into order-level debugging.

dim_orders

Join back to order-level attributes once you identify the evidence row you care about.