← Back to Dimensions

Support Channel

Also known as: Contact Channel, Case Origin, Ticket Channel, Via Channel, Support Contact Channel, Service Channel

ExperiencedimensionE-commerce: Returns, Refunds & Customer SupportCustomer SupportOmnichannelE-commerce

The customer-facing channel through which a shopper opened an inbound support contact (Live Chat, Email, Phone, Contact Form, Social Media, Messaging or Self-Service Help Center), normalised from the helpdesk origin field: Zendesk via.channel, Salesforce Service Cloud Case Origin, or the Gorgias ticket channel. Unmapped origins fall under Other, an empty helpdesk origin falls back to the channel captured on the storefront support form (joined on ticket ID) and becomes Unknown only when both are missing, with a companion support_channel_source output (helpdesk, web or none), and bot-contained chat sessions that never reach a human agent are classified as Self-Service Help Center. It is the standard breakdown for contact volume, deflection, handling cost and resolution performance, and covers only customer-initiated support, unlike Notification Channel, which classifies outbound brand messages.

Business Use Case

1️⃣ The Customer Service workforce management lead reviews the daily Phone and Live Chat share against forecast; when the voice share runs more than 10% over plan for two consecutive days, they reassign cross-skilled chat agents to voice queues and revise the next week's staffing plan by interval.,2️⃣ The Digital CX product manager watches Contact Form and Email volume for order-status and return-status reasons; when it rises after a site release or a carrier incident, they add self-service tracking and return-status entry points to the order confirmation page and help center, then confirm the shift toward Self-Service Help Center in the following two weeks.,3️⃣ The Head of Customer Service combines this dimension with cost per contact during quarterly budget planning and moves spend from high-cost Phone coverage toward Live Chat and Messaging for low-complexity contact reasons such as returns initiation and refund status.,4️⃣ The Social Care team lead receives an alert when Social Media contacts exceed their seven-day baseline during a promotion or a fulfilment delay, and switches to the escalation playbook: a one-hour first-response target, a pinned public status reply, and routing of order-specific cases into private messaging.

Business Criticality

High

Journey / Navigation Area

Generic

Owning Function

Customer Service

Scope

Event

Calculation Notes

1️⃣ Canonical values and source mapping: Live Chat (Zendesk chat / Gorgias chat / Salesforce Chat), Email (Zendesk email / Case Origin = Email / Gorgias email), Phone (Zendesk voice / Case Origin = Phone / Gorgias phone), Contact Form (Zendesk web form / Case Origin = Web / Gorgias contact_form), Social Media (Zendesk facebook, twitter, instagram / Gorgias facebook, facebook-messenger, instagram-comment, instagram-direct-message), Messaging (Zendesk sms and native_messaging, WhatsApp, Gorgias sms / whatsapp), Self-Service Help Center (Zendesk help_center / Gorgias help-center). Anything unmapped goes to Other. A null or empty helpdesk origin falls back to the web-captured support_channel from the storefront support form (see 6️⃣); only when that is also missing does the value go to Unknown, never to Email by default.,2️⃣ The value is the channel of the first customer-authored message on the ticket and stays fixed for the life of the contact. If a chat is escalated to a phone callback, or an email thread moves to messaging, the ticket still reports as Live Chat or Email; channel switches belong in a separate transfer attribute and must not overwrite this value.,3️⃣ Exclusions: agent-initiated outbound tickets (proactive emails, outbound calls, Case Origin set by the agent on creation), system-generated tickets (Zendesk api or rule triggers, carrier and marketplace webhooks), spam, auto-replies and out-of-office bounces. Merged tickets keep only the surviving ticket's origin, so duplicates are not counted twice.,4️⃣ Bot and self-service handling: chatbot or help-center widget conversations that end without a human agent are classified as Self-Service Help Center and count toward deflection. They are classified as Live Chat only once the conversation is handed to a human queue, which avoids inflating assisted-contact volume with contained sessions.,5️⃣ Timing: the contact is attributed to the ticket created_at (or chat start timestamp) converted to the store's reporting time zone. Contacts reopened within the helpdesk reopen window (typically 4–7 days, per configured policy) stay on the original ticket and date, while a new ticket after that window is a new contact with its own channel.,6️⃣ Omnichannel stitching: digital contacts started on the storefront (chat launch, contact form submission, help-center article view followed by a submission) are joined to the helpdesk ticket through the ticket or conversation ID captured on the web event; the join is on ticket ID alone, using the earliest support-form submission (form_type = support) per ticket. The web ticket_id carries the plain helpdesk ticket ID (e.g. 458213) so it joins directly. The helpdesk origin always wins over the web-side value when the two disagree; when the helpdesk origin is empty, the web-captured value is used, and the output column support_channel_source reports helpdesk, web or none (none = Unknown). The helpdesk ticket created_at always dates the contact. Web analytics tools (GA4 / Adobe segments) only see web-captured values (Contact Form, Live Chat, Messaging widget, Help Center); Phone, Email and Social Media appear only after the helpdesk join, so the dimension stays segment-eligible for the web-captured values.,7️⃣ Scope rule: evaluate at contact (ticket) level. For customer-level reporting, use the most frequent channel over the look-back window, breaking ties by the most recent contact, and report it as the derived dimension Preferred Support Channel rather than as the raw attribute. Guest contacts without a customer ID stay in the population and are matched on the order number where one is present.

