Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Metric and Definition

Query

Comments and Business Use

Known Diner Sales (“KDS”)

All sales that are made by recognizable guests, i.e. guests that have registered through the app (identified by their registered account id beginning with ‘us-east’)

Code Block
languagesql
SELECT TH_FISCAL_YEAR,
TH_FISCAL_WEEK,
SUM(AMOUNT) AS SALES,
COUNT(DISTINCT TICKET_ID) AS TRXNS,
COUNT(DISTINCT REGISTERED_ACCOUNT_ID) AS GUESTS

FROM STG.DERIVED_MASTER_TABLE_NEW

WHERE 
PARTITION_DATE_KEY BETWEEN '<START DATE>' AND '<END DATE>'
AND IS_PASS_THROUGH = 0
AND COUNTRY_NM = 'CANADA'
AND LEFT(REGISTERED_ACCOUNT_ID,7) = 'us-east'

GROUP BY 1,2

This metric is used as a baseline to see loyalty sales penetration against system wide sales.

System Wide Sales (“SWS”)

Total sales across TH

Code Block
languagesql
SELECT
TH_FISCAL_YEAR,
TH_FISCAL_WEEK,
COUNT(DISTINCT TICKET_ID) AS TRXNS,
SUM(AMOUNT) AS SWS

FROM STG.DERIVED_MASTER_TABLE_NEW 
      
WHERE 
PARTITION_DATE_KEY BETWEEN '<START DATE>' AND '<END DATE>'
AND IS_PASS_THROUGH = 0 
AND COUNTRY_NM = 'CANADA'

GROUP BY 1,2

Note: Some forecasts may use Hyperion sales interchangeable in lieu of SWS sourced from STG.DERIVED_MASTER_TABLE_NEW.

Cheque

Average sales value ($) of an individual transaction

Code Block
languagesql
SELECT
TH_FISCAL_YEAR,
TH_FISCAL_WEEK,
COUNT(DISTINCT TICKET_ID) AS TRXNS,
SUM(AMOUNT) AS SWS,
SUM(AMOUNT)/COUNT(DISTINCT TICKET_ID) AS CHEQUE

FROM STG.DERIVED_MASTER_TABLE_NEW 
      
WHERE 
PARTITION_DATE_KEY BETWEEN '<START DATE>' AND '<END DATE>'
AND IS_PASS_THROUGH = 0 
AND COUNTRY_NM = 'CANADA'

GROUP BY 1,2

Can calculate this on a system level or down to an individual guest level. Can filter on loyalty or non-loyalty.

Frequency

Average loyalty guest visits in a given time period

Code Block
languagesql
SELECT
TH_FISCAL_YEAR,
TH_FISCAL_WEEK,
COUNT(DISTINCT TICKET_ID) AS TRXNS,
COUNT(DISTINCT REGISTERED_ACCOUNT_ID) AS GUESTS,
COUNT(DISTINCT TICKET_ID)/COUNT(DISTINCT T1.REGISTERED_ACCOUNT_ID) AS FREQUENCY

FROM STG.DERIVED_MASTER_TABLE_NEW T1
      
WHERE 
PARTITION_DATE_KEY BETWEEN '<START DATE>' AND '<END DATE>'
AND IS_PASS_THROUGH = 0 
AND COUNTRY_NM = 'CANADA'
AND LEFT(REGISTERED_ACCOUNT_ID,7) = 'us-east'

GROUP BY 1,2

Usually look at this metric for a week, month, or year.

White Label Delivery (“WL”)

Delivery sales initiated from the TH mobile app

Code Block
languagesql
SELECT 
TH_FISCAL_YEAR,
TH_FISCAL_WEEK,
SUM(AMOUNT) AS SALES

FROM STG.DERIVED_MASTER_TABLE_NEW 

WHERE PARTITION_DATE_KEY BETWEEN '$START_DATE' AND 'END_DATE'
AND IS_PASS_THROUGH = 0 
AND COUNTRY_NM = "CANADA"
AND SERVICE_MODE_CD IN ('WHITE LABEL DELIVERY','DELIVERY')
AND LEFT(REGISTERED_ACCOUNT_ID,7) = 'us-east'

GROUP BY 1,2

Included in known diner sales & digital sales.

Sales of our internal app delivery platform.

Mobile Order & Pay (“MO&P”)

Code Block
languagesql
SELECT 
TH_FISCAL_YEAR,
TH_FISCAL_WEEK,
SUM(AMOUNT) AS SALES

FROM STG.DERIVED_MASTER_TABLE_NEW 

WHERE PARTITION_DATE_KEY BETWEEN 'START_DATE' AND 'END_DATE'
AND IS_PASS_THROUGH = 0 
AND COUNTRY_NM = "CANADA"
AND SERVICE_MODE_CD IN ('MOBILE ORDER DRIVE THRU', 'MOBILE ORDER EAT IN', 'MOBILE ORDER TAKE OUT')
AND LEFT(REGISTERED_ACCOUNT_ID,7) = 'us-east'

GROUP BY 1,2

Included in known diner sales & digital sales.

Loyalty Scans

Sales made by known diners and includes eat-in, takeout & drive thru

Code Block
languagesql
SELECT 
TH_FISCAL_YEAR,
TH_FISCAL_WEEK,
SUM(AMOUNT) AS SALES

FROM STG.DERIVED_MASTER_TABLE_NEW 

WHERE PARTITION_DATE_KEY BETWEEN 'START_DATE' AND 'END_DATE'
AND IS_PASS_THROUGH = 0 
AND COUNTRY_NM = "CANADA"
AND SERVICE_MODE_CD IN ('TAKEOUT', 'EATIN','DRIVETHRU')
AND LEFT(REGISTERED_ACCOUNT_ID,7) = 'us-east'

GROUP BY 1,2

Included in known diner sales & digital sales.

3P Delivery

Delivery sales initiated and fulfilled by third-party delivery providers, such as UberEats, SkipTheDishes and DoorDash

Code Block
languagesql
SELECT 
A.PARTITION_DATE_KEY,
SUM(A.AMOUNT) AS SALES

FROM STG.DERIVED_MASTER_TABLE_NEW A 

INNER JOIN TLOG.TLOG_SALE_TICKET_TENDERS B 
ON A.TICKET_ID = B.TICKET_ID

WHERE A.PARTITION_DATE_KEY BETWEEN 'START_DATE' AND 'END_DATE'
AND IS_PASS_THROUGH = 0 
AND COUNTRY_NM = 'CANADA'
AND TENDER_NAME IN ("UBER EATS CREDIT","Credit Uber Eats","Uber Eats Credit","CRÉDIT UBER EATS","SKIP CREDIT","Skip Credit","CRÉDIT de DoorDash","CRÉDIT DE DOORDASH","DoorDash Credit","DOORDASH CREDIT","Crédit de DoorDash","Doordash")

GROUP BY 1

Included in digital sales

Kiosk

Sales via Kiosk; can be split into registered and un-registered Kiosk sales using left(registered_account_id,7) = ‘us-east’

Code Block
languagesql
SELECT
    LAST_DAY(PERIOD_DT) AS MONTH,
    SUM(AMOUNT) AS KIOSK_SALES,
    COUNT(DISTINCT TICKET_ID) AS KIOSK_TRXNS,
    COUNT(DISTINCT LOYALTY_CUSTOMER_ID) AS KIOSK_GUESTS
  FROM
    STG.DERIVED_MASTER_TABLE_NEW
  WHERE
    PERIOD_DT BETWEEN '$Start_Date'
    AND '$End_Date'
    AND IS_PASS_THROUGH = 0
    AND COUNTRY_NM = 'CANADA'
    AND SERVICE_MODE_CD IN ('KIOSK', 'KIOSK TAKEOUT', 'KIOSK EATIN')
    AND REST_NO IN (
    <list of restaurants with KIOSKS>
    )
  GROUP BY
    1

Included in digital sales

Code Block
languagesql
-- Registered Kiosk
AND LEFT(COALESCE(REGISTERED_ACCOUNT_ID,''),7) = 'us-east'
-- Un-Registered Kiosk
AND LEFT(COALESCE(REGISTERED_ACCOUNT_ID,''),7) != 'us-east'


