← back to Consulting Designerwallcoverings Com
data/attribution-scheme.json
161 lines
{
"_meta": {
"title": "Designer Wallcoverings — per-channel UTM + coupon attribution scheme",
"purpose": "Attribution-before-optimization (DTD verdict A). Every link a DW social/marketing channel emits carries a deterministic UTM stamp, and every offer carries a per-channel coupon code, so both click-path AND redemption-path conversions map back to the originating channel in GA4 + Shopify — even when link params are stripped (dark social, in-app browsers).",
"engagement": "DW consulting engagement, TK-19",
"authored": "2026-07-26",
"authored_by": "yolo-worker (SAFE-ONLY prep, no live writes)",
"destination_store": "designer-laboratory-sandbox.myshopify.com (LIVE Designer Wallcoverings Shopify store — legacy misnomer, treat as production)",
"storefront_domain": "www.designerwallcoverings.com",
"ga4_status": "LIVE. GA4 property 294178030 / measurement ID G-53F1QBZSG0 already exists; gtag is installed and collecting on the LIVE Shopify store, with Consent Mode v2 verified on the live theme (per commit 4bcdbe7, ~$6.9k/7d revenue tracked). No create-property step is needed — that memo is void. This scheme's remaining open items are the per-channel UTM stamping, the GATED Shopify discount codes, and marking the commerce/custom events as key events in GA4 Admin.",
"channels_connected": 7
},
"utm_convention": {
"case": "lowercase-kebab for campaign/content/term; lowercase for source/medium",
"encoding": "URL-encode all values; no spaces, no uppercase, no punctuation other than hyphen",
"params": {
"utm_source": "the channel key (facebook, instagram, tiktok, youtube, bluesky, threads, linkedin). One canonical token per platform — never 'fb', 'ig', 'yt' in the URL; the short forms are only used inside coupon codes.",
"utm_medium": "the traffic class. Controlled vocabulary: 'social' (organic feed/post), 'social-bio' (link-in-bio / profile link), 'social-story' (stories/reels/shorts swipe-ups), 'paid-social' (boosted/paid placements), 'social-dm' (direct-message / outreach links). Paid uses 'paid-social' so GA4 default-channel-grouping files it under Paid Social, not Organic Social.",
"utm_campaign": "campaign slug: <yyyy>-<qN>-<theme>, e.g. 2026-q3-elitis-launch, 2026-q3-staged-draft-drip, always-on-brand. Reuse the same slug across channels for one campaign so GA4 can compare channels within a campaign.",
"utm_content": "creative / placement variant for A/B and post-level attribution: <format>-<descriptor>, e.g. reel-grasscloth-bedroom, carousel-thibaut-5, pin-damask-hero. Optional but recommended.",
"utm_term": "reserved for paid keyword/audience on paid-social only; omit for organic."
},
"builder_template": "https://www.designerwallcoverings.com/{path}?utm_source={source}&utm_medium={medium}&utm_campaign={campaign}&utm_content={content}",
"notes": [
"Shopify preserves UTM params through to checkout and records them on the order (landing_site + referring params), so GA4 (client-side) AND Shopify (server-side order) both capture the same stamp.",
"For the ~50 sister-site microsite fleet used as a discovery network, add utm_source=<microsite-slug>&utm_medium=referral-microsite when they link into the flagship store — kept out of this file's per-channel table but same convention.",
"Always link to a canonical https://www.designerwallcoverings.com/... URL (not a myshopify.com URL) so cookies + GA4 hostname stay consistent."
]
},
"coupon_convention": {
"why": "Link-based UTM is lost on dark social, pasted links, and in-app browsers that strip query strings. A unique per-channel discount code is a second, redemption-based attribution path: the code itself names the channel at checkout, independent of any URL param.",
"format": "DW-<CHANNELCODE>-<OFFER>",
"channel_codes": {
"facebook": "FB",
"instagram": "IG",
"tiktok": "TT",
"youtube": "YT",
"bluesky": "BS",
"threads": "TH",
"linkedin": "LI"
},
"offer_tokens": {
"SAMPLE": "free / discounted memo sample offer",
"10": "10% off order",
"15": "15% off order",
"TRADE": "to-the-trade design-pro incentive (LinkedIn / B2B lean)"
},
"examples": ["DW-IG-10", "DW-TT-SAMPLE", "DW-LI-TRADE", "DW-YT-15"],
"rules": [
"One code per (channel x offer) so redemptions bucket cleanly by channel.",
"Codes are created as Shopify discount codes — GATED, drafted in pending-approval, never created live by this prep pass.",
"Report redemptions from Shopify Admin > Discounts, cross-referenced with GA4 coupon (item-level 'coupon' param on purchase events) for a two-source check.",
"Keep offer economics identical across channels within a campaign so channel comparison isn't confounded by a richer offer on one platform."
]
},
"channels": [
{
"key": "facebook",
"label": "Facebook Pages",
"connected": true,
"accounts": 80,
"profile": "https://www.facebook.com/DesignerWallcoverings/",
"utm_source": "facebook",
"utm_medium_default": "social",
"utm_medium_paid": "paid-social",
"coupon_code": "DW-FB-10",
"notes": "80 connected Pages (sister-site fleet). For per-Page attribution, extend utm_content with the page slug, e.g. utm_content=post-<pageslug>-<creative>. Meta strips fbclid but preserves utm_* on outbound link clicks."
},
{
"key": "instagram",
"label": "Instagram",
"connected": true,
"accounts": 34,
"profile": "https://www.instagram.com/designerwallcoverings/",
"utm_source": "instagram",
"utm_medium_default": "social-bio",
"utm_medium_story": "social-story",
"utm_medium_paid": "paid-social",
"coupon_code": "DW-IG-10",
"notes": "Primary click path is link-in-bio (social-bio) since feed posts aren't clickable; Stories/Reels use social-story. In-app browser frequently strips query params — the DW-IG-10 coupon is the reliable fallback attribution here. 34 accounts: use utm_content to carry the account handle if multi-account posting."
},
{
"key": "tiktok",
"label": "TikTok",
"connected": true,
"accounts": 1,
"profile": "https://www.tiktok.com/@designerwallcoverings",
"utm_source": "tiktok",
"utm_medium_default": "social-bio",
"utm_medium_paid": "paid-social",
"coupon_code": "DW-TT-SAMPLE",
"notes": "TikTok in-app browser is aggressive about stripping params — coupon attribution (DW-TT-SAMPLE) is essential. If TikTok Shop is later connected, that becomes its own server-side attribution surface separate from this UTM path."
},
{
"key": "youtube",
"label": "YouTube",
"connected": true,
"accounts": 1,
"profile": "https://www.youtube.com/@DesignerWallcoverings",
"utm_source": "youtube",
"utm_medium_default": "social",
"utm_medium_story": "social-story",
"utm_medium_paid": "paid-social",
"coupon_code": "DW-YT-15",
"notes": "Description links + pinned-comment links carry full UTM (YouTube preserves query strings). Shorts use social-story. Good candidate for utm_content=video-<slug> for per-video attribution."
},
{
"key": "bluesky",
"label": "Bluesky",
"connected": true,
"accounts": 1,
"profile": "",
"utm_source": "bluesky",
"utm_medium_default": "social",
"coupon_code": "DW-BS-10",
"notes": "Bluesky link cards preserve UTM. No paid surface — organic 'social' only. Low volume expected; still stamp so it's measurable rather than lumped into 'direct/unknown'."
},
{
"key": "threads",
"label": "Threads",
"connected": true,
"accounts": 1,
"profile": "",
"utm_source": "threads",
"utm_medium_default": "social",
"coupon_code": "DW-TH-10",
"notes": "Meta property; UTM preserved on outbound clicks but the Threads in-app browser can strip params, so DW-TH-10 backstops. Keep utm_source=threads distinct from facebook/instagram so Meta channels are separable in GA4."
},
{
"key": "linkedin",
"label": "LinkedIn",
"connected": true,
"accounts": 1,
"profile": "https://www.linkedin.com/company/designerwallcoverings/",
"utm_source": "linkedin",
"utm_medium_default": "social",
"utm_medium_paid": "paid-social",
"coupon_code": "DW-LI-TRADE",
"notes": "B2B / to-the-trade lean — offer token is TRADE (design-pro incentive) rather than a consumer % off. LinkedIn preserves UTM cleanly. Ideal for utm_campaign=always-on-trade + utm_content=article-<slug>."
}
],
"ga4_events_to_configure": {
"note": "Enhanced measurement covers page_view, scroll, outbound click, site search, video, file download automatically. The commerce events below must be sent by the Shopify theme's dataLayer/gtag and then marked as key events (conversions) in GA4 Admin. Configuration is GATED (memo a); this list is the spec for that config.",
"standard_ecommerce": ["view_item", "add_to_cart", "begin_checkout", "add_shipping_info", "add_payment_info", "purchase"],
"dw_custom": ["request_sample", "sample_added_to_cart", "trade_account_signup", "email_signup", "quote_request"],
"key_events_conversions": ["purchase", "request_sample", "begin_checkout", "trade_account_signup", "email_signup"],
"coupon_capture": "On the purchase event, pass the item-level/coupon field with the redeemed discount code (e.g. DW-IG-10) so GA4 attributes revenue to the channel by coupon, matching the coupon_convention above."
},
"reporting_views": [
"GA4 Traffic acquisition, grouped by Session source / medium — validates the utm_source/utm_medium taxonomy is landing correctly.",
"GA4 Free-form exploration: Session source/medium (dimension) x Key events + Purchase revenue (metrics) — the core social-to-revenue attribution table across all 7 channels.",
"Shopify Admin > Discounts: redemptions per DW-<CHANNEL>-<OFFER> code — the redemption-path cross-check.",
"Campaign roll-up: filter by utm_campaign to compare channels head-to-head within one campaign (e.g. 2026-q3-elitis-launch across FB/IG/TT/YT/LI)."
]
}