Technical Details

Data Typestring
Lookback WindowDaily, Weekly, Monthly

Events

PlatformEvent
Google Analytics 4submit_form
Adobeform:submit

Data Mappings

W3 Data Layer
{
  "event": [
    {
      "eventInfo": {
        "eventName": "submit_form",
        "eventAction": "support_contact",
        "type": "support"
      },
      "attributes": {
        "formName": "support_contact",
        "supportChannel": "Contact Form",
        "contactReason": "Order Status",
        "captureOrigin": "web",
        "ticketId": "458213",
        "orderId": "ORD-100245"
      }
    }
  ],
  "page": {
    "pageInfo": {
      "pageName": "help:contact-us",
      "siteSection": "customer-support"
    }
  }
}
GA4 Data Layer
{
  "event": "submit_form",
  "form_name": "support_contact",
  "form_type": "support",
  "support_channel": "Contact Form",
  "contact_reason": "Order Status",
  "capture_origin": "web",
  "ticket_id": "458213",
  "transaction_id": "ORD-100245"
}
Adobe Client Data Layer
{
  "event": "form:submit",
  "eventInfo": {
    "path": "component.support-contact-form"
  },
  "form": {
    "formName": "support_contact",
    "formType": "support"
  },
  "support": {
    "supportChannel": "Contact Form",
    "contactReason": "Order Status",
    "captureOrigin": "web",
    "ticketId": "458213",
    "orderId": "ORD-100245"
  }
}
XDM Mapping
{
  "eventType": "web.formFilledOut",
  "web": {
    "webInteraction": {
      "name": "support_contact",
      "type": "other"
    }
  },
  "_experience": {
    "analytics": {
      "customDimensions": {
        "eVars": {
          "eVar41": "Contact Form",
          "eVar42": "Order Status",
          "eVar43": "458213"
        }
      }
    }
  },
  "_tenant": {
    "form": {
      "formName": "support_contact",
      "formType": "support"
    },
    "support": {
      "supportChannel": "Contact Form",
      "contactReason": "Order Status",
      "captureOrigin": "web",
      "ticketId": "458213"
    }
  }
}

SQL Queries