-- List of Retaurants as of APRjune 2024
(101789, 101517, 108175, 101493, 102093, 101846, 109331, 102784, 109403, 
108485, 100525, 106376, 105060, 101712, 103498, 109951, 103637, 102534, 
100410, 100062, 104505, 104853, 103482, 103389, 103227, 103217, 102614, 
100788, 108397, 100112, 105789, 100806, 102549, 107228, 101475, 101657, 
100674, 102011, 101129, 104420, 104764, 106305, 101000, 109241, 108358, 
103413, 100027, 100526, 104213, 103704, 105217, 104402, 104271, 102946,
 102376, 102229, 103233, 100940, 104962, 101491, 102118, 102732, 107384,
  101803, 100446, 109041, 109757, 101917, 109878, 102169, 104840, 104013,
   108507, 101886, 100136, 100514, 102017, 102974, 101900, 105085, 
   100467, 100490, 103690, 102467, 102305, 104925, 103167, 101382, 
   108487, 103648, 101281, 102110, 100045, 102398, 103850, 107647, 
   102753, 103124, 102224, 100678, 106882, 101865, 100652, 100503, 
   100693, 102040, 109449, 108102, 105389, 103695, 101666, 101076, 
   100529, 100376, 100856, 102606, 101582, 106547, 107608, 100325, 
   100324, 103340, 102417, 103129, 100544, 101365, 105340, 102074, 
   100096, 108167, 108166, 108088, 107336, 104443, 103384, 103255, 
   103208, 103356, 101450, 103202, 104284, 104856, 101241, 102331, 
   104393, 101820, 104126, 101333, 102556, 102972, 104471, 103568, 
   105792, 103021, 103143, 102833, 103086, 101991, 108399, 109334, 
   109955, 101462, 100582, 100124, 108500, 107576, 101335, 109291,
    103677, 107569, 102635, 105237, 100160, 103077, 102622, 101818, 
    105917, 101600, 102308, 103029, 101992, 102603, 103947, 103137, 
    108172, 101022, 103050, 106865, 103323, 106310, 103169, 102399, 
    102018, 101595, 103407, 101655, 100101, 100506, 100093, 100863,
     103625, 103279, 102891, 101999, 101543, 101476, 102562, 100024, 
     104852, 104370, 109430, 108502, 102852, 103644, 101623, 109405, 
     101837, 100200, 101568, 100885, 100104, 101628, 102991, 102773, 
     102877, 103548, 102821, 102103, 103411, 104887, 102196, 102315, 
     109027, 100998, 102630, 102394, 108402, 101650, 109042, 101873,
      103755, 102925, 103478, 109407, 109397, 109396, 109338, 109286,
       109246, 107582, 103584, 101967, 104970, 106478, 104212, 102212,
        101508, 101368, 100800, 100077, 103950, 103698, 102132, 101851,
         105363, 100670, 102157, 108115, 103001, 103955, 102892, 
         103130, 101769, 101357, 101904, 100118, 101864, 101686, 
         101174, 101924, 109711, 104289, 103886, 102710, 101689, 
         101442, 109404, 109780, 109447, 103351, 100640, 104813, 
         102387, 104275, 109444, 101584, 109448, 108480, 108395, 
         105840, 104651, 103132, 102679, 107653, 106874, 105763, 
         102646, 101849, 100229, 108430, 101985, 102150, 101871, 
         102719, 102060, 120293, 100965, 109436, 108137, 100776, 
         108118, 100387, 102041, 103754, 102409, 102032, 101602,
          108518, 100769, 101788, 109288, 103159, 101954, 109446,
           103294, 103549, 104391, 102129, 102175, 100015, 101528,
            102171, 100967, 103073, 101308, 101552, 100738, 101535, 
            103702, 101870, 103591, 102274, 101159, 102593, 101200, 
            100255, 103659, 104966, 105920, 100489, 100568, 100588, 
            101339, 102001, 103267, 107343, 10363)

Catering

Catering sales

Code Block
languagesql
SELECT 
PARTITION_DATE_KEY,
SUM(ITEMTOTALPRICE)AS SALES,'100024',	'100027',	'100045',	'100062',	'100077',	'100093',	'100096',	'100101',	'100104',	'100112',	'100118',	'100124',	'100136',	'100160',	'100200',	'100229',	'100324',	'100325',	'100376',	'100387',	'100410',	'100446',	'100467',	'100489',	'100490',	'100503',	'100506',	'100514',	'100525',	'100526',	'100529',	'100544',	'100582',	'100588',	'100640',	'100652',	'100670',	'100674',	'100678',	'100693',	'100769',	'100776',	'100788',	'100800',	'100806',	'100856',	'100863',	'100885',	'100940',	'100965',	'100998',	'101000',	'101022',	'101076',	'101129',	'101174',	'101241',	'101281',	'101333',	'101335',	'101357',	'101365',	'101368',	'101382',	'101442',	'101450',	'101475',	'101476',	'101491',	'101493',	'101508',	'101517',	'101543',	'101568',	'101582',	'101584',	'101595',	'101600',	'101602',	'101623',	'101628',	'101650',	'101655',	'101657',	'101666',	'101686',	'101689',	'101712',	'101769',	'101788',	'101789',	'101803',	'101818',	'101820',	'101837',	'101846',	'101849',	'101851',	'101864',	'101865',	'101873',	'101886',	'101900',	'101904',	'101924',	'101954',	'101967',	'101985',	'101991',	'101992',	'101999',	'102011',	'102017',	'102018',	'102032',	'102040',	'102041',	'102060',	'102074',	'102103',	'102110',	'102118',	'102129',	'102132',	'102150',	'102157',	'102169',	'102175',	'102196',	'102212',	'102224',	'102305',	'102308',	'102315',	'102331',	'102376',	'102387',	'102394',	'102398',	'102399',	'102409',	'102417',	'102467',	'102478',	'102534',	'102549',	'102556',	'102562',	'102603',	'102606',	'102614',	'102622',	'102630',	'102635',	'102646',	'102679',	'102710',	'102719',	'102732',	'102753',	'102773',	'102784',	'102821',	'102833',	'102852',	'102877',	'102891',	'102892',	'102925',	'102946',	'102972',	'102974',	'102991',	'103001',	'103021',	'103029',	'103050',	'103077',	'103086',	'103124',	'103129',	'103130',	'103132',	'103137',	'103143',	'103159',	'103167',	'103169',	'103208',	'103217',	'103227',	'103233',	'103255',	'103267',	'103294',	'103323',	'103340',	'103351',	'103356',	'103384',	'103389',	'103407',	'103411',	'103413',	'103478',	'103482',	'103498',	'103548',	'103549',	'103584',	'103625',	'103637',	'103644',	'103677',	'103690',	'103695',	'103698',	'103704',	'103754',	'103755',	'103850',	'103886',	'103947',	'103950',	'103955',	'104013',	'104126',	'104212',	'104213',	'104275',	'104284',	'104370',	'104391',	'104393',	'104420',	'104443',	'104505',	'104651',	'104764',	'104813',	'104840',	'104852',	'104853',	'104856',	'104887',	'104925',	'104962',	'104966',	'104970',	'104971',	'105060',	'105085',	'105217',	'105237',	'105340',	'105363',	'105389',	'105763',	'105789',	'105792',	'105840',	'105917',	'106305',	'106310',	'106478',	'106547',	'106865',	'106874',	'106882',	'107228',	'107336',	'107343',	'107384',	'107569',	'107576',	'107582',	'107608',	'107647',	'107653',	'108088',	'108102',	'108115',	'108118',	'108137',	'108166',	'108167',	'108172',	'108175',	'108358',	'108395',	'108397',	'108399',	'108402',	'108430',	'108480',	'108485',	'108487',	'108500',	'108502',	'108507',	'108518',	'109027',	'109041',	'109042',	'109241',	'109246',	'109286',	'109288',	'109291',	'109331',	'109334',	'109338',	'109396',	'109397',	'109403',	'109404',	'109405',	'109407',	'109430',	'109436',	'109444',	'109446',	'109447',	'109448',	'109449',	'109711',	'109757',	'109780',	'109878',	'109951',	'109955',	'120293',	'101462',	'101917',	'102093',	'102229',	'103202',	'103648',	'104271',	'104471',	'106376')

Catering

Catering sales

Code Block
languagesql
SELECT 
PARTITION_DATE_KEY,
SUM(ITEMTOTALPRICE)AS SALES,

FROM PRODRT.CURATED_TRANS_EVENTS_NEW

WHERE PARTITION_DATE_KEY BETWEEN 'START_DATE' AND 'END_DATE'
AND COUNTRY_NM = 'CANADA'
AND IS_PASS_THROUGH = 0 
AND LEFT(REGISTEREDACCOUNTID,7) = 'us-east'
AND DININGTYPE = 'CT'

GROUP BY 1

Included in digital sales

Restaurants Reporting Any Menu Item (“RRAMI“)

