Looker Studio Custom Channel Groupings

Google’s default channel groupings are notorious for misattributing traffic. More often than not, they assign it to the wrong channels or relegate it to the “Unassigned” category. This issue becomes even more pronounced in larger projects that utilize custom source/medium tags (UTM tags) without standardized naming conventions. It’s particularly challenging in scenarios involving multiple and frequently changing teams, each adopting their own naming practices across various channels and campaigns.

Although GA4 allows you to create custom channel groupings based on your own attribution rules, these configurations are not as flexible and are still not available for importing to Looker Studio for many accounts (as of Jan 2024).

The workaround? Crafting custom channels directly in Looker Studio using custom fields offers a precise solution for your reporting needs.

Here are two examples of custom channel groupings you can directly implement or customize in Looker Studio to enhance your analytics strategy:

GA4: Remapping the “Unassigned” Channel Category

This custom grouping addresses the Unassigned category where you may find a lot of your traffic in GA4. The solution uses the Session source / medium dimension to reassign sessions to the appropriate channels based on your needs. As a result you get a more complete and accurate view of your channels.

In order to create this grouping you will need to export a table with your Sessions by Session source / medium for the Unassigned category and then use the medium and/or source values contained in there in your rules to map sessions correctly.

In the below example we used these  sessions source and medium names to clean up the Unassigned category:

If Source / Medium Dimension Contains
Map to Channel
Notes
email, eblast, newsletter, mail.
Email
Default Channel
qr, qr-code
QR Code
New Channel
redirect
Redirect
New Channel
mybusiness, gmb
Organic Search
Default Channel
sa360, sa360, metasearch, sem, google-hpa, googlehpa, reachlocal
Paid Search
Default Channel
paid social, social ads
Paid Social
Default Channel
display, banner, dv360
Display
Default Channel
programmatic, prospecting, taboola, teads, trivago, criteo, remarketing, retargeting, native
Paid Other
Default Channel
website, link, article, post, listing, url, referral, extension, cta, partners, outbound, web, page, landing page, .com, .net, .es, .co, .org, .ca, .cn, .ru, .uk, .de, .au, .fr
Referral
Default Channel

 

Here is how the resulting rule looks like:

 

				
					CASE
  WHEN Session default channel group = "Unassigned" 
  AND REGEXP_CONTAINS(LOWER(Session source / medium), 'email|eblast|newsletter|mail.*') THEN 'Email'
  
  WHEN Session default channel group = "Unassigned"
  AND REGEXP_CONTAINS(LOWER(Session medium), '^qr$|qr-code') THEN 'QR Code'
  
  WHEN Session default channel group = "Unassigned" 
  AND REGEXP_CONTAINS(LOWER(Session medium), 'redirect') THEN 'Redirect'
  
  WHEN Session default channel group = "Unassigned"
  AND (CONTAINS_TEXT(LOWER(Session source / medium), 'mybusiness')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'gmb'))

    THEN 'Organic Search'


  WHEN Session default channel group = "Unassigned" 
  AND (REGEXP_MATCH(LOWER(Session source), 'sa360|.*sa360.*')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'metasearch')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'sem')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'google-hpa')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'googlehpa')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'reachlocal'))

    THEN 'Paid Search'


  WHEN Session default channel group = "Unassigned"
  AND (REGEXP_CONTAINS(LOWER(Session medium), '.*paid(.|\\s)?social.*|.*social(.|\\s)?ads.*'))
    
    THEN 'Paid Social'


  WHEN Session default channel group = "Unassigned"
  AND (REGEXP_CONTAINS(LOWER(Session source / medium), '.*display.*|.*\\d+x\\d+.*')
    OR REGEXP_CONTAINS(LOWER(Session source / medium), '.*banner.*')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'dv360'))


    THEN 'Display'  

  WHEN Session default channel group = "Unassigned"
  AND (CONTAINS_TEXT(LOWER(Session source / medium), 'programmatic')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'prospecting')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'taboola')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'teads')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'trivago')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'criteo')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'remarketing')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'retargeting')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'native'))

    THEN 'Paid Other'     



  WHEN Session default channel group = "Unassigned"
  AND ((REGEXP_MATCH(LOWER(Session medium), 'website|link|article|post|listing|url|referral|extension|cta|partners|outbound|web|page|landing(.|\\s)?page'))
    OR
    (REGEXP_MATCH(LOWER(Session source), '.*.com|.*.net|.*.es|.*.co|.*.org|.*.ca|.*.cn|.*.ru|.*.uk|.*.de|.*.au|.*.fr')))  

    THEN 'Referral'

ELSE Session default channel group 

END
				
			

 

This helped significantly reduce the number of sessions mapped to the Unassigned category.

The remaining “Unassigned” sessions in the Custom Channel Group are from (not set) session source / medium.