Google Analytics 4 (BigQuery)
-- ==========================================
-- 1. GOOGLE BIGQUERY SQL
-- ==========================================
-- Support Channel per ticket: helpdesk origin wins, storefront submit_form value is the fallback (joined on ticket_id).
-- Population: every customer-initiated helpdesk ticket in the window (outbound, system, spam and merged tickets excluded).
WITH web_events AS (
  SELECT
    event_timestamp,
    MAX(IF(ep.key = 'form_type', ep.value.string_value, NULL)) AS form_type,
    MAX(IF(ep.key = 'support_channel', ep.value.string_value, NULL)) AS web_support_channel,
    MAX(IF(ep.key = 'contact_reason', ep.value.string_value, NULL)) AS web_contact_reason,
    MAX(IF(ep.key = 'ticket_id', COALESCE(ep.value.string_value, CAST(ep.value.int_value AS STRING)), NULL)) AS ticket_id
  FROM `your-project.analytics_123456789.events_*`,
    UNNEST(event_params) AS ep
  WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE('America/New_York'), INTERVAL 91 DAY))
                          AND FORMAT_DATE('%Y%m%d', CURRENT_DATE('America/New_York'))
    AND event_name = 'submit_form'
  GROUP BY user_pseudo_id, event_timestamp, event_bundle_sequence_id
),
web_support AS (
  SELECT
    ticket_id,
    ARRAY_AGG(web_support_channel IGNORE NULLS ORDER BY event_timestamp ASC LIMIT 1)[SAFE_OFFSET(0)] AS web_support_channel,
    ARRAY_AGG(web_contact_reason IGNORE NULLS ORDER BY event_timestamp ASC LIMIT 1)[SAFE_OFFSET(0)] AS web_contact_reason
  FROM web_events
  WHERE form_type = 'support'
    AND ticket_id IS NOT NULL
  GROUP BY ticket_id
),
helpdesk AS (
  -- Unified export of Zendesk via.channel, Salesforce Case.Origin and Gorgias channel
  SELECT
    CAST(t.ticket_id AS STRING) AS ticket_id,
    t.source_system,
    t.created_at,
    t.contact_reason,
    t.handed_to_agent,
    LOWER(TRIM(t.raw_channel)) AS raw_channel
  FROM `your-project.helpdesk.support_tickets` AS t
  WHERE DATE(t.created_at, 'America/New_York') BETWEEN DATE_SUB(CURRENT_DATE('America/New_York'), INTERVAL 90 DAY)
                                                   AND CURRENT_DATE('America/New_York')
    AND COALESCE(t.is_agent_initiated, FALSE) = FALSE
    AND COALESCE(t.is_system_generated, FALSE) = FALSE
    AND COALESCE(t.is_spam, FALSE) = FALSE
    AND t.merged_into_ticket_id IS NULL
),
helpdesk_mapped AS (
  SELECT
    h.*,
    CASE
      WHEN h.raw_channel IS NULL OR h.raw_channel = '' THEN NULL
      WHEN h.raw_channel IN ('chat', 'live_chat', 'live chat', 'chat transcript')
           AND COALESCE(h.handed_to_agent, TRUE) THEN 'Live Chat'
      WHEN h.raw_channel IN ('chat', 'live_chat', 'live chat', 'chat transcript') THEN 'Self-Service Help Center'
      WHEN h.raw_channel IN ('email', 'mail', 'e-mail') THEN 'Email'
      WHEN h.raw_channel IN ('voice', 'phone', 'phone call', 'call') THEN 'Phone'
      WHEN h.raw_channel IN ('web', 'web form', 'web_form', 'webform', 'contact_form', 'contact-form') THEN 'Contact Form'
      WHEN h.raw_channel IN ('facebook', 'twitter', 'x', 'instagram', 'facebook-messenger', 'facebook-mention',
                             'instagram-comment', 'instagram-ad-comment', 'instagram-direct-message', 'social') THEN 'Social Media'
      WHEN h.raw_channel IN ('sms', 'native_messaging', 'whatsapp', 'whatsapp-message', 'messaging', 'line', 'wechat') THEN 'Messaging'
      WHEN h.raw_channel IN ('help_center', 'help-center', 'helpcenter', 'self_service', 'self-service') THEN 'Self-Service Help Center'
      ELSE 'Other'
    END AS helpdesk_support_channel
  FROM helpdesk AS h
)
SELECT
  m.ticket_id,
  m.source_system,
  DATE(m.created_at, 'America/New_York') AS contact_date,
  COALESCE(
    m.helpdesk_support_channel,
    CASE
      WHEN w.web_support_channel IN ('Live Chat', 'Email', 'Phone', 'Contact Form', 'Social Media',
                                     'Messaging', 'Self-Service Help Center', 'Other') THEN w.web_support_channel
      WHEN NULLIF(TRIM(w.web_support_channel), '') IS NOT NULL THEN 'Other'
    END,
    'Unknown'
  ) AS support_channel,
  CASE
    WHEN m.helpdesk_support_channel IS NOT NULL THEN 'helpdesk'
    WHEN NULLIF(TRIM(w.web_support_channel), '') IS NOT NULL THEN 'web'
    ELSE 'none'
  END AS support_channel_source,
  COALESCE(m.contact_reason, w.web_contact_reason) AS contact_reason
FROM helpdesk_mapped AS m
LEFT JOIN web_support AS w
  ON w.ticket_id = m.ticket_id