Code Block
languagesql
WITH RESTAURANTS AS (

SELECT 

TH_FISCAL_YEAR,
TH_FISCAL_WEEK,
PARTITION_DATE_KEY,
COUNT(DISTINCT REST_NO) AS RESTAURANTS

FROM STG.DERIVED_MASTER_TABLE_NEW

WHERE PARTITION_DATE_KEY BETWEEN 'START_DATE' AND 'END_DATE'
AND IS_PASS_THROUGH = 0
AND COUNTRY_NM = 'CANADA' 

GROUP BY 1,2,3
ORDER BY 1)

SELECT 
TH_FISCAL_YEAR,
TH_FISCAL_WEEK,
SUM(RESTAURANTS) AS RRAMI

FROM RESTAURANTS

GROUP BY 1,2

Scan & Pay (“S&P”)

Transactions where Scan & Pay feature was used

Code Block
languagesql
SELECT 
STOREDATE,
COUNT(DISTINCT TRANSACTIONID) AS TICKETS,
SUM(ITEMTOTALPRICE) AS SALES 

FROM PRODRT.CURATED_TRANS_EVENTS_NEW

WHERE PARTITION_DATE_KEYSTOREDATE BETWEEN 'START_DATE' AND 'END_DATE'
AND COUNTRY_NM = 'CANADA'
AND IS_PASS_THROUGH = 0