Recreating UA Default Channels in Looker Studio

Why recreate Default Channels from Universal Analytics (UA)? It can be useful for conducting Year-Over-Year (YOY) traffic comparisons pre-GA4 setup. The following rules serve as a template for your custom source/medium naming. Here, session source/medium is the key dimension for channel reassignment.

				
					CASE
  WHEN REGEXP_CONTAINS(LOWER(Session source / medium), 'email|eblast|newsletter|mail.*') THEN 'Email'
  WHEN REGEXP_CONTAINS(LOWER(Session source / medium), 'affiliate') THEN 'Affiliates'


  WHEN (CONTAINS_TEXT(LOWER(Session source / medium), 'facebook')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'instagram')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'pinterest')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'twitter')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'snapchat')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'tiktok')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'youtube')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'linkedin')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'whatsapp')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'quora')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'reddit')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'skype')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'viber')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'twitch')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'discord')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'threads')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'tumblr')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'telegram')
    OR REGEXP_MATCH(LOWER(Session source), '^fb$')
    OR REGEXP_MATCH(LOWER(Session source), '^ig$'))


    OR

    (CONTAINS_TEXT(LOWER(Session medium), 'social')
    OR CONTAINS_TEXT(LOWER(Session medium), 'paid-social') 
    OR CONTAINS_TEXT(LOWER(Session medium), 'paidsocial')
    OR CONTAINS_TEXT(LOWER(Session medium), 'paid social')
    OR CONTAINS_TEXT(LOWER(Session medium), 'social-ads')
    OR CONTAINS_TEXT(LOWER(Session medium), 'Social Ads')
    OR CONTAINS_TEXT(LOWER(Session medium), 'catalog_ads')
    OR CONTAINS_TEXT(LOWER(Session medium), 'Feed_ads')
    OR CONTAINS_TEXT(LOWER(Session medium), 'meta_ads'))

    THEN 'Social'
 
  WHEN (CONTAINS_TEXT(LOWER(Session source / medium), 'display')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'banner')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'cpm')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'da360')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'programmatic')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'sojern')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'digilant')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'cityguide')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'timeout'))

    THEN 'Display'

  
  WHEN (CONTAINS_TEXT(LOWER(Session source / medium), 'ask.com')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'baidu')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'dogpile')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'ecosia')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'google')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'bing')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'yahoo')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'hotbot')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'lycos')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'metacrawler')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'mojeek')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'opensearch')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'webcrawler')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'yandex')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'rambler')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'elasticsearch')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'duckduckgo')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'naver')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'reachlocal')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'googlehpa'))     

    AND

    (CONTAINS_TEXT(LOWER(Session source / medium), 'paid') 
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'cpc')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'ppc'))
 
    THEN 'Paid Search'


  WHEN (CONTAINS_TEXT(LOWER(Session source / medium), 'ask.com')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'baidu')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'dogpile')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'ecosia')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'google')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'bing')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'yahoo')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'hotbot')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'aol')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'lycos')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'metacrawler')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'mojeek')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'opensearch')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'webcrawler')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'yandex')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'rambler')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'elasticsearch')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'duckduckgo')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'mybusiness')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'gmb')) 

    AND NOT

    (CONTAINS_TEXT(LOWER(Session source / medium), 'paid') 
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'paidsocial')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'adsmanager')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'cpc')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'ppc')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'display')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'referral')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'ppa')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'cpa')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'cpm')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'banner')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'metasearch')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'affiliate')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'ads')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'website')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'remarketing')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'retargeting')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'meta')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'metasearch'))


    THEN 'Organic Search'


  WHEN CONTAINS_TEXT(LOWER(Session source / medium), 'paid') 
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'paidsocial')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'adsmanager')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'cpc')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'ppc')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'prospecting')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'display')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'cpm')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'ads')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'displayads')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'webads')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'remarketing')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'retargeting')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'affiliate')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'meta')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'banner')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'banners')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'programmatic')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'preroll')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'sojurn')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'kortx')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'preroll')
    OR CONTAINS_TEXT(LOWER(Session source / medium), 'fullscreen')
    
              
    THEN 'Other Advertising'

  WHEN (REGEXP_MATCH(LOWER(Session medium), 'website|link|article|post|listing|url|referral'))
    OR
    (REGEXP_MATCH(LOWER(Session source), '.*.com|.*.net|.*.es|.*.co|.*.org|.*.ca|.*.cn|.*.ru|.*.uk|.*.de|.*.au|.*.fr'))  

    THEN 'Referral'

  WHEN (LOWER(Session session) = '^$') OR (LOWER(Session source / medium) = '(direct) / (none)') THEN 'Direct'
 

  ELSE 'Other'

END
				
			

Leave a Reply

Your email address will not be published. Required fields are marked *