{
 "meta": {
  "appCount": 192,
  "categoryCount": 18,
  "priced": 49,
  "sourceRefreshed": "2026-05-16T00:00:00Z",
  "note": "Typical main-thread blocking each app adds on a mobile store. Directional figure from real-store audits and public benchmarks, not a lab measurement."
 },
 "categories": [
  {
   "name": "Analytics",
   "slug": "analytics",
   "count": 32,
   "medianTbt": 70
  },
  {
   "name": "BNPL",
   "slug": "bnpl",
   "count": 6,
   "medianTbt": 80
  },
  {
   "name": "Cart & Upsell",
   "slug": "cart-and-upsell",
   "count": 15,
   "medianTbt": 90
  },
  {
   "name": "Chat",
   "slug": "chat",
   "count": 14,
   "medianTbt": 150
  },
  {
   "name": "Consent & Privacy",
   "slug": "consent-and-privacy",
   "count": 9,
   "medianTbt": 90
  },
  {
   "name": "Currency",
   "slug": "currency",
   "count": 8,
   "medianTbt": 110
  },
  {
   "name": "Email & SMS",
   "slug": "email-and-sms",
   "count": 20,
   "medianTbt": 110
  },
  {
   "name": "Inventory",
   "slug": "inventory",
   "count": 6,
   "medianTbt": 50
  },
  {
   "name": "Logistics",
   "slug": "logistics",
   "count": 10,
   "medianTbt": 55
  },
  {
   "name": "Loyalty & Rewards",
   "slug": "loyalty-and-rewards",
   "count": 9,
   "medianTbt": 90
  },
  {
   "name": "Marketing",
   "slug": "marketing",
   "count": 7,
   "medianTbt": 60
  },
  {
   "name": "Page Builder",
   "slug": "page-builder",
   "count": 8,
   "medianTbt": 240
  },
  {
   "name": "Performance Proxy",
   "slug": "performance-proxy",
   "count": 5,
   "medianTbt": 70
  },
  {
   "name": "Personalization",
   "slug": "personalization",
   "count": 7,
   "medianTbt": 130
  },
  {
   "name": "Reviews",
   "slug": "reviews",
   "count": 11,
   "medianTbt": 110
  },
  {
   "name": "Search",
   "slug": "search",
   "count": 9,
   "medianTbt": 120
  },
  {
   "name": "Social",
   "slug": "social",
   "count": 6,
   "medianTbt": 170
  },
  {
   "name": "Subscriptions",
   "slug": "subscriptions",
   "count": 10,
   "medianTbt": 60
  }
 ],
 "apps": [
  {
   "id": "shogunfrontend",
   "name": "Shogun Frontend (Headless)",
   "cat": "Page Builder",
   "tbt": 340,
   "fix": "Headless frontend. Audit JS bundle aggressively.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "shogun",
   "name": "Shogun Page Builder",
   "cat": "Page Builder",
   "tbt": 320,
   "fix": "Heaviest category. Migrate to native Shopify sections + Liquid.",
   "priceFrom": 39,
   "priceTo": 499,
   "replace": {
    "label": "Native Shopify sections + Liquid",
    "href": "/blog/shopify-liquid-snippets-replace-apps/"
   }
  },
  {
   "id": "pagefly",
   "name": "PageFly",
   "cat": "Page Builder",
   "tbt": 280,
   "fix": "Heavy. Migrate critical templates to native sections.",
   "priceFrom": 0,
   "priceTo": 99,
   "replace": {
    "label": "Native Shopify sections + Liquid",
    "href": "/blog/shopify-liquid-snippets-replace-apps/"
   }
  },
  {
   "id": "yotpo",
   "name": "Yotpo Reviews",
   "cat": "Reviews",
   "tbt": 250,
   "fix": "Heaviest review widget. Consider Judge.me for native Liquid integration.",
   "priceFrom": 0,
   "priceTo": 700,
   "replace": {
    "label": "Judge.me (cleanest, $15)",
    "href": "/blog/shopify-liquid-snippets-replace-apps/"
   }
  },
  {
   "id": "gempages",
   "name": "GemPages",
   "cat": "Page Builder",
   "tbt": 240,
   "fix": "Heavy. Migrate to native Liquid sections.",
   "priceFrom": 0,
   "priceTo": 199,
   "replace": {
    "label": "Native Shopify sections + Liquid",
    "href": "/blog/shopify-liquid-snippets-replace-apps/"
   }
  },
  {
   "id": "vitals",
   "name": "Vitals 40+ Apps",
   "cat": "Personalization",
   "tbt": 240,
   "fix": "All-in-one suite. Each enabled module adds TBT. Audit which 5-10 you actually use; uninstall the rest.",
   "priceFrom": 29.99,
   "priceTo": 89.99,
   "replace": {
    "label": "Disable unused Vitals modules",
    "href": "/blog/shopify-cro-audit-checklist/"
   }
  },
  {
   "id": "bambuser",
   "name": "Bambuser Live Shopping",
   "cat": "Social",
   "tbt": 220,
   "fix": "Heavy WebRTC + video. Lazy-load player iframe; defer until in-viewport.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "ecomposer",
   "name": "EComposer",
   "cat": "Page Builder",
   "tbt": 220,
   "fix": "Newer page builder. Migrate critical pages to native sections.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "intercom",
   "name": "Intercom",
   "cat": "Chat",
   "tbt": 220,
   "fix": "Heaviest chat. Lazy-load via interaction.",
   "priceFrom": 74,
   "priceTo": 232,
   "replace": {
    "label": "Lazy-load on user interaction",
    "href": "/blog/shopify-core-web-vitals-optimization-2026/"
   }
  },
  {
   "id": "zipify",
   "name": "Zipify Pages",
   "cat": "Page Builder",
   "tbt": 220,
   "fix": "Heavy. Native sections preferred for landing pages.",
   "priceFrom": 79,
   "priceTo": 199,
   "replace": {
    "label": "Native Shopify sections",
    "href": "/blog/shopify-liquid-snippets-replace-apps/"
   }
  },
  {
   "id": "dynamicyield",
   "name": "Dynamic Yield",
   "cat": "Personalization",
   "tbt": 200,
   "fix": "Enterprise personalization. Audit experiment count, kill stale variants.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "fullstory",
   "name": "FullStory",
   "cat": "Analytics",
   "tbt": 200,
   "fix": "Heaviest session recorder. Sample aggressively or remove.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "teelaunch",
   "name": "Teelaunch POD",
   "cat": "Inventory",
   "tbt": 200,
   "fix": "Sizing-chart script measured at 1900ms eval on real audits. Scope to PDP only, defer.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "yottaa",
   "name": "Yottaa",
   "cat": "Performance Proxy",
   "tbt": 200,
   "fix": "Edge optimizer. Often masks JS bloat rather than fixing it. Audit Lighthouse before/after.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "builderio",
   "name": "Builder.io",
   "cat": "Page Builder",
   "tbt": 180,
   "fix": "Mostly headless; on Liquid stores audit JS bundle aggressively.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "drift",
   "name": "Drift Chat",
   "cat": "Chat",
   "tbt": 180,
   "fix": "B2B chat, heavy. Lazy-load via interaction.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "replo",
   "name": "Replo",
   "cat": "Page Builder",
   "tbt": 180,
   "fix": "Lighter than Shogun/PageFly but still adds JS overhead.",
   "priceFrom": 99,
   "priceTo": 399,
   "replace": {
    "label": "Native Shopify sections",
    "href": "/blog/shopify-liquid-snippets-replace-apps/"
   }
  },
  {
   "id": "stamped",
   "name": "Stamped.io",
   "cat": "Reviews",
   "tbt": 180,
   "fix": "Mid-heavy. Defer init below fold.",
   "priceFrom": 0,
   "priceTo": 349,
   "replace": {
    "label": "Defer + lazy-load below fold",
    "href": "/blog/shopify-core-web-vitals-optimization-2026/"
   }
  },
  {
   "id": "videowise",
   "name": "VideoWise Shoppable Video",
   "cat": "Social",
   "tbt": 180,
   "fix": "Heavy video player + UGC. Lazy-load player iframes; defer until in-viewport.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "wunderkind",
   "name": "Wunderkind (BounceX)",
   "cat": "Email & SMS",
   "tbt": 180,
   "fix": "Heavy identity-resolution stack. Audit if revenue lift covers TBT cost.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "firework",
   "name": "Firework Video",
   "cat": "Social",
   "tbt": 170,
   "fix": "Heavy video stack. Lazy-load and defer.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "nosto",
   "name": "Nosto Personalization",
   "cat": "Personalization",
   "tbt": 170,
   "fix": "Heavy AI recommendations. Lazy-load all placements below fold.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "zendesk",
   "name": "Zendesk Chat",
   "cat": "Chat",
   "tbt": 170,
   "fix": "Heavy. Lazy-load on user interaction.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "gladly",
   "name": "Gladly Helpdesk",
   "cat": "Chat",
   "tbt": 160,
   "fix": "Enterprise helpdesk. Idle-load via interaction.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "kustomer",
   "name": "Kustomer Chat",
   "cat": "Chat",
   "tbt": 160,
   "fix": "Enterprise helpdesk. Idle-load.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "limespot",
   "name": "LimeSpot Personalizer",
   "cat": "Cart & Upsell",
   "tbt": 160,
   "fix": "Heavy AI personalization stack. Lazy-load all widgets.",
   "priceFrom": 18,
   "priceTo": 499,
   "replace": {
    "label": "Lazy-load all widgets",
    "href": "/blog/shopify-core-web-vitals-optimization-2026/"
   }
  },
  {
   "id": "nostra",
   "name": "Nostra AI Speed",
   "cat": "Performance Proxy",
   "tbt": 160,
   "fix": "AI prefetch + edge. Test real Core Web Vitals, not vendor dashboard.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "okendo",
   "name": "Okendo",
   "cat": "Reviews",
   "tbt": 160,
   "fix": "Premium Shopify Plus reviews. Defer + lazy-load.",
   "priceFrom": 19,
   "priceTo": 799,
   "replace": {
    "label": "Defer + lazy-load below fold",
    "href": "/blog/shopify-core-web-vitals-optimization-2026/"
   }
  },
  {
   "id": "optimizely",
   "name": "Optimizely",
   "cat": "Analytics",
   "tbt": 160,
   "fix": "Heavy. Use async snippet, audit experiment count.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "tolstoy",
   "name": "Tolstoy Shoppable Video",
   "cat": "Social",
   "tbt": 160,
   "fix": "Lazy-load video player only when scrolled into view.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "gorgias",
   "name": "Gorgias",
   "cat": "Chat",
   "tbt": 150,
   "fix": "Idle-load until user scrolls or clicks bubble.",
   "priceFrom": 10,
   "priceTo": 1500,
   "replace": {
    "label": "Idle-load until scroll",
    "href": "/blog/shopify-core-web-vitals-optimization-2026/"
   }
  },
  {
   "id": "livechat",
   "name": "LiveChat",
   "cat": "Chat",
   "tbt": 150,
   "fix": "Idle-load.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "luckyorange",
   "name": "Lucky Orange",
   "cat": "Analytics",
   "tbt": 150,
   "fix": "Heavy session recorder + heatmaps. Sample 10-20%, not 100%.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "privy",
   "name": "Privy",
   "cat": "Email & SMS",
   "tbt": 150,
   "fix": "Replace with native Liquid email capture.",
   "priceFrom": 0,
   "priceTo": 79,
   "replace": {
    "label": "Native Liquid email capture",
    "href": "/blog/shopify-liquid-snippets-replace-apps/"
   }
  },
  {
   "id": "ada",
   "name": "Ada Chatbot",
   "cat": "Chat",
   "tbt": 140,
   "fix": "Idle-load chatbot script.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "bloomreach",
   "name": "Bloomreach Discovery",
   "cat": "Search",
   "tbt": 140,
   "fix": "Enterprise search/personalization. Defer below fold.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "globale",
   "name": "Global-e Cross-border",
   "cat": "Currency",
   "tbt": 140,
   "fix": "Heavy cross-border stack. Acceptable for global Plus stores; audit for unused markets.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "klevu",
   "name": "Klevu Search",
   "cat": "Search",
   "tbt": 140,
   "fix": "Heavy AI search. Worth it on 5K+ SKU stores; overkill below.",
   "priceFrom": 99,
   "priceTo": 999,
   "replace": {
    "label": "Test native Shopify search",
    "href": "/blog/shopify-onsite-search-optimization/"
   }
  },
  {
   "id": "loyaltylion",
   "name": "LoyaltyLion",
   "cat": "Loyalty & Rewards",
   "tbt": 140,
   "fix": "Heavy. Lazy-load launcher, defer rewards UI until idle.",
   "priceFrom": 199,
   "priceTo": 1500,
   "replace": null
  },
  {
   "id": "manychat",
   "name": "ManyChat",
   "cat": "Email & SMS",
   "tbt": 140,
   "fix": "Heavy chatbot stack. Idle-load.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "onetrust",
   "name": "OneTrust Cookie Consent",
   "cat": "Consent & Privacy",
   "tbt": 140,
   "fix": "Heavy CMP. Defer non-essential scripts behind consent gate, audit script-blocking config.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "rebuy",
   "name": "Rebuy Smart Cart",
   "cat": "Cart & Upsell",
   "tbt": 140,
   "fix": "Mid-heavy. Audit which widgets are actually used.",
   "priceFrom": 99,
   "priceTo": 749,
   "replace": {
    "label": "Audit widget usage",
    "href": "/blog/shopify-bundle-builder-without-app/"
   }
  },
  {
   "id": "tawkto",
   "name": "Tawk.to",
   "cat": "Chat",
   "tbt": 140,
   "fix": "Free tier widget. Idle-load.",
   "priceFrom": 0,
   "priceTo": 0,
   "replace": {
    "label": "Idle-load widget",
    "href": "/blog/shopify-core-web-vitals-optimization-2026/"
   }
  },
  {
   "id": "boost",
   "name": "Boost AI Search",
   "cat": "Search",
   "tbt": 130,
   "fix": "Heavy. Test if native search + tags can replace.",
   "priceFrom": 29,
   "priceTo": 299,
   "replace": {
    "label": "Test native Shopify search",
    "href": "/blog/shopify-onsite-search-optimization/"
   }
  },
  {
   "id": "growave",
   "name": "Growave",
   "cat": "Loyalty & Rewards",
   "tbt": 130,
   "fix": "All-in-one loyalty/wishlist/reviews. Heavy combined cost.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "justuno",
   "name": "Justuno",
   "cat": "Email & SMS",
   "tbt": 130,
   "fix": "Audit campaigns. Disable on every page that does not need a popup.",
   "priceFrom": 39,
   "priceTo": 999,
   "replace": {
    "label": "Native Liquid popup, fewer triggers",
    "href": "/blog/shopify-popups-killing-conversions/"
   }
  },
  {
   "id": "loox",
   "name": "Loox Photo Reviews",
   "cat": "Reviews",
   "tbt": 130,
   "fix": "Image-heavy carousel. Lazy-load images, defer init.",
   "priceFrom": 9.99,
   "priceTo": 199.99,
   "replace": {
    "label": "Lazy-load image carousel",
    "href": "/blog/shopify-core-web-vitals-optimization-2026/"
   }
  },
  {
   "id": "mparticle",
   "name": "mParticle CDP",
   "cat": "Analytics",
   "tbt": 130,
   "fix": "Enterprise CDP. Acceptable when it replaces multiple pixels; audit identity-sync calls.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "octaneai",
   "name": "Octane AI Quiz",
   "cat": "Cart & Upsell",
   "tbt": 130,
   "fix": "Quiz funnel. Lazy-load on quiz page only.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "recart",
   "name": "Recart SMS",
   "cat": "Email & SMS",
   "tbt": 130,
   "fix": "SMS popups + Messenger. Idle-load.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "searchspring",
   "name": "Searchspring",
   "cat": "Search",
   "tbt": 130,
   "fix": "Defer init. Audit beacon volume.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "tidio",
   "name": "Tidio",
   "cat": "Chat",
   "tbt": 130,
   "fix": "Idle-load. Avoid auto-open.",
   "priceFrom": 0,
   "priceTo": 749,
   "replace": {
    "label": "Idle-load, no auto-open",
    "href": "/blog/shopify-core-web-vitals-optimization-2026/"
   }
  },
  {
   "id": "visually",
   "name": "Visually.io A/B + Personalization",
   "cat": "Personalization",
   "tbt": 130,
   "fix": "Modern A/B + personalization. Acceptable when used; archive idle tests.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "vwo",
   "name": "VWO (A/B test)",
   "cat": "Analytics",
   "tbt": 130,
   "fix": "Synchronous A/B test scripts block render. Run async only.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "bluecore",
   "name": "Bluecore",
   "cat": "Email & SMS",
   "tbt": 120,
   "fix": "Behavioural email. Move pixel to GTM.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "boldmulticurrency",
   "name": "Bold Multi-Currency",
   "cat": "Currency",
   "tbt": 120,
   "fix": "Replace with Shopify Markets if on Plus.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "fastsimon",
   "name": "Fast Simon Search",
   "cat": "Search",
   "tbt": 120,
   "fix": "AI search. Defer below fold.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "helpscout",
   "name": "Help Scout Beacon",
   "cat": "Chat",
   "tbt": 120,
   "fix": "Idle-load. Lighter than full chat tools.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "ketch",
   "name": "Ketch CMP",
   "cat": "Consent & Privacy",
   "tbt": 120,
   "fix": "Enterprise-grade CMP, heavy. Worth it only at scale.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "klaviyo",
   "name": "Klaviyo",
   "cat": "Email & SMS",
   "tbt": 120,
   "fix": "Defer the popup script and lazy-load forms below the fold.",
   "priceFrom": 0,
   "priceTo": 1380,
   "replace": {
    "label": "Defer popup + lazy-load forms",
    "href": "/blog/shopify-popups-killing-conversions/"
   }
  },
  {
   "id": "reamaze",
   "name": "Re:amaze",
   "cat": "Chat",
   "tbt": 120,
   "fix": "Helpdesk + chat. Idle-load widget.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "reviewsio",
   "name": "Reviews.io",
   "cat": "Reviews",
   "tbt": 120,
   "fix": "Moderate. Defer below fold.",
   "priceFrom": 45,
   "priceTo": 449,
   "replace": {
    "label": "Defer init below fold",
    "href": "/blog/shopify-core-web-vitals-optimization-2026/"
   }
  },
  {
   "id": "smile",
   "name": "Smile.io Loyalty",
   "cat": "Loyalty & Rewards",
   "tbt": 120,
   "fix": "Lazy-load launcher. Defer until idle.",
   "priceFrom": 0,
   "priceTo": 1999,
   "replace": {
    "label": "Lazy-load launcher, defer until idle",
    "href": "/blog/shopify-core-web-vitals-optimization-2026/"
   }
  },
  {
   "id": "triplewhale",
   "name": "Triple Whale",
   "cat": "Analytics",
   "tbt": 120,
   "fix": "Heavy attribution + auto-decorate. Acceptable for paid-traffic stores; audit for duplicate pixels.",
   "priceFrom": 129,
   "priceTo": 499,
   "replace": {
    "label": "Defer pixel load",
    "href": "/blog/shopify-ga4-tracking-broken-fix/"
   }
  },
  {
   "id": "weglot",
   "name": "Weglot Translate",
   "cat": "Currency",
   "tbt": 120,
   "fix": "Replace with Shopify Markets translations on Plus.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "yotpoloyalty",
   "name": "Yotpo Loyalty (Swell)",
   "cat": "Loyalty & Rewards",
   "tbt": 120,
   "fix": "Lazy-load below fold.",
   "priceFrom": 0,
   "priceTo": 0,
   "replace": null
  },
  {
   "id": "attentive",
   "name": "Attentive (SMS)",
   "cat": "Email & SMS",
   "tbt": 110,
   "fix": "SMS popup heavy. Move to bottom-of-page trigger only.",
   "priceFrom": 700,
   "priceTo": 1500,
   "replace": {
    "label": "Move trigger to bottom of page",
    "href": "/blog/shopify-popups-killing-conversions/"
   }
  },
  {
   "id": "cookiebot",
   "name": "Cookiebot CMP",
   "cat": "Consent & Privacy",
   "tbt": 110,
   "fix": "Defer non-essential scripts. Use auto-block mode carefully (it pauses GTM until consent).",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "crisp",
   "name": "Crisp",
   "cat": "Chat",
   "tbt": 110,
   "fix": "Lightest of the chat group.",
   "priceFrom": 0,
   "priceTo": 95,
   "replace": null
  },
  {
   "id": "doofinder",
   "name": "Doofinder",
   "cat": "Search",
   "tbt": 110,
   "fix": "Defer init below fold.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "hotjar",
   "name": "Hotjar",
   "cat": "Analytics",
   "tbt": 110,
   "fix": "Heavy session recorder. Sample at 10-20% traffic, not 100%.",
   "priceFrom": 0,
   "priceTo": 171,
   "replace": {
    "label": "Switch to Microsoft Clarity (free)",
    "href": "/blog/shopify-core-web-vitals-optimization-2026/"
   }
  },
  {
   "id": "langify",
   "name": "Langify Translate",
   "cat": "Currency",
   "tbt": 110,
   "fix": "Migrate to Shopify native translations on Plus.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "listrak",
   "name": "Listrak",
   "cat": "Email & SMS",
   "tbt": 110,
   "fix": "Enterprise email. Defer popups.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "mouseflow",
   "name": "Mouseflow",
   "cat": "Analytics",
   "tbt": 110,
   "fix": "Session recording. Sample at 10-20%.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "oneclickupsell",
   "name": "One Click Upsell (Zipify)",
   "cat": "Cart & Upsell",
   "tbt": 110,
   "fix": "Post-purchase pages only.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "optimonk",
   "name": "OptiMonk Popups",
   "cat": "Email & SMS",
   "tbt": 110,
   "fix": "Audit campaigns running per page.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "trustpilot",
   "name": "Trustpilot Widget",
   "cat": "Reviews",
   "tbt": 110,
   "fix": "Defer init.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "algolia",
   "name": "Algolia Search",
   "cat": "Search",
   "tbt": 100,
   "fix": "Premium search. Worth it on 5K+ SKU stores.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "boldsubs",
   "name": "Bold Subscriptions",
   "cat": "Subscriptions",
   "tbt": 100,
   "fix": "Older Bold codebase, audit for newer alternatives.",
   "priceFrom": 49.99,
   "priceTo": 199,
   "replace": {
    "label": "Migrate to Skio or Loop",
    "href": "/blog/recharge-vs-skio-vs-loop-shopify-subscriptions/"
   }
  },
  {
   "id": "boldupsell",
   "name": "Bold Upsell",
   "cat": "Cart & Upsell",
   "tbt": 100,
   "fix": "Mid-heavy. Test post-purchase flow only.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "fera",
   "name": "Fera Reviews",
   "cat": "Reviews",
   "tbt": 100,
   "fix": "Lazy-load below fold.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "foursixty",
   "name": "Foursixty (Instagram)",
   "cat": "Social",
   "tbt": 100,
   "fix": "Lazy-load gallery.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "intelligems",
   "name": "Intelligems Pricing A/B",
   "cat": "Personalization",
   "tbt": 100,
   "fix": "Price + content testing. Defer until interactive where possible.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "omnisend",
   "name": "Omnisend",
   "cat": "Email & SMS",
   "tbt": 100,
   "fix": "Defer form scripts, audit popup triggers.",
   "priceFrom": 0,
   "priceTo": 500,
   "replace": {
    "label": "Defer form scripts",
    "href": "/blog/shopify-core-web-vitals-optimization-2026/"
   }
  },
  {
   "id": "osano",
   "name": "Osano CMP",
   "cat": "Consent & Privacy",
   "tbt": 100,
   "fix": "Defer non-critical pixels until consent.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "searchanise",
   "name": "Searchanise",
   "cat": "Search",
   "tbt": 100,
   "fix": "Replace with native Shopify search if catalog is small.",
   "priceFrom": 19,
   "priceTo": 299,
   "replace": {
    "label": "Native search + tags",
    "href": "/blog/shopify-onsite-search-optimization/"
   }
  },
  {
   "id": "sendlane",
   "name": "Sendlane",
   "cat": "Email & SMS",
   "tbt": 100,
   "fix": "Defer popup, audit identify calls.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "smsbump",
   "name": "Yotpo SMSBump",
   "cat": "Email & SMS",
   "tbt": 100,
   "fix": "Audit campaigns, defer popups.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "affirm",
   "name": "Affirm BNPL",
   "cat": "BNPL",
   "tbt": 90,
   "fix": "Defer. Show only on PDP/cart, not navigation.",
   "priceFrom": 0,
   "priceTo": 0,
   "replace": null
  },
  {
   "id": "cookieyes",
   "name": "CookieYes",
   "cat": "Consent & Privacy",
   "tbt": 90,
   "fix": "Lighter than OneTrust. Acceptable for non-Plus stores.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "frequentlybought",
   "name": "Frequently Bought Together",
   "cat": "Cart & Upsell",
   "tbt": 90,
   "fix": "Lazy-load below fold.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "heap",
   "name": "Heap Analytics",
   "cat": "Analytics",
   "tbt": 90,
   "fix": "Auto-capture is heavy. Audit event volume.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "incartupsell",
   "name": "In Cart Upsell",
   "cat": "Cart & Upsell",
   "tbt": 90,
   "fix": "Defer below fold.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "instafeed",
   "name": "Instafeed (Instagram)",
   "cat": "Social",
   "tbt": 90,
   "fix": "Defer init below fold.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "iterable",
   "name": "Iterable",
   "cat": "Email & SMS",
   "tbt": 90,
   "fix": "Enterprise email/CRM. Defer popup, audit identify volume.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "junip",
   "name": "Junip Reviews",
   "cat": "Reviews",
   "tbt": 90,
   "fix": "Modern reviews stack, lighter than Yotpo.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "klarna",
   "name": "Klarna BNPL",
   "cat": "BNPL",
   "tbt": 90,
   "fix": "Defer BNPL widget below the fold. Render only on PDP / cart, not site-wide.",
   "priceFrom": 0,
   "priceTo": 0,
   "replace": null
  },
  {
   "id": "lantern",
   "name": "Lantern AI Quiz",
   "cat": "Cart & Upsell",
   "tbt": 90,
   "fix": "Lazy-load on quiz pages only.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "postscript",
   "name": "Postscript (SMS)",
   "cat": "Email & SMS",
   "tbt": 90,
   "fix": "Defer popup, single-page-load only.",
   "priceFrom": 0,
   "priceTo": 1500,
   "replace": {
    "label": "Defer popup script",
    "href": "/blog/shopify-popups-killing-conversions/"
   }
  },
  {
   "id": "quizell",
   "name": "Quizell Quiz",
   "cat": "Cart & Upsell",
   "tbt": 90,
   "fix": "Lazy-load on quiz pages only.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "reconvert",
   "name": "ReConvert Upsell",
   "cat": "Cart & Upsell",
   "tbt": 90,
   "fix": "Post-purchase only - acceptable cost.",
   "priceFrom": 0,
   "priceTo": 29.99,
   "replace": null
  },
  {
   "id": "rockerbox",
   "name": "Rockerbox Attribution",
   "cat": "Analytics",
   "tbt": 90,
   "fix": "Move tracker to GTM, defer.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "shopifyinbox",
   "name": "Shopify Inbox",
   "cat": "Chat",
   "tbt": 90,
   "fix": "Native Shopify, lighter than third-party. Acceptable.",
   "priceFrom": 0,
   "priceTo": 0,
   "replace": null
  },
  {
   "id": "wisepops",
   "name": "Wisepops",
   "cat": "Email & SMS",
   "tbt": 90,
   "fix": "Defer popup script. Single trigger only.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "wishlistplus",
   "name": "Wishlist Plus",
   "cat": "Loyalty & Rewards",
   "tbt": 90,
   "fix": "Defer below fold.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "zonos",
   "name": "Zonos Duty + Tax",
   "cat": "Currency",
   "tbt": 90,
   "fix": "Acceptable for cross-border merchants.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "accentuate",
   "name": "Accentuate Custom Fields",
   "cat": "Personalization",
   "tbt": 80,
   "fix": "Inject custom-field renderer. Acceptable; audit usage.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "afterpay",
   "name": "Afterpay / Clearpay",
   "cat": "BNPL",
   "tbt": 80,
   "fix": "Defer below fold. Show only on PDP/cart.",
   "priceFrom": 0,
   "priceTo": 0,
   "replace": null
  },
  {
   "id": "airreviews",
   "name": "Air Reviews (Avada)",
   "cat": "Reviews",
   "tbt": 80,
   "fix": "Avada bundle is heavy. Defer below fold.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "amplitude",
   "name": "Amplitude",
   "cat": "Analytics",
   "tbt": 80,
   "fix": "Product analytics. Move to GTM.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "appstle",
   "name": "Appstle Subscriptions",
   "cat": "Subscriptions",
   "tbt": 80,
   "fix": "Acceptable for subscription stores.",
   "priceFrom": 0,
   "priceTo": 100,
   "replace": null
  },
  {
   "id": "consentmo",
   "name": "Consentmo GDPR",
   "cat": "Consent & Privacy",
   "tbt": 80,
   "fix": "Acceptable Shopify-native CMP. Audit categories.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "crazyegg",
   "name": "Crazy Egg",
   "cat": "Analytics",
   "tbt": 80,
   "fix": "Lighter heatmap option. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "globofilter",
   "name": "Globo Smart Product Filter",
   "cat": "Search",
   "tbt": 80,
   "fix": "Filter rendering blocks PLP. Audit facet count, defer where possible.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "hellobar",
   "name": "Hello Bar Popup",
   "cat": "Email & SMS",
   "tbt": 80,
   "fix": "Defer popup loader. Single campaign per page.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "impact",
   "name": "Impact.com Affiliate",
   "cat": "Marketing",
   "tbt": 80,
   "fix": "Defer pixel via GTM.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "iubenda",
   "name": "Iubenda CMP",
   "cat": "Consent & Privacy",
   "tbt": 80,
   "fix": "EU-favoured CMP. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "judgeme",
   "name": "Judge.me",
   "cat": "Reviews",
   "tbt": 80,
   "fix": "Acceptable. Lazy-load the carousel below the fold.",
   "priceFrom": 0,
   "priceTo": 75,
   "replace": null
  },
  {
   "id": "mixpanel",
   "name": "Mixpanel",
   "cat": "Analytics",
   "tbt": 80,
   "fix": "Product analytics. Move to GTM if not already.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "northbeam",
   "name": "Northbeam",
   "cat": "Analytics",
   "tbt": 80,
   "fix": "Attribution pixel. Move to GTM thank-you trigger.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "rivo",
   "name": "Rivo",
   "cat": "Loyalty & Rewards",
   "tbt": 80,
   "fix": "Modern, lighter alternative. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "selleasy",
   "name": "Selleasy",
   "cat": "Cart & Upsell",
   "tbt": 80,
   "fix": "Lazy-load below fold.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "shopquiz",
   "name": "Shop Quiz (RevenueHunt)",
   "cat": "Cart & Upsell",
   "tbt": 80,
   "fix": "Lazy-load on quiz pages only.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "trustpulse",
   "name": "TrustPulse",
   "cat": "Loyalty & Rewards",
   "tbt": 80,
   "fix": "Social-proof popups; audit campaigns.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "upcart",
   "name": "UpCart",
   "cat": "Cart & Upsell",
   "tbt": 80,
   "fix": "Modern slide cart. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "avadaseo",
   "name": "Avada SEO Suite",
   "cat": "Performance Proxy",
   "tbt": 70,
   "fix": "Marketed as perf, but injects runtime image-lazy + meta. Audit for duplicate JSON-LD.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "boosterseo",
   "name": "Booster SEO & Image Optimizer",
   "cat": "Performance Proxy",
   "tbt": 70,
   "fix": "Same as Avada: adds overhead in the name of perf. Audit before keeping.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "brevo",
   "name": "Brevo (Sendinblue)",
   "cat": "Email & SMS",
   "tbt": 70,
   "fix": "Move pixel to GTM, defer.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "enzuzo",
   "name": "Enzuzo Privacy",
   "cat": "Consent & Privacy",
   "tbt": 70,
   "fix": "Acceptable. Single small banner.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "goaffpro",
   "name": "GoAffPro",
   "cat": "Marketing",
   "tbt": 70,
   "fix": "Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "mailchimp",
   "name": "Mailchimp",
   "cat": "Email & SMS",
   "tbt": 70,
   "fix": "Lighter than Klaviyo. Acceptable.",
   "priceFrom": 0,
   "priceTo": 350,
   "replace": null
  },
  {
   "id": "segment",
   "name": "Segment",
   "cat": "Analytics",
   "tbt": 70,
   "fix": "CDP. Acceptable if it replaces multiple individual pixels.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "sezzle",
   "name": "Sezzle BNPL",
   "cat": "BNPL",
   "tbt": 70,
   "fix": "Defer. PDP/cart only.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "skio",
   "name": "Skio",
   "cat": "Subscriptions",
   "tbt": 70,
   "fix": "Modern subscriptions stack. Acceptable.",
   "priceFrom": 99,
   "priceTo": 999,
   "replace": null
  },
  {
   "id": "termly",
   "name": "Termly CMP",
   "cat": "Consent & Privacy",
   "tbt": 70,
   "fix": "Acceptable lightweight CMP.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "tiktokpixel",
   "name": "TikTok Pixel",
   "cat": "Analytics",
   "tbt": 70,
   "fix": "Move to GTM and conditionally load.",
   "priceFrom": 0,
   "priceTo": 0,
   "replace": {
    "label": "Move to GTM, conditional load",
    "href": "/blog/shopify-ga4-tracking-broken-fix/"
   }
  },
  {
   "id": "zip",
   "name": "Zip Pay BNPL",
   "cat": "BNPL",
   "tbt": 70,
   "fix": "Defer. PDP/cart only.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "loopsubs",
   "name": "Loop Subscriptions",
   "cat": "Subscriptions",
   "tbt": 65,
   "fix": "Acceptable for subscription-driven stores.",
   "priceFrom": 150,
   "priceTo": 999,
   "replace": null
  },
  {
   "id": "aftersell",
   "name": "AfterSell Post-Purchase",
   "cat": "Cart & Upsell",
   "tbt": 60,
   "fix": "Post-purchase only; acceptable cost.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "aftership",
   "name": "AfterShip Tracking",
   "cat": "Logistics",
   "tbt": 60,
   "fix": "Lazy-load. Tracking page only, not site-wide.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "beamimpact",
   "name": "Beam Impact",
   "cat": "Marketing",
   "tbt": 60,
   "fix": "Charity widget. Lazy-load on cart only.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "delighted",
   "name": "Delighted NPS",
   "cat": "Analytics",
   "tbt": 60,
   "fix": "Defer. Sample subset of users.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "easyship",
   "name": "Easyship",
   "cat": "Logistics",
   "tbt": 60,
   "fix": "Lazy-load on cart only.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "gelato",
   "name": "Gelato POD",
   "cat": "Inventory",
   "tbt": 60,
   "fix": "Embedded designer. Backend-heavy, frontend acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "happyreturns",
   "name": "Happy Returns",
   "cat": "Logistics",
   "tbt": 60,
   "fix": "Lazy-load on returns flow only.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "hulkwishlist",
   "name": "Hulk Advanced Wishlist",
   "cat": "Loyalty & Rewards",
   "tbt": 60,
   "fix": "Defer below fold.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "keepcart",
   "name": "KeepCart Coupon Protection",
   "cat": "Cart & Upsell",
   "tbt": 60,
   "fix": "Coupon-leak guard. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "lifetimely",
   "name": "Lifetimely (Triple Whale)",
   "cat": "Analytics",
   "tbt": 60,
   "fix": "LTV analytics. Move pixel to GTM.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "littledata",
   "name": "Littledata Tracker",
   "cat": "Analytics",
   "tbt": 60,
   "fix": "Server-side tracking proxy. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "metapixel",
   "name": "Meta Pixel (Facebook)",
   "cat": "Analytics",
   "tbt": 60,
   "fix": "Standard. Move to GTM if not already.",
   "priceFrom": 0,
   "priceTo": 0,
   "replace": {
    "label": "Move to GTM if not already",
    "href": "/blog/shopify-ga4-tracking-broken-fix/"
   }
  },
  {
   "id": "narvar",
   "name": "Narvar Tracking",
   "cat": "Logistics",
   "tbt": 60,
   "fix": "Lazy-load. Tracking page only.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "recharge",
   "name": "Recharge",
   "cat": "Subscriptions",
   "tbt": 60,
   "fix": "Necessary if subscriptions are core. Acceptable cost.",
   "priceFrom": 99,
   "priceTo": 1500,
   "replace": null
  },
  {
   "id": "refersion",
   "name": "Refersion Affiliate",
   "cat": "Marketing",
   "tbt": 60,
   "fix": "Lightweight tracker. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "shopifygeolocation",
   "name": "Shopify Geolocation App",
   "cat": "Currency",
   "tbt": 60,
   "fix": "Native Shopify, lighter than third-party currency apps.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "smartrr",
   "name": "Smartrr Subscriptions",
   "cat": "Subscriptions",
   "tbt": 60,
   "fix": "Premium subscriptions. Acceptable for high-AOV DTC.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "tinyimg",
   "name": "TinyIMG SEO + Image",
   "cat": "Performance Proxy",
   "tbt": 60,
   "fix": "Lazy-load runtime injection. Acceptable, but verify duplicate compression.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "trustoo",
   "name": "Trustoo Reviews",
   "cat": "Reviews",
   "tbt": 60,
   "fix": "Lighter Channelwill review widget. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "wishlistking",
   "name": "Wishlist King",
   "cat": "Loyalty & Rewards",
   "tbt": 60,
   "fix": "Defer below fold.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "awtomic",
   "name": "Awtomic Subscriptions",
   "cat": "Subscriptions",
   "tbt": 55,
   "fix": "Build-a-box / bundles + subscriptions. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "returngo",
   "name": "ReturnGO",
   "cat": "Logistics",
   "tbt": 55,
   "fix": "Lazy-load on returns page only.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "subify",
   "name": "Subify Subscriptions",
   "cat": "Subscriptions",
   "tbt": 55,
   "fix": "Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "bestcurrency",
   "name": "BEST Currency Converter (Grizzly)",
   "cat": "Currency",
   "tbt": 50,
   "fix": "Replace with Shopify Markets on Plus.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "dsers",
   "name": "DSers Dropshipping",
   "cat": "Inventory",
   "tbt": 50,
   "fix": "Backend app, minimal frontend bloat. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "ga4",
   "name": "Google Analytics 4 (standalone)",
   "cat": "Analytics",
   "tbt": 50,
   "fix": "Acceptable. Move to GTM if you have multiple analytics tools.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "gtm",
   "name": "Google Tag Manager",
   "cat": "Analytics",
   "tbt": 50,
   "fix": "GTM itself is light. Audit container for hidden pixels and custom HTML tags.",
   "priceFrom": 0,
   "priceTo": 0,
   "replace": {
    "label": "Audit container, kill unused tags",
    "href": "/blog/shopify-ga4-tracking-broken-fix/"
   }
  },
  {
   "id": "hextomcurrency",
   "name": "Hextom Currency Converter",
   "cat": "Currency",
   "tbt": 50,
   "fix": "Replace with Shopify Markets on Plus.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "kno",
   "name": "KnoCommerce / Fairing",
   "cat": "Analytics",
   "tbt": 50,
   "fix": "Post-purchase only. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "linkedinpixel",
   "name": "LinkedIn Insight Tag",
   "cat": "Analytics",
   "tbt": 50,
   "fix": "B2B pixel. Move to GTM if used.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "locksmith",
   "name": "Locksmith (Content Lock)",
   "cat": "Personalization",
   "tbt": 50,
   "fix": "Backend gating, frontend acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "loopreturns",
   "name": "Loop Returns",
   "cat": "Logistics",
   "tbt": 50,
   "fix": "Lazy-load. Returns portal only, not site-wide.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "clarity",
   "name": "Microsoft Clarity",
   "cat": "Analytics",
   "tbt": 50,
   "fix": "Lighter than Hotjar. Acceptable.",
   "priceFrom": 0,
   "priceTo": 0,
   "replace": null
  },
  {
   "id": "nofraud",
   "name": "NoFraud",
   "cat": "Analytics",
   "tbt": 50,
   "fix": "Fraud-screening pixel. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "parcelpanel",
   "name": "ParcelPanel Tracking",
   "cat": "Logistics",
   "tbt": 50,
   "fix": "Lazy-load. Tracking page only.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "pinterest",
   "name": "Pinterest Tag",
   "cat": "Analytics",
   "tbt": 50,
   "fix": "Move to GTM, defer.",
   "priceFrom": 0,
   "priceTo": 0,
   "replace": {
    "label": "Move to GTM, defer",
    "href": "/blog/shopify-ga4-tracking-broken-fix/"
   }
  },
  {
   "id": "polaranalytics",
   "name": "Polar Analytics",
   "cat": "Analytics",
   "tbt": 50,
   "fix": "BI dashboard, mostly backend. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "printful",
   "name": "Printful POD",
   "cat": "Inventory",
   "tbt": 50,
   "fix": "Backend integration. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "printify",
   "name": "Printify POD",
   "cat": "Inventory",
   "tbt": 50,
   "fix": "Backend integration. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "redditpixel",
   "name": "Reddit Pixel",
   "cat": "Analytics",
   "tbt": 50,
   "fix": "Move to GTM, defer.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "shareasale",
   "name": "ShareASale",
   "cat": "Marketing",
   "tbt": 50,
   "fix": "Conversion pixel. Move to GTM thank-you trigger.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "spocket",
   "name": "Spocket",
   "cat": "Inventory",
   "tbt": 50,
   "fix": "Backend, acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "stayai",
   "name": "Stay AI Subscriptions",
   "cat": "Subscriptions",
   "tbt": 50,
   "fix": "AI churn-prediction subscriptions. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "sealsubs",
   "name": "Seal Subscriptions",
   "cat": "Subscriptions",
   "tbt": 45,
   "fix": "Lightweight. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "sentry",
   "name": "Sentry Error Monitoring",
   "cat": "Analytics",
   "tbt": 40,
   "fix": "Error monitor. Acceptable, lazy-load if not on critical path.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "shipbob",
   "name": "ShipBob",
   "cat": "Logistics",
   "tbt": 40,
   "fix": "Backend, no frontend impact. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "shippo",
   "name": "Shippo",
   "cat": "Logistics",
   "tbt": 40,
   "fix": "Backend, acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "shipstation",
   "name": "ShipStation",
   "cat": "Logistics",
   "tbt": 40,
   "fix": "Backend, acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "snap",
   "name": "Snap Pixel",
   "cat": "Analytics",
   "tbt": 40,
   "fix": "Move to GTM if used.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "socialsnowball",
   "name": "Social Snowball Affiliate",
   "cat": "Marketing",
   "tbt": 40,
   "fix": "Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "uppromote",
   "name": "UpPromote Affiliate",
   "cat": "Marketing",
   "tbt": 40,
   "fix": "Lightweight tracker. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "shoppay",
   "name": "Shop Pay Installments",
   "cat": "BNPL",
   "tbt": 30,
   "fix": "Native Shopify, lighter than third-party BNPL. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "shopifyemail",
   "name": "Shopify Email",
   "cat": "Email & SMS",
   "tbt": 30,
   "fix": "Native Shopify, lightweight. Acceptable.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  },
  {
   "id": "trackjs",
   "name": "TrackJS",
   "cat": "Analytics",
   "tbt": 30,
   "fix": "Error monitor. Acceptable, async by default.",
   "priceFrom": null,
   "priceTo": null,
   "replace": null
  }
 ]
}
