← 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)."
  ]
}