ORDER BY contact_date, support_channel;
Adobe Experience Platform (AEP Query Service)
-- ==========================================
-- 2. ADOBE AEP QUERY SERVICE SQL
-- ==========================================
-- Support Channel per ticket: helpdesk origin wins, web.formFilledOut value is the fallback (joined on ticket_id).
-- Population: every customer-initiated helpdesk ticket in the window (outbound, system, spam and merged tickets excluded).
WITH web_events AS (
  SELECT
    COALESCE(_tenant.support.ticketId, _experience.analytics.customDimensions.eVars.eVar43) AS ticket_id,
    COALESCE(_tenant.support.supportChannel, _experience.analytics.customDimensions.eVars.eVar41) AS web_support_channel,
    COALESCE(_tenant.support.contactReason, _experience.analytics.customDimensions.eVars.eVar42) AS web_contact_reason,
    timestamp AS event_ts
  FROM web_events_dataset
  WHERE eventType = 'web.formFilledOut'
    AND _tenant.form.formType = 'support'
    AND to_date(from_utc_timestamp(timestamp, 'America/New_York'))
        BETWEEN date_sub(to_date(from_utc_timestamp(current_timestamp(), 'America/New_York')), 91)
            AND to_date(from_utc_timestamp(current_timestamp(), 'America/New_York'))
),
web_support AS (
  SELECT ticket_id, web_support_channel, web_contact_reason
  FROM (
    SELECT
      ticket_id,
      web_support_channel,
      web_contact_reason,
      ROW_NUMBER() OVER (PARTITION BY ticket_id ORDER BY event_ts ASC) AS rn
    FROM web_events
    WHERE ticket_id IS NOT NULL
      AND web_support_channel IS NOT NULL
  ) ranked
  WHERE rn = 1
),
helpdesk AS (
  -- Unified export of Zendesk via.channel, Salesforce Case.Origin and Gorgias channel
  SELECT
    CAST(t.ticket_id AS STRING) AS ticket_id,
    t.source_system,
    from_utc_timestamp(t.created_at, 'America/New_York') AS created_at_local,
    t.contact_reason,
    t.handed_to_agent,
    LOWER(TRIM(t.raw_channel)) AS raw_channel
  FROM helpdesk_support_tickets t
  WHERE to_date(from_utc_timestamp(t.created_at, 'America/New_York'))
        BETWEEN date_sub(to_date(from_utc_timestamp(current_timestamp(), 'America/New_York')), 90)
            AND to_date(from_utc_timestamp(current_timestamp(), 'America/New_York'))
    AND COALESCE(t.is_agent_initiated, false) = false
    AND COALESCE(t.is_system_generated, false) = false
    AND COALESCE(t.is_spam, false) = false
    AND t.merged_into_ticket_id IS NULL
),
helpdesk_mapped AS (
  SELECT
    h.ticket_id,
    h.source_system,
    h.created_at_local,
    h.contact_reason,
    CASE
      WHEN h.raw_channel IS NULL OR h.raw_channel = '' THEN NULL
      WHEN h.raw_channel IN ('chat', 'live_chat', 'live chat', 'chat transcript')
           AND COALESCE(h.handed_to_agent, true) THEN 'Live Chat'
      WHEN h.raw_channel IN ('chat', 'live_chat', 'live chat', 'chat transcript') THEN 'Self-Service Help Center'
      WHEN h.raw_channel IN ('email', 'mail', 'e-mail') THEN 'Email'
      WHEN h.raw_channel IN ('voice', 'phone', 'phone call', 'call') THEN 'Phone'
      WHEN h.raw_channel IN ('web', 'web form', 'web_form', 'webform', 'contact_form', 'contact-form') THEN 'Contact Form'
      WHEN h.raw_channel IN ('facebook', 'twitter', 'x', 'instagram', 'facebook-messenger', 'facebook-mention',
                             'instagram-comment', 'instagram-ad-comment', 'instagram-direct-message', 'social') THEN 'Social Media'
      WHEN h.raw_channel IN ('sms', 'native_messaging', 'whatsapp', 'whatsapp-message', 'messaging', 'line', 'wechat') THEN 'Messaging'
      WHEN h.raw_channel IN ('help_center', 'help-center', 'helpcenter', 'self_service', 'self-service') THEN 'Self-Service Help Center'
      ELSE 'Other'
    END AS helpdesk_support_channel
  FROM helpdesk h
)
SELECT
  m.ticket_id,
  m.source_system,
  to_date(m.created_at_local) AS contact_date,
  COALESCE(
    m.helpdesk_support_channel,
    CASE
      WHEN w.web_support_channel IN ('Live Chat', 'Email', 'Phone', 'Contact Form', 'Social Media',
                                     'Messaging', 'Self-Service Help Center', 'Other') THEN w.web_support_channel
      WHEN NULLIF(TRIM(w.web_support_channel), '') IS NOT NULL THEN 'Other'
    END,
    'Unknown'
  ) AS support_channel,
  CASE
    WHEN m.helpdesk_support_channel IS NOT NULL THEN 'helpdesk'
    WHEN NULLIF(TRIM(w.web_support_channel), '') IS NOT NULL THEN 'web'
    ELSE 'none'
  END AS support_channel_source,
  COALESCE(m.contact_reason, w.web_contact_reason) AS contact_reason
FROM helpdesk_mapped m
LEFT JOIN web_support w
  ON w.ticket_id = m.ticket_id
ORDER BY contact_date, support_channel;

Source Data

Web + Helpdesk (Zendesk / Salesforce Service Cloud / Gorgias)

Dependencies

Prerequisite: List the dependencies required for this Dimension

Events:

submit-form

Report Attributes

Contact Reason Order Status Order Cancellation Reason Device Category Customer Loyalty Tier Support Team / Queue Contact Date

Segment Eligibility

true

Governance

Data SensitivityInternal

Derived Dimensions

Governance

Created bydevyendarm
Created on9/16/2026
Last modified bydevyendarm
Last modified on9/18/2026
Version1.0.0
Validation stateqa passed
StatusPUBLISHED

GitHub

View related Pull Requestcatalog/dimensions/support-channel.yml

Community Discussion