AND LEFT(COUNTRY_NM IN ('CANADA')
AND LEFT(REGISTEREDACCOUNTID,7) = 'us-east'
AND DININGTYPESCANANDPAY =IS 'CT'TRUE

GROUP BY 1

Included in digital sales

Restaurants Reporting Any Menu Item (“RRAMI“)

Often tracked as a % of registered transactions

Scan & Pay Penetration Formula: (Scan & Pay Transactions) / (Registered Transactions)

Loyalty Redemptions

Products that were redeemed using loyalty points

Code Block
languagesql

WITH RESTAURANTSTRANSACTIONS_WITH_OFFER_ID AS (

SELECT 
LEFT(PERIOD_DT, 10) AS THPERIOD_FISCAL_YEARDT,
TH_FISCAL_WEEKREGISTEREDACCOUNTID,
PARTITION_DATE_KEYTRANSACTIONID, COUNT(DISTINCT REST_NO
EXPLODE(APPLIEDOFFERS) AS RESTAURANTSEXPLODED_OFFERS

FROM STGPRODRT.DERIVEDCURATED_MASTERTRANS_TABLEEVENTS_NEW

WHERE PARTITION_DATE_KEY BETWEEN>= 'START_DATE20230606'
AND 'END_DATE'COALESCE(REGISTEREDACCOUNTID,'') IS NOT NULL
AND APPLIEDOFFERS IS_PASS_THROUGH =NOT 0NULL
AND COUNTRY_NM = 'CANADA')

SELECT GROUP BY 1,2,3
ORDER BY 1)

SELECT 
TH_FISCAL_YEAR,
TH_FISCAL_WEEK,
SUM(RESTAURANTS) AS RRAMI

FROM RESTAURANTS

GROUP BY 1,2

Scan & Pay (“S&P”)

Transactions where Scan & Pay feature was used

Code Block
languagesql
SELECT 
STOREDATE,
COUNT(DISTINCT TRANSACTIONID) AS TICKETS,
SUM(ITEMTOTALPRICE) AS SALES 

FROM PRODRT.CURATED_TRANS_EVENTS_NEW

WHERE STOREDATE BETWEEN 'START_DATE' AND 'END_DATE'
AND IS_PASS_THROUGH = 0
AND COUNTRY_NM IN ('CANADA')
AND LEFT(REGISTEREDACCOUNTID,7) = 'us-east'
AND SCANANDPAY IS TRUE

GROUP BY 1

Often tracked as a % of registered transactions

Scan & Pay Penetration Formula: (Scan & Pay Transactions) / (Registered Transactions)

Loyalty Redemptions

Products that were redeemed using loyalty points

Code Block
languagesql

WITH TRANSACTIONS_WITH_OFFER_ID AS (

SELECT 
LEFT(PERIOD_DT, 10) AS PERIOD_DT,
REGISTEREDACCOUNTID,
TRANSACTIONID, 
EXPLODE(APPLIEDOFFERS) AS EXPLODED_OFFERS

FROM PRODRT.CURATED_TRANS_EVENTS_NEW

WHERE DATE_KEY >= '20230606'
AND COALESCE(REGISTEREDACCOUNTID,'') IS NOT NULL
AND APPLIEDOFFERS IS NOT NULL
AND COUNTRY_NM = 'CANADA')

SELECT 
PERIOD_DT,
COUNT(DISTINCT TRANSACTIONID) AS TRXNS

FROM TRANSACTIONS_WITH_OFFER_ID AS A

INNER JOIN (SELECT DISTINCT OFFERID FROM DYDB.WEEKLYOFFERS
             
            UNION ALL
            
            SELECT DISTINCT OFFERID
            FROM DYDB.OFFERS
            WHERE CONTAINS(description, 'LOYALTY')
            AND DESCRIPTION LIKE 'CA L%'
            AND DESCRIPTION NOT IN ('CA LR Registered Default (same as L1)-LOYALTY', 'CA LU Unregistered (same as 102) ONE-TIME-LOYALTY') ) B
            
ON A.EXPLODED_OFFERS = B.OFFERID 

LEFT JOIN DYDB.OFFERS AS C 
ON A.EXPLODED_OFFERS=C.OFFERID

WHERE EXPLODED_OFFERS IS NOT NULL 
AND C.OFFERID IS NOT NULL

GROUP BY 1

Used for tracking how many free items we’re giving away and the value of them.

Often viewed as a percentage of SWS or KDS.

Loyalty drag formula = $ value of redeemed items / SWS $

Monthly Active Users (“MAU”)

Number of guests that visited the app each month

Code Block
languagesql
WITH EVENTS AS (
SELECT DATE
       , _TIMHORTONS.INTERACTION.ELEMENT.NAME
       , _TIMHORTONS.LOYALTY.ID AS GUEST_ID
FROM   loyalty.events.adobe_app_events
WHERE  EVENTTYPE IN ('app_open','app_launch')    
AND    _TIMHORTONS.PLATFORM IN ('app') 
AND    LEFT(_TIMHORTONS.LOYALTY.ID,7) = 'us-east'
AND    DATE <= CURRENT_DATE )

SELECT     LAST_DAY(EVENTS.DATE) AS DTE
          , COUNT(DISTINCT EVENTS.GUEST_ID) AS ACTIVE_USER
FROM      EVENTS  
GROUP BY  1
ORDER BY  1 DESC

Used to track the unique number of guests who opened or launched the app per month. Limitation of the dataset is: (1) data only exists from Nov 1st, 2023, and (2) Prior to mm/dd/yyyy (TBD), dataset did not contain guests using app versions prior to 7.1.187.

Digital Sales

Pulled using the individual queries listed above.

Consists of WL, MO&P, Loyalty Scans, 3P Delivery, Kiosk & Catering.

Weekly Offer Redemptions

Code Block
languagesql
WITH REDEMPTION_SUMMARY AS (
  WITH OFFER_REDEMPTION_TRXNS AS (
    WITH TRANSACTIONS_WITH_OFFER_ID AS (
      SELECT
        TH_FISCAL_YEAR
PERIOD_DT,
COUNT(DISTINCT TRANSACTIONID) AS TRXNS

FROM TRANSACTIONS_WITH_OFFER_ID AS A

INNER JOIN (SELECT DISTINCT OFFERID FROM DYDB.WEEKLYOFFERS
             
            UNION ALL
            
            SELECT DISTINCT OFFERID
            FROM DYDB.OFFERS
            WHERE CONTAINS(description, 'LOYALTY')
            AND DESCRIPTION LIKE 'CA L%'
            AND DESCRIPTION NOT IN ('CA LR Registered Default (same as L1)-LOYALTY', 'CA LU Unregistered (same as 102) ONE-TIME-LOYALTY') ) B
            
ON A.EXPLODED_OFFERS = B.OFFERID 

LEFT JOIN DYDB.OFFERS AS C 
ON A.EXPLODED_OFFERS=C.OFFERID

WHERE EXPLODED_OFFERS IS NOT NULL 
AND C.OFFERID IS NOT NULL

GROUP BY 1

Used for tracking how many free items we’re giving away and the value of them.

Often viewed as a percentage of SWS or KDS.

Loyalty drag formula = $ value of redeemed items / SWS $

Monthly Active Users (“MAU”)

Number of guests that visited the app each month

Code Block
languagesql
WITH EVENTS AS (
SELECT DATE
       , _TIMHORTONS.INTERACTION.ELEMENT.NAME
       , _TIMHORTONS.LOYALTY.ID AS GUEST_ID
FROM   loyalty.events.adobe_app_events
WHERE  EVENTTYPE IN ('app_open','app_launch')    
AND    _TIMHORTONS.PLATFORM IN ('app') 
AND    LEFT(_TIMHORTONS.LOYALTY.ID,7) = 'us-east'
AND    _TIMHORTONS.LOYALTY.ID IN (SELECT DISTINCT registeredAccountId FROM loyalty.users.customer_base WHERE LEFT(loyaltyCustomerId,4) IN ('0463','0473'))
AND    DATE <= CURRENT_DATE )

SELECT     LAST_DAY(EVENTS.DATE) AS DTE
          , COUNT(DISTINCT EVENTS.GUEST_ID) AS ACTIVE_USER
FROM      EVENTS  
GROUP BY  1
ORDER BY  1 DESC

Used to track the unique number of guests who opened or launched the app per month. Limitation of the dataset is: (1) data only exists from Nov 1st, 2023, and (2) Prior to mm/dd/yyyy (TBD), dataset did not contain guests using app versions prior to 7.1.187.

Digital Sales

Pulled using the individual queries listed above.

Consists of WL, MO&P, Loyalty Scans, 3P Delivery, Kiosk & Catering.

Weekly Offer Redemptions

Code Block
languagesql
WITH REDEMPTION_SUMMARY AS (
  WITH OFFER_REDEMPTION_TRXNS AS (
    WITH TRANSACTIONS_WITH_OFFER_ID AS (
      SELECT
        TH_FISCAL_YEAR,
        TH_FISCAL_WEEK,
        CAST(WEEK_START_DT AS DATE) AS WEEK_START_DT,
        DATE_FORMAT(
          CAST(
            UNIX_TIMESTAMP(LEFT(WEEK_START_DT, 10), 'yyyy-MM-dd') AS TIMESTAMP
          ),
          'yyyyMMdd'
        ) AS WEEK_START,
        CAST(PERIOD_DT AS DATE) AS PERIOD_DT,
        REGISTEREDACCOUNTID,
        TRANSACTIONID,
        EXPLODE(APPLIEDOFFERS) AS EXPLODED_OFFERS
      FROM
        PRODRT.CURATED_TRANS_EVENTS_NEW
      WHERE
        PARTITION_DATE_KEY BETWEEN 'START DATE' AND 'END DATE'
        AND REGISTEREDACCOUNTID LIKE 'us-east%'
        AND COUNTRY_NM = 'CANADA'
    )
    SELECT
      DISTINCT A.TH_FISCAL_YEAR,
      A.TH_FISCAL_WEEK,
      A.WEEK_START_DT,
      A.PERIOD_DT,
      A.REGISTEREDACCOUNTID,
      A.TRANSACTIONID,
      C.NAME,
      C.DESCRIPTION,
      A.EXPLODED_OFFERS,
      1 AS VOLUME
    FROM
      TRANSACTIONS_WITH_OFFER_ID A
      INNER JOIN DYDB.WEEKLYOFFERS B ON A.EXPLODED_OFFERS = B.OFFERID
      LEFT JOIN DYDB.OFFERS C ON A.EXPLODED_OFFERS = C.OFFERID
  )
  SELECT
    WEEK_START_DT,
    A.DESCRIPTION AS OFFER_DESCRIPTION,
    A.EXPLODED_OFFERS AS OFFERID,
    SUM(VOLUME) AS REDEMPTION_VOLUME
  FROM
    OFFER_REDEMPTION_TRXNS A
  GROUP BY
    1,
    2,
    3
)
SELECT
  a.WEEK_START_DT AS WKDT,
  OFFER_DESCRIPTION,
  OFFERID,
  SUM(REDEMPTION_VOLUME)
FROM
  REDEMPTION_SUMMARY A
  GROUP BY 1,2,3

Used to track the volume of redemptions for each offer in a given week.

Offer Challenge

Code Block
languagesql
with TRXN_OFFER_CHALLENGES_REDEMPTIONS as (
      WITH EXPLODED AS (
        SELECT
          TH_FISCAL_YEAR,
          TH_FISCAL_WEEK,
          DATE_FORMAT(
            CAST(
              UNIX_TIMESTAMP(LEFT(WEEK_START_DT, 10), 'yyyy-MM-dd') AS TIMESTAMP
            ),
            'yyyyMMdd'
          ) AS WEEK_START_MAPPING,
          CAST(PERIOD_DT AS DATE) AS PERIOD_DT,
          REGISTEREDACCOUNTID,
          loyaltyCustomerId,
          TRANSACTIONID,
          EXPLODE(APPLIEDOFFERS) AS EXPLODED_OFFERS,
          REST_TYP_NM,
          OPS_DIV_NM
        FROM
          PRODRT.CURATED_TRANS_EVENTS_NEW -- 1.	Challenge duration: 26/09 to 02/10
        WHERE
          DATE_KEY BETWEEN '${myapplication.Offer_Start_Date}'
          AND '${myapplication.Offer_End_Date}'
          AND COUNTRY_NM = 'CANADA'
          AND REGISTEREDACCOUNTID IS NOT NULL
          AND TRANSACTIONID IS NOT NULL -- AND REST_TYP_NM = "STANDARD"
      )
      SELECT
        DISTINCT A.TH_FISCAL_YEAR,
        A.TH_FISCAL_WEEK,
        A.WEEK_START_MAPPING,
        A.PERIOD_DT,
        A.REGISTEREDACCOUNTID,
        A.loyaltyCustomerId,
        A.TRANSACTIONID,
        THA.REST_FISCALTYP_WEEKNM,
        CAST(WEEK_START_DT AS DATE) AS WEEK_START_DTA.OPS_DIV_NM,
        B.DESCRIPTION,
        DATE_FORMAT(1 AS REDEMPTIONS
      FROM
      CAST(  EXPLODED AS A
        UNIX_TIMESTAMP(LEFT(WEEK_START_DT, 10), 'yyyy-MM-dd') JOIN DYDB.OFFERS AS TIMESTAMPB ON A.EXPLODED_OFFERS = B.OFFERID
      ),WHERE
        EXPLODED_OFFERS = 'yyyyMMdd'76290e2e-1783-442f-8ff6-a2b16900a34e'
    ),
    ) AS WEEK_START,points_issued as (
      Select
    CAST(PERIOD_DT AS DATE) AS PERIOD_DT*,
        WEEKOFYEAR(to_date(partition_date_key, "yyyyMMdd")) AS REGISTEREDACCOUNTIDWEEK_START,
        TRANSACTIONID,
        EXPLODE(APPLIEDOFFERS) AS EXPLODED_OFFERSregexp_extract(barcode, '(\\d+)|(\\d+)', 0) as lid
      FROMFrom
        PRODRTprodrt.CURATEDcurated_TRANS_EVENTS_NEWpoints_events as points
      WHEREwhere
        PARTITIONpartition_DATEdate_KEYkey BETWEEN 'START DATE' AND 'END DATE'${myapplication.Offer_Start_Date}'
         AND REGISTEREDACCOUNTID LIKE 'us-east%'${myapplication.Offer_End_Date}'
        ANDand COUNTRY_NMtag = 'CANADAPRODUCT_CHALLENGED_COMPLETED'
    ),
    completed as(
    SELECT  Select
       DISTINCT A.a.TH_FISCAL_YEAR as TH_FISCAL_YEAR,
      A  a.TH_FISCAL_WEEK as TH_FISCAL_WEEK,
       A a.WEEK_START_DT,MAPPING       A.PERIOD_DTas WEEK_START_MAPPING,
      A.REGISTEREDACCOUNTID,       A.TRANSACTIONID,
      C.NAMEa.PERIOD_DT as PERIOD_DT,
      C.DESCRIPTION,   DATE_FORMAT(
   A.EXPLODED_OFFERS,       1CAST(
AS VOLUME     FROM       TRANSACTIONS_WITH_OFFER_ID A
  UNIX_TIMESTAMP(LEFT(PERIOD_DT, 10), 'yyyy-MM-dd') AS TIMESTAMP
   INNER JOIN DYDB.WEEKLYOFFERS B ON A.EXPLODED_OFFERS = B.OFFERID),
      LEFT JOIN DYDB.OFFERS C ON A.EXPLODED_OFFERS = C.OFFERID'yyyyMMdd'
     )   SELECT) as    WEEK_START_DTtransaction_dt,
    A.DESCRIPTION AS OFFER_DESCRIPTION,  a.REGISTEREDACCOUNTID   A.EXPLODED_OFFERS AS OFFERID,as REGISTEREDACCOUNTID,
      SUM(VOLUME) AS REDEMPTION_VOLUME
  FROM a.loyaltyCustomerId as loyaltyCustomerId,
     OFFER_REDEMPTION_TRXNS A  a.TRANSACTIONID GROUPas BYTRANSACTIONID,
    1,     2,
a.REST_TYP_NM as REST_TYP_NM,
   3 ) SELECT   a.WEEKOPS_STARTDIV_DTNM AS WKDTas OPS_DIV_NM,
  OFFER_DESCRIPTION,   OFFERID,   SUM(REDEMPTION_VOLUME)
FROM
  REDEMPTION_SUMMARY Aa.DESCRIPTION as DESCRIPTION,
     GROUP BY 1,2,3

Used to track the volume of redemptions for each offer in a given week.

Offer Challenge

Code Block
languagesql
with TRXN_OFFER_CHALLENGES_REDEMPTIONS as (  a.REDEMPTIONS as REDEMPTIONS,
        b.transactionID WITH EXPLODED AS (as completion_transactionID,
        b.pointsEarned as SELECTpointsEarned,
        b.restaurant as TH_FISCAL_YEARrestaurant,
        b.partition_date_key as THoffer_FISCALcompletion_WEEKdt,
        b.WEEK_START as DATE_FORMAT(offer_completion_week,
        b.lid as lid
 CAST(     from
         UNIX_TIMESTAMP(LEFT(WEEK_START_DT, 10), 'yyyy-MM-dd') AS TIMESTAMPTRXN_OFFER_CHALLENGES_REDEMPTIONS a
        left join points_issued b on a.loyaltyCustomerId = b.lid
 ),       and b.WEEK_START = a.TH_FISCAL_WEEK
  'yyyyMMdd'  )
    Select
   )  AS WEEKTH_STARTFISCAL_MAPPINGYEAR,
      TH_FISCAL_WEEK,
   CAST(PERIOD_DT AS DATE) AS PERIOD_DT, WEEK_START_MAPPING,
      REGISTEREDACCOUNTID,
      REGISTEREDACCOUNTIDloyaltyCustomerId,
      offer_completion_week,
    loyaltyCustomerId,  count(
        distinct(
TRANSACTIONID,          case
EXPLODE(APPLIEDOFFERS) AS EXPLODED_OFFERS,          when RESToffer_TYPcompletion_NM,dt is not NULL
       OPS_DIV_NM     and transaction_dt <=  FROMoffer_completion_dt then TRANSACTIONID
           PRODRT.CURATED_TRANS_EVENTS_NEW -- 1.	Challenge duration: 26/09 to 02/10
 end
        )
      WHERE) as trnx_before_completion,
      count(distinct(TRANSACTIONID)) as DATEtotal_KEYtrnx,
 BETWEEN '${myapplication.Offer_Start_Date}'    count(
      AND '${myapplication.Offer_End_Date}'  distinct (
          case
AND COUNTRY_NM = 'CANADA'         when lid ANDis REGISTEREDACCOUNTIDnot ISNull NOTthen NULLlid
          ANDend
TRANSACTIONID IS NOT NULL -- AND REST_TYP_NM = "STANDARD")
      ) as completed
    SELECTfrom
      completed
 DISTINCT A.TH_FISCAL_YEAR,  group by 1, 2, 3, 4,  A.TH_FISCAL_WEEK,5, 6

Count of guests who completed a specific Offer Challenge

Games

NHL Hockey Challenge & Tims Word Challenge

Code Block
languagesql
SELECT    YEAR(TIMESTAMP) AS YR
  A.WEEK_START_MAPPING,         A.PERIOD_DT, MONTH(TIMESTAMP) AS  MTH 
   A.REGISTEREDACCOUNTID,         A.loyaltyCustomerId, COUNT(DISTINCT GUESTS) AS GUESTS FROM (
-- WORD A.TRANSACTIONID,CHALLENEGE PLAYERS

SELECT    DISTINCT  A.REST_TYP_NM,
  TIMESTAMP, _TIMHORTONS.LOYALTY.ID AS GUESTS
FROM      Aloyalty.events.OPSadobe_DIVapp_NM,events 
WHERE     TRIM(_TIMHORTONS.INTERACTION.PATH)  B.DESCRIPTION,
 IN ('/timswordchallenge')
AND       1 AS REDEMPTIONS
TRIM(_TIMHORTONS.INTERACTION.ELEMENT.NAME) = 'play'
AND      FROM _TIMHORTONS.PLATFORM IN ('app')
AND     EXPLODED AS A
   LEFT(_TIMHORTONS.LOYALTY.ID,7) = 'us-east'
AND      LEFT JOIN DYDB.OFFERS AS B ON A.EXPLODED_OFFERS = B.OFFERID
      WHERE
 _TIMHORTONS.LOYALTY.ID IN (SELECT DISTINCT registeredAccountId FROM loyalty.users.customer_base WHERE LEFT(loyaltyCustomerId,4) IN ('0463','0473'))
AND       DATE EXPLODED_OFFERS =>= DATE '76290e2e2023-1783-442f-8ff6-a2b16900a34e11-01' 

UNION
-- ),HOCKEY PLAYERS

SELECT  points_issued as (
DISTINCT TIMESTAMP,_TIMHORTONS.LOYALTY.ID  AS GUESTS
FROM  Select    loyalty.events.adobe_app_events
WHERE    *,
        WEEKOFYEAR(to_date(partition_date_key, "yyyyMMdd")) AS WEEK_START, TRIM(_TIMHORTONS.INTERACTION.PATH) = '/hockey_challenge'
AND       TRIM(_TIMHORTONS.INTERACTION.ELEMENT.NAME) IN regexp_extract(barcode, '(\\d+)|(\\d+)', 0) as lid'submit_picks')
AND       _TIMHORTONS.PLATFORM FromIN ('app')
AND       prodrt.curated_points_events as points
LEFT(_TIMHORTONS.LOYALTY.ID,7) = 'us-east'
AND      where _TIMHORTONS.LOYALTY.ID IN (SELECT DISTINCT registeredAccountId FROM loyalty.users.customer_base  partition_date_key BETWEEN '${myapplication.Offer_Start_Date}'
WHERE LEFT(loyaltyCustomerId,4) IN ('0463','0473'))
AND       DATE >= AND '${myapplication.Offer_End_Date}DATE '2023-11-01' 
)
GROUP BY 1,2
ORDER BY 1 DESC, 2

Count of guests who played Games (NHL Hockey Challenge and

tag = 'PRODUCT_CHALLENGED_COMPLETED' ), completed as(

Tims Word Challenge).

Limitation: Data only available from Nov 1, 2023.

Total Sales and Ticket Count by Tender Type

Code Block
languagesql
WITH LOYALTY_TENDERS AS
(
    WITH TENDERS AS
    (
  Select    SELECT
    a.TH_FISCAL_YEAR as TH_FISCAL_YEAR,
    REPLACE(UPPER(TRIM(TENDER_NAME)), '.', '') AS TENDER_NAME,
    a.TH_FISCAL_WEEK as TH_FISCAL_WEEK,TICKET_ID

      FROM aloyalty.tlog.WEEKtlog_START_MAPPING as WEEK_START_MAPPING,sale_ticket_tenders

      WHERE a.PERIOD_DT as PERIOD_DT,
   PARTITION_DATE_KEY BETWEEN 20230101 AND 20230731
    DATE_FORMAT(  AND     LEFT(REST_NO,2) = 10
   CAST( ),

    LOYALTY AS
    UNIX_TIMESTAMP(LEFT(PERIOD_DT,
10), 'yyyy-MM-dd') AS TIMESTAMP   SELECT 
      ),TICKET_ID AS TICKET_ID

       'yyyyMMdd'FROM STG.DERIVED_MASTER_TABLE_NEW

      WHERE ) as transaction_dt,
 PARTITION_DATE_KEY BETWEEN 20230101 AND 20230731
      a.REGISTEREDACCOUNTID as REGISTEREDACCOUNTID,
AND COUNTRY_NM = 'CANADA'
       a.loyaltyCustomerId as loyaltyCustomerId,AND IS_PASS_THROUGH = 0 
       a.TRANSACTIONID as TRANSACTIONID,
AND LEFT(REGISTERED_ACCOUNT_ID,7) = 'us-east'
    )

 a.REST_TYP_NM as REST_TYP_NM, SELECT
    A.*

 a.OPS_DIV_NM as OPS_DIV_NM, FROM TENDERS A

    a.DESCRIPTIONINNER asJOIN DESCRIPTION,LOYALTY B
    ON A.TICKET_ID = aB.REDEMPTIONSTICKET_ID
as REDEMPTIONS,   )

SELECT
CASE
  b.transactionID as completion_transactionID,      WHEN UPPER(TENDER_NAME)  b.pointsEarned as pointsEarned,
        b.restaurant as restaurant,
IN ('CASH', 'COMPTANT', 'EFECTIVO', 'US CASH', 'CANADIAN CASH', 'CDN CASH', 'ROUNDED CASH', 'ROUNDED COMPTANT') THEN 'CASH'

      b.partition_date_key as offer_completion_dt,  WHEN UPPER(TENDER_NAME) IN ('DEBIT CARD', 'DEBIT',  b.WEEK_START as offer_completion_week,
   'CARTE DEBIT', 'DEBITO', 'DÉBIT', 'DO DEBIT') THEN 'DEBIT'

   b.lid as lid     WHEN  from
        TRXN_OFFER_CHALLENGES_REDEMPTIONS a
        left join points_issued b on a.loyaltyCustomerId = b.lid
        and b.WEEK_START = a.TH_FISCAL_WEEK
    )
    Select
      TH_FISCAL_YEAR,
      TH_FISCAL_WEEK,
      WEEK_START_MAPPING,
      REGISTEREDACCOUNTID,
      loyaltyCustomerId,
      offer_completion_week,
      count(
        distinct(UPPER(TENDER_NAME) IN ('VISA', 'MASTERCARD', 'MASTER CARD', 'AMEX', 'AMERICAN EXPRESS', 'CREDIT CARD', 'CREDIT CARDS', 'DISCOVER', 'M/C', 'DISCOVER CARD', 'DIGITAL AMEX', 'DIGITAL DISCOVER', 'DIGITAL MASTER CARD', 'DIGITAL MASTERCARD', 'DIGITAL AMERICAN EXPRESS', 'DIGITAL VISA', 'DO VISA', 'DO MASTERCARD') THEN 'CREDIT'

          WHEN UPPER(TENDER_NAME) IN ('TIM CARD', 'DIGITAL TIM CARD', 'CARTE TIM', 'MOBILE TIM CARD', 'DIGITAL CARTE TIM', 'TIM CARTE', 'TIMS GIFT CARD', 'DIGITAL TIMS GIFT CARD', 'CARTE-CADEAU TIM', 'DIGITAL CARTE-CADEAU TIM') THEN 'TIMCARD'

          WHEN UPPER(TENDER_NAME) LIKE '%SKIP%' THEN 'SKIP'

          WHEN UPPER(TENDER_NAME) LIKE '%UBER%' caseTHEN 'UBER'

          whenWHEN offer_completion_dt is not NULL
UPPER(TENDER_NAME) LIKE '%DOOR%' THEN 'DOORDASH'

          andWHEN transaction_dt <= offer_completion_dt then TRANSACTIONID
          end
        )
      ) as trnx_before_completion,
      count(distinct(TRANSACTIONID)) as total_trnx,
      count(
        distinct (
          case
            when lid is not Null then lidUPPER(TENDER_NAME) IN ('SCAN AND PAY VISA', 'SCAN AND PAY MASTERCARD', 'SCAN AND PAY TIMCARD', 'SCAN AND PAY AMEX', 'SCAN AND PAY DISCOVER', 'SCAN AND PAY TIM CARD', 'NUMERISEZ ET PAYEZ – VISA', 'SCANTOPAY', 'NUMERISEZ ET PAYEZ – MASTERCARD', 'NUMERISEZ ET PAYEZ – CARTE TIM', 'NUMÉRISEZ ET PAYEZ – VISA', 'NUMÉRISEZ ET PAYEZ – MASTERCARD', 'NUMÉRISEZ ET PAYEZ – CARTE TIM', 'NUMERISEZ ET PAYEZ – AMEX', 'NUMÉRISEZ ET PAYEZ – AMEX', 'SCAN AND PAY TIMS GIFT CARD', 'NUMERISEZ ET PAYEZ CARTE-CADEAU TIM') THEN 'SCANANDPAY'

          end
        )
      ) as completed
    from
      completed
    group by 1, 2, 3, 4, 5, 6

Count of guests who completed a specific Offer Challenge

Games

NHL Hockey Challenge & Tims Word Challenge

Code Block
languagesql
SELECT    YEAR(TIMESTAMP) AS YR
          , MONTH(TIMESTAMP) AS MTHWHEN UPPER(TENDER_NAME) IN ('HST', 'HST1', 'TVQ', 'TPS', 'GST', 'TAX', 'PST', 'HST TAXABLE SALES', 'SALES TAX' 'HST 1', 'H.S.T.1', 'H.S.T', 'HST 13% TAXABLE SALES', 'GST TAXABLE SALES', 'TAX 1', 'HST 1', 'GST# 75696 6891 RT0001', 'HST # 897258141', 'HST5%', 'HST8%', 'QST', 'SALES TAX', 'MEAL PLAN CARD - PREPAID TAX', 'CARTE PLAN REPAS - TAX PREPAYEE', 'GST # 121071781RT0001', 'TVH', 'TVH1', 'VAF', 'H.S.T.') THEN 'TAX'

          ,WHEN COUNT(DISTINCT GUESTS((UPPER(TENDER_NAME) AS GUESTS FROM (
-- WORD CHALLENEGE PLAYERS

SELECT    DISTINCT TIMESTAMP, _TIMHORTONS.LOYALTY.ID AS GUESTS
FROM LIKE '%ROUND%') OR (UPPER(TENDER_NAME) LIKE '%ARRONDIS %')) THEN 'ROUND UP'

   loyalty.events.adobe_app_events  WHERE     TRIM(_TIMHORTONS.INTERACTION.PATH) IN ('/timswordchallenge')
AND       TRIM(_TIMHORTONS.INTERACTION.ELEMENT.NAME) = 'play'
AND       _TIMHORTONS.PLATFORM IN ('app')
AND       LEFT(_TIMHORTONS.LOYALTY.ID,7) = 'us-east'
AND       DATE >= DATE '2023-11-01' 

UNION
-- HOCKEY PLAYERS

SELECT    DISTINCT TIMESTAMP,_TIMHORTONS.LOYALTY.ID  AS GUESTS
FROM      loyalty.events.adobe_app_events
WHERE     TRIM(_TIMHORTONS.INTERACTION.PATH) = '/hockey_challenge'
AND       TRIM(_TIMHORTONS.INTERACTION.ELEMENT.NAME) IN ('submit_picks')
AND       _TIMHORTONS.PLATFORM IN ('app')
AND       LEFT(_TIMHORTONS.LOYALTY.ID,7) = 'us-east'
AND       DATE >= DATE '2023-11-01' 
)
GROUP BY 1,2
ORDER BY 1 DESC, 2

Count of guests who played Games (NHL Hockey Challenge and Tims Word Challenge).

Limitation: Data only available from Nov 1, 2023.

Total Sales and Ticket Count by Tender Type

Code Block
languagesql
WITH LOYALTY_TENDERS AS
(
    WITH TENDERS AS
    (
      SELECT
      REPLACE(UPPER(TRIM(TENDER_NAME)), '.', '') AS TENDER_NAME,
      TICKET_ID

      FROM loyalty.tlog.tlog_sale_ticket_tenders

      WHERE PARTITION_DATE_KEY BETWEEN 20230101 AND 20230731
      AND LEFT(REST_NO,2) = 10
    ),

    LOYALTY AS
    (
      SELECT 
      TICKET_ID AS TICKET_ID

      FROM STG.DERIVED_MASTER_TABLE_NEW

      WHERE PARTITION_DATE_KEY BETWEEN 20230101 AND 20230731
      AND COUNTRY_NM = 'CANADA'
      AND IS_PASS_THROUGH = 0 
      AND LEFT(REGISTERED_ACCOUNT_ID,7) = 'us-east'
    )

    SELECT
    A.*

    FROM TENDERS A

    INNER JOIN LOYALTY B
    ON A.TICKET_ID = B.TICKET_ID
    )

SELECT
CASE
          WHEN UPPER(TENDER_NAME) IN ('CASH', 'COMPTANT', 'EFECTIVO', 'US CASH', 'CANADIAN CASH', 'CDN CASH', 'ROUNDED CASH', 'ROUNDED COMPTANT') THEN 'CASH'

          WHEN UPPER(TENDER_NAME) IN ('DEBIT CARD', 'DEBIT', 'CARTE DEBIT', 'DEBITO', 'DÉBIT', 'DO DEBIT') THEN 'DEBIT'

          WHEN UPPER(TENDER_NAME) IN ('VISA', 'MASTERCARD', 'MASTER CARD', 'AMEX', 'AMERICAN EXPRESS', 'CREDIT CARD', 'CREDIT CARDS', 'DISCOVER', 'M/C', 'DISCOVER CARD', 'DIGITAL AMEX', 'DIGITAL DISCOVER', 'DIGITAL MASTER CARD', 'DIGITAL MASTERCARD', 'DIGITAL AMERICAN EXPRESS', 'DIGITAL VISA', 'DO VISA', 'DO MASTERCARD') THEN 'CREDIT'

          WHEN UPPER(TENDER_NAME) IN ('TIM CARD', 'DIGITAL TIM CARD', 'CARTE TIM', 'MOBILE TIM CARD', 'DIGITAL CARTE TIM', 'TIM CARTE', 'TIMS GIFT CARD', 'DIGITAL TIMS GIFT CARD', 'CARTE-CADEAU TIM', 'DIGITAL CARTE-CADEAU TIM') THEN 'TIMCARD'

          WHEN UPPER(TENDER_NAME) LIKE '%SKIP%' THEN 'SKIP'

          WHEN UPPER(TENDER_NAME) LIKE '%UBER%' THEN 'UBER'

          WHEN UPPER(TENDER_NAME) LIKE '%DOOR%' THEN 'DOORDASH'

          WHEN UPPER(TENDER_NAME) IN ('SCAN AND PAY VISA', 'SCAN AND PAY MASTERCARD', 'SCAN AND PAY TIMCARD', 'SCAN AND PAY AMEX', 'SCAN AND PAY DISCOVER', 'SCAN AND PAY TIM CARD', 'NUMERISEZ ET PAYEZ – VISA', 'SCANTOPAY', 'NUMERISEZ ET PAYEZ – MASTERCARD', 'NUMERISEZ ET PAYEZ – CARTE TIM', 'NUMÉRISEZ ET PAYEZ – VISA', 'NUMÉRISEZ ET PAYEZ – MASTERCARD', 'NUMÉRISEZ ET PAYEZ – CARTE TIM', 'NUMERISEZ ET PAYEZ – AMEX', 'NUMÉRISEZ ET PAYEZ – AMEX', 'SCAN AND PAY TIMS GIFT CARD', 'NUMERISEZ ET PAYEZ CARTE-CADEAU TIM') THEN 'SCANANDPAY'
ELSE 'OTHER'
END AS TENDER,
COUNT(DISTINCT TICKET_ID) AS TRXNS

FROM LOYALTY_TENDERS

GROUP BY 1

Total sales $ and ticket count organized by tender type (debit, credit, cash, Tims Card, tax) for a given restaurant

Discounting

Code Block
languagesql
With base as(
select
  period_dt,
  state_nm, 
  detail_type,
  service_mode_cd,
  ticket_details_key,
  ticket_details_pos_no,
  a.ticket_details_pos_nm,
  B.discount_key,
  B.discount_cd,
  B.discount_nm,
  C.coupon_key,
  C.coupon_cd,
  C.coupon_offr_nm,
  D.Category,
  SUM(amount) as amt, 
  count(distinct(ticket_id)) as TRXNS
from
  STG.DERIVED_MASTER_TABLE_NEW a
  left join loyalty.tlog.dim_discount b on a.ticket_details_key = b.discount_key
  left join tlog.dim_coupon c on a.ticket_details_key = c.coupon_key
  left join loyalty.analytics.clearview_mapping_discount_types d on a.ticket_details_pos_nm = d.ticket_details_pos_nm
where amount < 0 
  and partition_date_key between <Start_Date> and <End_Date>
  AND COUNTRY_NM = 'CANADA' 
GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
)
select
  last_Day(period_dt) as month_dt,
  detail_type,
  ticket_details_pos_nm,
  discount_nm,
  coupon_offr_nm,
  Category,
  sum(amt),
  sum(TRXNS) As trxns
from
  base
group by 1, 2, 3, 4, 5, 6
Code Block
loyalty.analytics.clearview_mapping_discount_types

This table is manually mapped by grouping ticket_detail_POS_nm into categories

Combo Discount, Combo Discount (BG Bundle), Tims Rewards, Targeted Offers, Campaign, In-restaurant, Other, Settlement, and Uncategorized

This mapping was last updated in March 2024; any unmapped fields would show up as null and would be considered as “Other”

Discounts on offerids

Code Block
languagesql
-- Total Summary
with clean_loyalty_transactions as(
  with FILTERED as(
    WITH SEPERATED AS (
      -- Filter for Exploded offers for offer ids and explode the disc amt with corresponding PLU
      with zipped as (
        -- explode offers and combine the Discount amount with offer
        SELECT
          *,
          arrays_zip(discountAmounts, appliedOffers) as comb --   EXPLODE(APPLIEDOFFERS) AS EXPLODED_OFFERS
        FROM
          PRODRT.CURATED_TRANS_EVENTS_NEW
        WHERE
          partition_date_key >= 20201201
          -- to_date(partition_date_key, "yyyyMMdd") BETWEEN DATE '$Start_Date' AND DATE '$End_Date'
          AND LEFT(REGISTEREDACCOUNTID, 7) = 'us-east'
          AND APPLIEDOFFERS IS NOT NULL
          AND COUNTRY_NM = 'CANADA'
      )
      select
        DISTINCT transactionId,
        loyaltyCustomerId,
        registeredAccountId,
        state_nm,
        ticketId,
        period_dt,
        th_fiscal_week,
        th_fiscal_year,
        week_start_dt,
        explode(Comb) as test
      from
        zipped
    )
    SELECT
      *,
      test ['discountAmounts'] AS DISC_AMT,
      test ['appliedOffers'] AS APPLIED_OFFER
    FROM
      SEPERATED
  )
  select
    FILTERED.*,
    O.NAME,
    O.DESCRIPTION,
    1 as VOLUME
  From
    FILTERED
    inner JOIN DYDB.OFFERS O ON O.OFFERID = FILTERED.APPLIED_OFFER
)
SELECT
  TH_FISCAL_YEAR,
  th_fiscal_week,
  date(week_start_dt) as wk_start_dt,
  state_nm, 
  APPLIED_OFFER,
  DESCRIPTION,
  SUM(DISC_AMT) AS DISCOUNT_DOLLARS,
  SUM(VOLUME) AS REDEMPTION_VOLUME
FROM
  clean_loyalty_transactions
GROUP BY
  1,2,3,4,5,6

Tims Word Challenge Player Levels

Code Block
languagesql
SELECT LEVEL, COUNT(DISTINCT ID) AS USERS
FROM (
SELECT    _TIMHORTONS.LOYALTY.ID, MAX(DATE(TIMESTAMP)) AS DTE
        , COALESCE(MAX(CAST(SUBSTRING(_TIMHORTONS.INTERACTION.ELEMENT.VALUE,18,CHARINDEX('-',REPLACE(_TIMHORTONS.INTERACTION.ELEMENT.VALUE,'"','-'),18)-18) AS INT)),0) LEVEL
FROM    loyalty.events.adobe_app_events
WHERE   EVENTTYPE = 'element_clicked'
AND     DATE(TIMESTAMP) >= DATE '2023-11-01'
AND     _TIMHORTONS.INTERACTION.PATH = '/timswordchallenge'
AND     _TIMHORTONS.INTERACTION.ELEMENT.NAME = 'play'
AND     _TIMHORTONS.LOYALTY.ID IN (SELECT DISTINCT registeredAccountId FROM loyalty.users.customer_base WHERE LEFT(loyaltyCustomerId,4) IN ('0463','0473'))
GROUP BY 1
)
GROUP BY 1
ORDER BY 1

Points Issued by Channel

Code Block
languagesql
WITH OFFER_BASE AS
(
          WHEN UPPER(TENDER_NAME) IN ('HST', 'HST1', 'TVQ', 'TPS', 'GST', 'TAX', 'PST', 'HST TAXABLE SALES', 'SALES TAX' 'HST 1', 'H.S.T.1', 'H.S.T', 'HST 13% TAXABLE SALES', 'GST TAXABLE SALES', 'TAX 1', 'HST 1', 'GST# 75696 6891 RT0001', 'HST # 897258141', 'HST5%', 'HST8%', 'QST', 'SALES TAX', 'MEAL PLAN CARD - PREPAID TAX', 'CARTE PLAN REPAS - TAX PREPAYEE', 'GST # 121071781RT0001', 'TVH', 'TVH1', 'VAF', 'H.S.T.') THEN 'TAX'

    SELECT 
            MONTH_DT,
            SUM(CASE WHEN A.TAG IS NULL AND LEFT(A.EXPLODED.OFFERID,11) = 'EARN_POINTS' THEN A.EXPLODED.TIMSPOINTSEARNED ELSE 0 END) AS BASE,
            SUM(CASE WHEN LEFT(A.EXPLODED.OFFERID,11) <> 'EARN_POINTS' AND A.EXPLODED.OFFERID IS NOT NULL AND A.TAG IS NULL THEN A.EXPLODED.TIMSPOINTSEARNED ELSE 0 END) AS OFFERS
      WHEN ((UPPER(TENDER_NAME) LIKE '%ROUND%') OR (UPPER(TENDER_NAME) LIKE
'%ARRONDIS
%')) THEN 'ROUND UP'         FROM (SELECT 
ELSE 'OTHER' END AS TENDER, COUNT(DISTINCT TICKET_ID) AS TRXNS  FROM LOYALTY_TENDERS  GROUP BY 1

Total sales $ and ticket count organized by tender type (debit, credit, cash, Tims Card, tax) for a given restaurant

Discounting

Code Block
languagesql
With base as( select   period_dt,
  state_nm, 
  detail_type,
  service_mode_cd,
  ticket_details_key,
  ticket_details_pos_no,
  a.ticket_details_pos_nm,
  B.discount_key,
  B.discount_cd,
  B.discount_nm,
  C.coupon_key,
  C.coupon_cd,
  C.coupon_offr_nm,
  D.Category,
  SUM(amount) as amt, 
  count(distinct(ticket_id)) as TRXNS
from
  STG.DERIVED_MASTER_TABLE_NEW a
  left join loyalty.tlog.dim_discount b on a.ticket_details_key = b.discount_key
  left join tlog.dim_coupon c on a.ticket_details_key = c.coupon_key
  left join loyalty.analytics.clearview_mapping_discount_types d on a.ticket_details_pos_nm = d.ticket_details_pos_nm
where amount < 0 
  and partition_date_key between <Start_Date> and <End_Date>
  AND COUNTRY_NM = 'CANADA' 
GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
)
select
  last_Day(period_dt) as month_dt,
  detail_type,
  ticket_details_pos_nm,
  discount_nm,
  coupon_offr_nm,
  Category,
  sum(amt),
  sum(TRXNS) As trxns
from
  base
group by 1, 2, 3, 4, 5, 6
Code Block
loyalty.analytics.clearview_mapping_discount_types

This table is manually mapped by grouping ticket_detail_POS_nm into categories

Combo Discount, Combo Discount (BG Bundle), Tims Rewards, Targeted Offers, Campaign, In-restaurant, Other, Settlement, and Uncategorized

This mapping was last updated in March 2024; any unmapped fields would show up as null and would be considered as “Other”

Discounts on offerids

Code Block
languagesql
-- Total Summary
with clean_loyalty_transactions as(
  with FILTERED as(
    WITH SEPERATED AS (
      -- Filter for Exploded offers for offer ids and explode the disc amt with corresponding PLU
      with zipped as (
        -- explode offers and combine the Discount amount with offer
        SELECT
          *,
          arrays_zip(discountAmounts, appliedOffers) as comb --   EXPLODE(APPLIEDOFFERS) AS EXPLODED_OFFERS
        FROM
          PRODRT.CURATED_TRANS_EVENTS_NEW
        WHERE
          partition_date_key >= 20201201
          -- to_date(partition_date_key, "yyyyMMdd") BETWEEN DATE '$Start_Date' AND DATE '$End_Date'
          AND LEFT(REGISTEREDACCOUNTID, 7) = 'us-east'
          AND APPLIEDOFFERS IS NOT NULL
          AND COUNTRY_NM = 'CANADA'
      )
      select
        DISTINCT transactionId,
        loyaltyCustomerId,
        registeredAccountId,
        state_nm,
        ticketId,
        period_dt,
        th_fiscal_week,
        th_fiscal_year,
        week_start_dt,
        explode(Comb) as test
      from
        zipped
    )
    SELECT
      *,
      test ['discountAmounts'] AS DISC_AMT,
      test ['appliedOffers'] AS APPLIED_OFFER
    FROM
      SEPERATED
  )
  select
    FILTERED.*,
    O.NAME,
    O.DESCRIPTION,
    1 as VOLUME
  From
    FILTERED
    inner JOIN DYDB.OFFERS O ON O.OFFERID = FILTERED.APPLIED_OFFER
)
SELECT
  TH_FISCAL_YEAR,
  th_fiscal_week,
  date(week_start_dt) as wk_start_dt,
  state_nm, 
  APPLIED_OFFER,
  DESCRIPTION,
  SUM(DISC_AMT) AS DISCOUNT_DOLLARS,
  SUM(VOLUME) AS REDEMPTION_VOLUME
FROM
  clean_loyalty_transactions
GROUP BY
  1,2,3,4,5,6

Tims Word Challenge Player Levels

Code Block
languagesql
SELECT LEVEL, COUNT(DISTINCT ID) AS USERS
FROM (
SELECT    _TIMHORTONS.LOYALTY.ID, MAX(DATE(TIMESTAMP)) AS DTE LAST_DAY(TO_DATE(PARTITION_DATE_KEY, 'yyyyMMdd')) AS MONTH_DT,
                  TAG,
                  TRANSACTIONID,
                  POINTSEARNED,
                  coalesce(cast(isCustomerServiceVisit as string), '') as ISCUSTOMERSERVICEVISIT,
                  EXPLODE(APPLIEDOFFERDETAILS) AS EXPLODED
            
                  FROM PRODRT.CURATED_POINTS_EVENTS A

                  WHERE TO_DATE(PARTITION_DATE_KEY, 'yyyyMMdd') BETWEEN DATE '2024-05-01' AND DATE '2024-05-31' --UPDATE THIS
                  AND LEFT(BARCODE, 4) = '0463'
                  AND COALESCE(PARTNERID, '') = '' 
                  AND ISCUSTOMERSERVICEVISIT IS NOT TRUE
                  ) A

            GROUP BY 1
),

ALL_OTHER AS
(
            SELECT 
            LAST_DAY(TO_DATE(PARTITION_DATE_KEY, 'yyyyMMdd')) AS MONTH_DT,
            SUM(CASE WHEN B.TAG IN ('DAYPART_CHALLENGED_COMPLETED','PRODUCT_CHALLENGED_COMPLETED','FREQUENCY_CHALLENGED_COMPLETED') THEN B.POINTSEARNED ELSE 0 END) AS CHALLENGES,
            SUM(CASE WHEN LEFT(TAG, 4) = 'RUTR' THEN POINTSEARNED ELSE 0 END) AS RUTW,
            SUM(CASE WHEN LEFT(B.TAG, 6) = 'HOCKEY' THEN B.POINTSEARNED ELSE 0 END) AS HOCKEY,
            SUM(CASE WHEN B.ISCUSTOMERSERVICEVISIT = 'true' THEN B.POINTSEARNED ELSE 0 END) AS GUEST_CARE,
            SUM(CASE WHEN UPPER(B.TAG) = 'WORD_CHALLENGE_LEVEL' THEN B.POINTSEARNED ELSE 0 END) AS WORD_CHALLENGE,
            SUM(B.POINTSEARNED) AS TOTAL_POINTS

            FROM PRODRT.CURATED_POINTS_EVENTS B

            WHERE TO_DATE(PARTITION_DATE_KEY, 'yyyyMMdd') BETWEEN DATE '2024-05-01' AND DATE '2024-05-31' --UPDATE THIS
            AND LEFT(BARCODE, 4) = '0463'
            ,AND COALESCE(MAX(SUBSTRING(_TIMHORTONS.INTERACTION.ELEMENT.VALUE,18,CHARINDEX('-',REPLACE(_TIMHORTONS.INTERACTION.ELEMENT.VALUE,'"','-'),18)-18)),0) LEVEL
FROM    loyalty.events.adobe_app_events
WHERE   EVENTTYPE = 'element_clicked'
ANDPARTNERID, '') = '' 

          DATE(TIMESTAMP) >= DATE '2023-11-01'
AND     _TIMHORTONS.INTERACTION.PATH = '/timswordchallenge'
AND     _TIMHORTONS.INTERACTION.ELEMENT.NAME = 'play'
GROUP BY 1
)
GROUP BY 1
ORDER BY 1GROUP BY 1
)

SELECT 
A.MONTH_DT,
BASE,
OFFERS,
CHALLENGES,
RUTW,
HOCKEY,
GUEST_CARE,
WORD_CHALLENGE,
TOTAL_POINTS

FROM OFFER_BASE A 

LEFT JOIN ALL_OTHER B
ON A.MONTH_DT = B.MONTH_DT