<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rishabh Sethia</title>
    <description>The latest articles on DEV Community by Rishabh Sethia (@emperorakashi20).</description>
    <link>https://dev.to/emperorakashi20</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3847833%2F41bf34d3-a777-4841-8960-e0894ee30f13.jpeg</url>
      <title>DEV Community: Rishabh Sethia</title>
      <link>https://dev.to/emperorakashi20</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/emperorakashi20"/>
    <language>en</language>
    <item>
      <title>Shopify Speed Optimization: How We Improved Core Web Vitals and Boosted Conversions</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Thu, 30 Jul 2026 04:30:01 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/shopify-speed-optimization-how-we-improved-core-web-vitals-and-boosted-conversions-1462</link>
      <guid>https://dev.to/emperorakashi20/shopify-speed-optimization-how-we-improved-core-web-vitals-and-boosted-conversions-1462</guid>
      <description>&lt;p&gt;FloraSoul India had a problem that's more common than most D2C founders realise: a visually stunning Shopify store with a mobile conversion rate that didn't reflect the quality of the product or the brand.&lt;/p&gt;

&lt;p&gt;When they came to us, the store had been live for several months. Traffic was healthy. The product photography was excellent. The brand story was compelling. But mobile conversion sat below 1%.&lt;/p&gt;

&lt;p&gt;We ran the audit. Within 20 minutes, we'd identified four issues that any experienced frontend engineer would spot immediately. None of them required a redesign. None required switching themes or moving to headless. They required clean engineering — the kind that page builder tools and agency generalists tend to leave undone.&lt;/p&gt;

&lt;p&gt;The outcome: &lt;strong&gt;+41% mobile conversion lift&lt;/strong&gt; after fixes were shipped. This tutorial walks through exactly what we found, why each issue mattered, and the specific code fixes we applied.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Diagnostic Stack We Use
&lt;/h2&gt;

&lt;p&gt;Before writing a single line of fix code, we run a structured diagnostic. Three tools, in order:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Google PageSpeed Insights&lt;/strong&gt; — Field data (CrUX) shows real-user performance. Lab data shows what's fixable. The "Opportunities" and "Diagnostics" sections are your starting point. Always test the product page URL, not just the homepage — product pages are where mobile conversion happens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Shopify Theme Inspector&lt;/strong&gt; — A Chrome extension that profiles Liquid template render time section-by-section. It tells you which parts of your theme are slow to render on Shopify's servers, before a single byte hits the browser. Most developers never use this. It's the Shopify-specific tool that cuts hours off a performance audit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Chrome DevTools Performance tab&lt;/strong&gt; — For deep INP and long task analysis. Record a typical user interaction (page load → product page → add to cart) and review the flame chart. Long tasks blocking the main thread for 50ms+ are your INP killers.&lt;/p&gt;

&lt;p&gt;As a &lt;a href="https://dev.to/services/shopify"&gt;Shopify Partner&lt;/a&gt;, we also have access to Shopify's internal theme performance guidelines — which give us a higher ceiling on what "optimised" actually means for a given theme architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Issue 1: Render-Blocking Animation Library
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What we found:&lt;/strong&gt; FloraSoul's theme was loading an animation library (&lt;code&gt;animate.css&lt;/code&gt; + a custom JS animation controller) synchronously in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; of &lt;code&gt;theme.liquid&lt;/code&gt;. The library was being used for subtle product card entrance animations — a nice visual touch, but not critical to the page rendering path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Scripts and stylesheets loaded synchronously in &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; block the browser from rendering anything below them until they've fully downloaded, parsed, and executed. On a mobile device on a 4G connection, a 180KB animation library can add 1.2-2 seconds to Time to First Contentful Paint. The user stares at a blank screen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; We moved the animation script to load with &lt;code&gt;defer&lt;/code&gt;, which tells the browser to download it in parallel but not execute it until after the page has parsed. We also lazy-loaded &lt;code&gt;animate.css&lt;/code&gt; via a &lt;code&gt;&amp;lt;link rel="preload"&amp;gt;&lt;/code&gt; with &lt;code&gt;onload&lt;/code&gt; swap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Before: blocking --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"animate.min.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"animations.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- After: non-blocking --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"preload"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"animate.min.css"&lt;/span&gt; &lt;span class="na"&gt;as=&lt;/span&gt;&lt;span class="s"&gt;"style"&lt;/span&gt; &lt;span class="na"&gt;onload=&lt;/span&gt;&lt;span class="s"&gt;"this.onload=null;this.rel='stylesheet'"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;noscript&amp;gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"animate.min.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/noscript&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"animations.js"&lt;/span&gt; &lt;span class="na"&gt;defer&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; FCP dropped by approximately 1.4 seconds on mobile. The animations still work — they initialise ~300ms after page paint, which is imperceptible to users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Issue 2: LCP Image Not Preloaded
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What we found:&lt;/strong&gt; The hero product image on every product page — the Largest Contentful Paint element — was being loaded as a regular &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag with &lt;code&gt;loading="lazy"&lt;/code&gt;. This is one of the most common LCP performance mistakes we encounter, and it directly contradicts Google's guidance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; &lt;code&gt;loading="lazy"&lt;/code&gt; tells the browser to defer loading this image until it's near the viewport. For the LCP image, which is by definition in the viewport on load, this delays the most important paint event on the page. Combined with no preload hint, the browser discovers the LCP image only after it has parsed the full HTML — wasting critical connection time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; We identified the LCP image in the product template (&lt;code&gt;sections/main-product.liquid&lt;/code&gt;) and added an explicit preload hint in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; and removed &lt;code&gt;loading="lazy"&lt;/code&gt; from the primary image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight liquid"&gt;&lt;code&gt;&lt;span class="cp"&gt;{%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;comment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="c"&gt; In theme.liquid &amp;lt;head&amp;gt;, injected via section schema: &lt;/span&gt;&lt;span class="cp"&gt;{%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;endcomment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;span class="cp"&gt;{%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;template&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'product'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt;
  &amp;lt;link
    rel="preload"
    as="image"
    href="&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;featured_image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;img_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'1200x'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;"
    imagesrcset="&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;featured_image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;img_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'400x'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt; 400w,
                 &lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;featured_image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;img_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'800x'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt; 800w,
                 &lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;featured_image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;img_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'1200x'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt; 1200w"
    imagesizes="(max-width: 768px) 100vw, 50vw"
  &amp;gt;
&lt;span class="cp"&gt;{%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;endif&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And in the product image template, the primary image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight liquid"&gt;&lt;code&gt;&amp;lt;img
  src="&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;featured_image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;img_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'800x'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;"
  srcset="&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;featured_image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;img_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'400x'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt; 400w,
          &lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;featured_image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;img_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'800x'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt; 800w,
          &lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;featured_image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;img_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'1200x'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt; 1200w"
  sizes="(max-width: 768px) 100vw, 50vw"
  alt="&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;featured_image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;alt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;escape&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;"
  width="800"
  height="800"
  fetchpriority="high"
  &lt;span class="cp"&gt;{%-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;comment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="c"&gt; No loading=lazy on LCP image &lt;/span&gt;&lt;span class="cp"&gt;{%-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;endcomment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt;
&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Secondary images in the gallery kept &lt;code&gt;loading="lazy"&lt;/code&gt; since they're below the fold.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; LCP on mobile moved from 4.1 seconds to 2.3 seconds — crossing the "Good" threshold for the first time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Issue 3: Oversized Product Images Without srcset
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What we found:&lt;/strong&gt; All product images were being served at their original upload resolution — averaging 2400x2400px at 1.8MB per image. Mobile devices were downloading desktop-sized images and then scaling them down via CSS. On a product page with 6 images, that's over 10MB of image data downloaded before the user has seen a single product detail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Image weight is the single largest contributor to slow LCP and high Total Blocking Time on Shopify product pages. Shopify's CDN serves WebP automatically, but it serves the full resolution unless you specify a resize in the URL. Without &lt;code&gt;srcset&lt;/code&gt;, every device gets the largest image.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; We applied &lt;code&gt;srcset&lt;/code&gt; across all product image elements (the gallery, thumbnails, and zoom view), using Shopify's built-in image URL filter to request device-appropriate sizes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight liquid"&gt;&lt;code&gt;&lt;span class="cp"&gt;{%-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;images&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;-%}&lt;/span&gt;
  &amp;lt;img
    src="&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;img_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'600x'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;"
    srcset="&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;img_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'300x'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt; 300w,
            &lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;img_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'600x'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt; 600w,
            &lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;img_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'1200x'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt; 1200w"
    sizes="(max-width: 480px) 90vw,
           (max-width: 900px) 50vw,
           40vw"
    alt="&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;alt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;escape&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;"
    width="600"
    height="600"
    loading="&lt;span class="cp"&gt;{%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;forloop.first&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt;eager&lt;span class="cp"&gt;{%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt;lazy&lt;span class="cp"&gt;{%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;endif&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt;"
  &amp;gt;
&lt;span class="cp"&gt;{%-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;endfor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;-%}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note the &lt;code&gt;forloop.first&lt;/code&gt; logic: the first image gets &lt;code&gt;loading="eager"&lt;/code&gt; (matching the &lt;code&gt;fetchpriority="high"&lt;/code&gt; LCP fix), all subsequent gallery images get &lt;code&gt;loading="lazy"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Median image payload on product pages dropped from 10.2MB to 1.4MB on mobile. Visible page weight in DevTools Network tab went from 12.8MB to 2.1MB total for an average product page load.&lt;/p&gt;

&lt;h2&gt;
  
  
  Issue 4: Third-Party Tracking Scripts Firing Synchronously
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What we found:&lt;/strong&gt; FloraSoul had five tracking integrations installed: Facebook Pixel, Google Analytics 4, a heatmap tool, an email capture popup, and a WhatsApp chat widget. All five were being injected into &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; as synchronous scripts, either by apps or by manual snippet additions to &lt;code&gt;theme.liquid&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Each synchronous third-party script is a single point of failure for your entire page render. If any one of these services has a slow response (which happens regularly with ad tracking endpoints), your page waits. Combined, five synchronous tracking scripts were adding 800ms-1.2 seconds of network round-trip time before the browser could paint anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; We consolidated all third-party scripts under Google Tag Manager with the GTM container loading &lt;code&gt;async&lt;/code&gt;. Within GTM, we configured all tags to fire on &lt;code&gt;DOM Ready&lt;/code&gt; or &lt;code&gt;Window Loaded&lt;/code&gt; events, not &lt;code&gt;Page View&lt;/code&gt;. This decouples the tracking instrumentation from the critical rendering path entirely:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- In theme.liquid &amp;lt;head&amp;gt;: only GTM loads here --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gtm.start&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;getTime&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="na"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gtm.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementsByTagName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nx"&gt;dl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dataLayer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp;l=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://www.googletagmanager.com/gtm.js?id=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;dl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parentNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insertBefore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;})(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;script&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dataLayer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GTM-XXXXXXX&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All five tracking scripts were then moved into GTM and configured to fire post-render. The WhatsApp widget in particular was set to trigger only after the first user interaction (&lt;code&gt;click&lt;/code&gt; event), eliminating its zero-interaction load cost entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Total Blocking Time dropped from 1,840ms to 290ms on mobile — crossing the "Good" threshold. The INP score moved from "Needs Improvement" to "Good" across most user sessions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Combined Result
&lt;/h2&gt;

&lt;p&gt;These four fixes shipped over two development sprints. No redesign. No theme switch. No Hydrogen migration (our comparison of Liquid vs &lt;a href="https://dev.to/blog/shopify-hydrogen-vs-liquid-2026"&gt;Hydrogen architecture&lt;/a&gt; covers when that conversation becomes relevant). Just clean engineering on an existing Liquid store.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mobile LCP: 4.1s&lt;/li&gt;
&lt;li&gt;Total Blocking Time: 1,840ms&lt;/li&gt;
&lt;li&gt;Image payload per product page: 10.2MB&lt;/li&gt;
&lt;li&gt;Mobile PageSpeed score: 31&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mobile LCP: 2.3s&lt;/li&gt;
&lt;li&gt;Total Blocking Time: 290ms&lt;/li&gt;
&lt;li&gt;Image payload per product page: 1.4MB&lt;/li&gt;
&lt;li&gt;Mobile PageSpeed score: 78&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Business outcome:&lt;/strong&gt; +41% mobile conversion rate lift over the following 8 weeks. FloraSoul also saw a +28% improvement in average order value, which we attribute partly to faster load enabling users to browse more products per session.&lt;/p&gt;

&lt;h2&gt;
  
  
  What To Do Next For Your Store
&lt;/h2&gt;

&lt;p&gt;If you want to run this same diagnostic on your store, start with &lt;a href="https://dev.to/blog/shopify-seo-checklist-2026"&gt;our full Shopify SEO checklist&lt;/a&gt; — it covers all the CWV items in audit format with a priority ordering for which fixes to address first.&lt;/p&gt;

&lt;p&gt;If you'd rather have our team do it, we offer full Shopify performance audits and implementation through our &lt;a href="https://dev.to/services/shopify"&gt;Shopify development service&lt;/a&gt;. We use the exact diagnostic process and fix patterns above on every store we touch. As a DPIIT-recognised startup and official Shopify Partner, we combine the credibility of a verified agency with the technical depth of an engineering team that has shipped 50+ production Shopify builds.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How much does Shopify speed optimisation cost?&lt;/strong&gt;&lt;br&gt;
For a targeted performance fix project (similar to the FloraSoul engagement), typical scope runs 2–3 weeks of development work. For a combined audit + implementation engagement, budget 3–4 weeks. Exact scope depends on theme complexity and number of third-party integrations installed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will speed optimisation affect my store's design?&lt;/strong&gt;&lt;br&gt;
Not if done correctly. The four fixes in this tutorial — deferring scripts, preloading LCP images, implementing srcset, and consolidating trackers into GTM — are invisible to end users. The store looks and feels identical. Only the performance metrics change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My PageSpeed score is 30 on mobile. Is that fixable without changing themes?&lt;/strong&gt;&lt;br&gt;
In most cases, yes. A score of 30 typically indicates one or more of: render-blocking scripts, oversized images, no LCP preload, or heavy third-party payloads. All of these are fixable in your existing theme. We've seen stores go from 28 to 74 without a single design change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the difference between PageSpeed score and Core Web Vitals?&lt;/strong&gt;&lt;br&gt;
PageSpeed Insights shows both. The score (0–100) is a lab-based synthetic measurement useful for benchmarking. Core Web Vitals (LCP, INP, CLS) are field data metrics pulled from real Chrome user sessions — this is what Google uses for ranking. Both matter, but CWV is the more important one for SEO.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does page speed directly affect Shopify conversion rates?&lt;/strong&gt;&lt;br&gt;
Yes. Google's own research shows conversion rates drop approximately 12% for every second of mobile load time after the first second. For a mobile-first market like India — where most shoppers are on 4G connections and mid-range Android devices — page speed is one of the most direct levers on conversion you can pull.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I use a Shopify speed optimisation app?&lt;/strong&gt;&lt;br&gt;
Most "speed optimisation" apps add more script weight than they remove. The legitimate fixes require code access — modifying &lt;code&gt;theme.liquid&lt;/code&gt;, section templates, and image rendering logic. These aren't things an app can do safely at scale. Avoid apps that promise PageSpeed score improvements through automatic optimisation. Do the engineering work instead.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Rishabh Sethia — Founder &amp;amp; CEO of Innovatrix Infotech. Former Senior Software Engineer and Head of Engineering. DPIIT Recognised Startup. Shopify Partner.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://innovatrixinfotech.com/blog/shopify-speed-optimization?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog" rel="noopener noreferrer"&gt;Innovatrix Infotech&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>speedoptimization</category>
      <category>corewebvitals</category>
      <category>lcp</category>
    </item>
    <item>
      <title>Mobile-First Design in 2026: Why It's No Longer Optional</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Wed, 29 Jul 2026 09:30:01 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/mobile-first-design-in-2026-why-its-no-longer-optional-3a8n</link>
      <guid>https://dev.to/emperorakashi20/mobile-first-design-in-2026-why-its-no-longer-optional-3a8n</guid>
      <description>&lt;p&gt;Mobile-first design isn't a trend anymore. In India, it's the baseline. Here's why it matters more in 2026 than ever, and what it actually means in practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;p&gt;In India:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;75%+ of web traffic&lt;/strong&gt; comes from mobile devices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;85%+ of e-commerce purchases&lt;/strong&gt; happen on mobile&lt;/li&gt;
&lt;li&gt;Average mobile screen size: 5.5-6.5 inches&lt;/li&gt;
&lt;li&gt;Average internet speed: 30-50 Mbps (4G), but significant 3G usage in Tier 2/3 cities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your website's primary user is a person on an Android phone with a 6-inch screen. Design for that person first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "Mobile-First" Actually Means
&lt;/h2&gt;

&lt;p&gt;"Mobile-first" is often misunderstood. It doesn't mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Making a desktop site responsive&lt;/li&gt;
&lt;li&gt;Hiding elements on mobile&lt;/li&gt;
&lt;li&gt;Building a separate m.yoursite.com&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Designing for mobile constraints first&lt;/strong&gt;, then progressively enhancing for larger screens&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prioritizing content and actions&lt;/strong&gt; that mobile users actually need&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimizing performance&lt;/strong&gt; for slower connections and smaller processors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Touch-first interactions&lt;/strong&gt; (no hover states as primary UI)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Core Mobile-First Design Principles
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Thumb-Friendly Tap Targets
&lt;/h3&gt;

&lt;p&gt;The average thumb is 2.5cm wide. Minimum tap target: &lt;strong&gt;44x44 pixels&lt;/strong&gt;. Buttons, links, and form fields should all meet this minimum. Navigation items especially — small touch targets are the most frustrating mobile experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Single-Column Layouts
&lt;/h3&gt;

&lt;p&gt;Most content should be single-column on mobile. Two-column grids compress poorly on 360px wide screens. The exception: product cards in a 2-column grid can work if the cards are simple.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Progressive Disclosure
&lt;/h3&gt;

&lt;p&gt;Don't try to show everything at once. Use expandable sections (accordions) for FAQs, specifications, and secondary content. Show primary content, let users request more.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Fast Load Times
&lt;/h3&gt;

&lt;p&gt;Mobile users on 4G expect pages to load in under 3 seconds. Every 100ms of additional load time reduces conversions by ~1%. For Indian users on mixed 4G/3G:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compress all images to WebP&lt;/li&gt;
&lt;li&gt;Lazy load below-fold images&lt;/li&gt;
&lt;li&gt;Minimize JavaScript bundle size&lt;/li&gt;
&lt;li&gt;Use a CDN (Cloudflare handles this)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Bottom Navigation for Apps
&lt;/h3&gt;

&lt;p&gt;For mobile apps and PWAs, primary navigation belongs at the bottom of the screen (where thumbs reach). The top navbar is for secondary navigation and search.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Native Mobile Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Click-to-call for phone numbers&lt;/li&gt;
&lt;li&gt;Click-to-WhatsApp for support links&lt;/li&gt;
&lt;li&gt;Location services for local/delivery features&lt;/li&gt;
&lt;li&gt;Camera for QR codes, AR try-on, document upload&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. Form Design for Mobile
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use appropriate input types: &lt;code&gt;type="tel"&lt;/code&gt; for phone, &lt;code&gt;type="email"&lt;/code&gt; for email (summons right keyboard)&lt;/li&gt;
&lt;li&gt;Make form fields at least 48px tall&lt;/li&gt;
&lt;li&gt;Place labels above fields, not inside (placeholder text disappears when typing)&lt;/li&gt;
&lt;li&gt;Auto-advance to next field after completion where logical&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common Mobile Design Mistakes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Text too small:&lt;/strong&gt; Body text below 16px is unreadable on mobile. Use 16-18px for body, 20-24px for subheadings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Horizontal scroll:&lt;/strong&gt; Any element wider than the viewport causes horizontal scrolling. Overflow hidden is not the fix — responsive layout is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desktop navigation on mobile:&lt;/strong&gt; Hamburger menus are acceptable, but dropdown megamenus never work well on mobile. Simplify navigation for mobile users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pop-ups at page load:&lt;/strong&gt; Full-screen pop-ups that trigger immediately on mobile are a Google ranking signal and a user experience disaster. Use bottom sheets or slide-ins instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Non-responsive tables:&lt;/strong&gt; Data tables don't work on small screens. Use horizontal scroll, card layout, or hide secondary columns on mobile.&lt;/p&gt;




&lt;p&gt;Need expert help? Innovatrix Infotech builds &lt;a href="https://www.innovatrixinfotech.com/services/web-development" rel="noopener noreferrer"&gt;mobile-first web solutions&lt;/a&gt; for businesses across India. &lt;a href="https://www.innovatrixinfotech.com/contact" rel="noopener noreferrer"&gt;Get a free consultation&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://innovatrixinfotech.com/blog/mobile-first-design-2026-why-essential?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog" rel="noopener noreferrer"&gt;Innovatrix Infotech&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mobilefirst</category>
      <category>mobile</category>
      <category>design</category>
      <category>ux</category>
    </item>
    <item>
      <title>How to Build a Custom Shopify App: Step-by-Step for Developers in 2026</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Mon, 27 Jul 2026 09:30:02 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/how-to-build-a-custom-shopify-app-step-by-step-for-developers-in-2026-l91</link>
      <guid>https://dev.to/emperorakashi20/how-to-build-a-custom-shopify-app-step-by-step-for-developers-in-2026-l91</guid>
      <description>&lt;h1&gt;
  
  
  How to Build a Custom Shopify App: Step-by-Step for Developers in 2026
&lt;/h1&gt;

&lt;p&gt;Most Shopify app tutorials teach you how to build a public app for the Shopify App Store. That's useful if you want to build a SaaS product — but most agencies and in-house teams need &lt;strong&gt;custom apps&lt;/strong&gt;: private apps built for a single store that solve a specific business problem.&lt;/p&gt;

&lt;p&gt;This guide covers both. Whether you're a developer who knows JavaScript/Node.js but has never touched Shopify, or an ecommerce operator evaluating whether to build or buy — this is the walkthrough we wish existed when we started building &lt;a href="https://dev.to/services/shopify"&gt;Shopify solutions&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Public vs. Custom Apps: The Distinction That Changes Everything
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Public apps&lt;/strong&gt; are listed on the Shopify App Store. They go through Shopify's review process, need to handle multi-tenant authentication, and can be installed by any merchant. Revenue comes from app subscriptions via Shopify's Billing API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom apps&lt;/strong&gt; (formerly "private apps") are built for one specific store. They're created directly in the store's admin under Settings &amp;gt; Apps and sales channels &amp;gt; Develop apps. No review process, no App Store listing, no multi-tenant complexity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to build custom:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your store needs functionality no existing app provides&lt;/li&gt;
&lt;li&gt;You want full control over data flow and no third-party dependency&lt;/li&gt;
&lt;li&gt;The logic is specific to your business (custom order tagging, vendor-specific workflows, bespoke reporting)&lt;/li&gt;
&lt;li&gt;You need to integrate Shopify with internal systems (ERP, custom CRM, warehouse management)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to buy from the App Store:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The functionality is commodity (reviews, email popups, countdown timers)&lt;/li&gt;
&lt;li&gt;Multiple apps compete in the space (competition drives quality)&lt;/li&gt;
&lt;li&gt;The total cost of ownership for building exceeds 12 months of app subscription fees&lt;/li&gt;
&lt;li&gt;You don't have a developer or agency on retainer&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setting Up Your Development Environment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js 18+ (LTS recommended)&lt;/li&gt;
&lt;li&gt;npm or yarn&lt;/li&gt;
&lt;li&gt;A Shopify Partner account (free at partners.shopify.com)&lt;/li&gt;
&lt;li&gt;A development store (create one from your Partner dashboard)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 1: Install Shopify CLI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @shopify/cli @shopify/app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;shopify version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see version 3.x or later. The CLI handles app scaffolding, local development tunneling, and deployment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Scaffold Your App
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;shopify app init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI will prompt you to choose:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;App template&lt;/strong&gt;: Choose the Remix template (Shopify's recommended framework since 2024) or the Node.js template if you prefer Express-style architecture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language&lt;/strong&gt;: TypeScript is recommended for anything beyond a weekend project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App name&lt;/strong&gt;: Something descriptive — you can change this later.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This creates a project with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OAuth authentication flow (already configured)&lt;/li&gt;
&lt;li&gt;App Bridge integration (for embedding in Shopify admin)&lt;/li&gt;
&lt;li&gt;Prisma ORM for database operations&lt;/li&gt;
&lt;li&gt;A basic admin UI using Polaris components&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Start Local Development
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;your-app-name
shopify app dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This spins up a local server, creates a secure tunnel (via Cloudflare), and opens your development store with the app installed. Every code change hot-reloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a Real App: The Order Tagger
&lt;/h2&gt;

&lt;p&gt;Let's build something practical: an app that automatically tags orders based on custom rules. For example, tag orders over ₹5,000 as "high-value," tag orders containing specific products as "gift-bundle," and tag repeat customers' orders as "returning."&lt;/p&gt;

&lt;p&gt;This is a common need that most store owners solve with Shopify Flow (if they're on Plus) or with paid apps. Building it custom gives you full control.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Register Webhooks
&lt;/h3&gt;

&lt;p&gt;Webhooks are how Shopify tells your app that something happened. For order tagging, you need the &lt;code&gt;orders/create&lt;/code&gt; webhook.&lt;/p&gt;

&lt;p&gt;In your app's webhook configuration (typically &lt;code&gt;shopify.app.toml&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[webhooks]&lt;/span&gt;
&lt;span class="py"&gt;api_version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"2026-01"&lt;/span&gt;

  &lt;span class="nn"&gt;[[webhooks.subscriptions]]&lt;/span&gt;
  &lt;span class="py"&gt;topics&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"orders/create"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="py"&gt;uri&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/webhooks/orders-create"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Handle the Webhook
&lt;/h3&gt;

&lt;p&gt;Create a webhook handler that processes incoming orders:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/routes/webhooks.orders-create.tsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ActionFunction&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@remix-run/node&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;authenticate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../shopify.server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ActionFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;shop&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;authenticate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;webhook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

  &lt;span class="c1"&gt;// Rule 1: High-value orders&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;parseFloat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;total_price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;high-value&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Rule 2: Repeat customer&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;customer&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;orders_count&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;returning-customer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Rule 3: Gift bundle detection&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hasGiftProduct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;line_items&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;product_id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;YOUR_GIFT_PRODUCT_ID&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hasGiftProduct&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gift-bundle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Apply tags via GraphQL&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;shopify&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clients&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Graphql&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`mutation orderUpdate($input: OrderInput!) {
          orderUpdate(input: $input) {
            order { id tags }
            userErrors { field message }
          }
        }`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`gid://shopify/Order/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;tags&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;OK&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6: Handle Rate Limits
&lt;/h3&gt;

&lt;p&gt;Shopify's API uses a leaky bucket algorithm for rate limiting. For REST, you get 40 requests per app per store, replenishing at 2 per second. For GraphQL, it's a cost-based system with 1,000 points, replenishing at 50 per second.&lt;/p&gt;

&lt;p&gt;In production, implement retry logic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;shopifyRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maxRetries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;maxRetries&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;retryAfter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parseFloat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;retry-after&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
          &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;retryAfter&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Max retries exceeded&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For bulk operations (syncing hundreds of products, processing historical orders), use Shopify's Bulk Operations API instead of paginated queries. It runs asynchronously and doesn't count against rate limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Metafields vs. Metaobjects: Custom Data Storage
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Metafields&lt;/strong&gt; attach key-value data to existing Shopify resources (products, orders, customers). Use them for simple data like cost-per-unit, vendor tags, or custom attributes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;mutation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;metafieldsSet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metafields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;ownerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gid://shopify/Product/123456789"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"custom"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cost_per_unit"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"450.00"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"number_decimal"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;metafields&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;userErrors&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Metaobjects&lt;/strong&gt; are standalone data entities with their own schema. Use them when you need structured data that doesn't naturally belong to a product or order — vendor profiles, custom lookup tables, configuration objects.&lt;/p&gt;

&lt;p&gt;The rule of thumb: if the data describes something that already exists in Shopify (a product, a customer), use Metafields. If it's a new concept your store needs to track, use Metaobjects.&lt;/p&gt;

&lt;h2&gt;
  
  
  App Bridge: Embedding in Shopify Admin
&lt;/h2&gt;

&lt;p&gt;App Bridge 3 lets your app render inside the Shopify admin as a seamless embedded experience. The Remix template includes this by default, but understanding the key concepts helps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Navigation:&lt;/strong&gt; Your app gets a left-nav item in the Shopify admin. Each route in your Remix app maps to a page within that navigation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session tokens:&lt;/strong&gt; App Bridge handles authentication via session tokens instead of cookies. This means your app works in the embedded iframe without third-party cookie issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Polaris components:&lt;/strong&gt; Shopify's design system. Using Polaris ensures your app looks native and follows Shopify's UX patterns. Don't fight it — merchants expect consistency.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Billing API: Charging Merchants
&lt;/h2&gt;

&lt;p&gt;If you're building a public app, Shopify takes a revenue share (currently 0% for the first $1M in annual revenue, then 15%). You charge merchants through the Billing API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;mutation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;appSubscriptionCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pro Plan"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;returnUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://your-app.com/billing/callback"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;lineItems&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="n"&gt;appRecurringPricingDetails&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;29.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;currencyCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;USD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;EVERY_30_DAYS&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;appSubscription&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;confirmationUrl&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;userErrors&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For custom apps, billing is handled directly between you and your client — no Shopify involvement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hosting Your App in Production
&lt;/h2&gt;

&lt;p&gt;For custom apps serving a single store, hosting requirements are modest:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Lambda + API Gateway:&lt;/strong&gt; Serverless, pay-per-invocation. Ideal for webhook-driven apps like our Order Tagger. As an &lt;a href="https://dev.to/services/web-development"&gt;AWS Partner&lt;/a&gt;, this is our default recommendation for lightweight custom apps. Cold starts can add 1–2 seconds to the first request, but for webhook processing this is rarely noticeable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS App Runner:&lt;/strong&gt; Container-based, always-warm. Better for apps with admin UIs that merchants interact with regularly. Starts at ~$5/month for a minimal instance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Heroku or Railway:&lt;/strong&gt; Simpler deployment, higher per-unit cost. Good for prototyping, less ideal for production apps that need to scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vercel:&lt;/strong&gt; If you chose the Remix template, Vercel deployment is nearly zero-config. The free tier handles most custom apps comfortably.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build vs. Buy: Total Cost of Ownership
&lt;/h2&gt;

&lt;p&gt;Before building anything, run this calculation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build cost:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Development time × developer rate (20–80 hours for a simple app)&lt;/li&gt;
&lt;li&gt;Hosting cost per month ($5–$50)&lt;/li&gt;
&lt;li&gt;Maintenance time per month (2–5 hours for updates, Shopify API version bumps)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Buy cost:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;App subscription × 12 months&lt;/li&gt;
&lt;li&gt;Customization limitations (workarounds, manual processes)&lt;/li&gt;
&lt;li&gt;Data dependency (what happens if the app shuts down?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If building costs less than 18 months of subscription fees AND gives you meaningfully better functionality, build. Otherwise, buy.&lt;/p&gt;

&lt;p&gt;For most stores, the breakeven point is around $150–$200/month in app subscription costs. Below that, buying is almost always more efficient. Above that — especially if you're paying for multiple apps that a single custom app could replace — building starts making sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Once you've built your first custom app, the natural extension is connecting it with your &lt;a href="https://dev.to/services/web-development"&gt;broader web development stack&lt;/a&gt;. Custom apps become the glue between Shopify and your internal systems — syncing inventory with your warehouse, pushing order data to your accounting software, or triggering custom workflows that no off-the-shelf app supports.&lt;/p&gt;

&lt;p&gt;If you're evaluating whether to build or buy for your specific use case, &lt;a href="https://cal.com/innovatrix-infotech/discovery-call" rel="noopener noreferrer"&gt;book a discovery call&lt;/a&gt;. We'll scope the project honestly and tell you if a $15/month app store solution does the job better.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building a custom Shopify app and need architecture guidance? &lt;a href="https://cal.com/innovatrix-infotech/discovery-call" rel="noopener noreferrer"&gt;Talk to our team&lt;/a&gt; — we've built custom apps for stores across India, Dubai, and Singapore.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://innovatrixinfotech.com/blog/build-custom-shopify-app-tutorial-2026?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog" rel="noopener noreferrer"&gt;Innovatrix Infotech&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>shopifyappdevelopment</category>
      <category>shopifycli</category>
      <category>customapp</category>
    </item>
    <item>
      <title>I'm Building a Tech Company Where AI Does All the Marketing</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Thu, 23 Jul 2026 04:30:01 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/im-building-a-tech-company-where-ai-does-all-the-marketing-3n1n</link>
      <guid>https://dev.to/emperorakashi20/im-building-a-tech-company-where-ai-does-all-the-marketing-3n1n</guid>
      <description>&lt;p&gt;Six months ago, someone I trusted walked out of this company.&lt;/p&gt;

&lt;p&gt;They didn't just resign. They took everything. Client contact lists, project documentation, relationships we'd spent two years building. The kind of thing that could end a company.&lt;/p&gt;

&lt;p&gt;I had a choice: rebuild quietly, or rebuild publicly.&lt;/p&gt;

&lt;p&gt;I chose publicly. And I chose to do it without a marketing team.&lt;/p&gt;




&lt;p&gt;No growth hacker. No content strategist. No social media manager. No agency. Not even a freelancer on retainer.&lt;/p&gt;

&lt;p&gt;Just me, a 12-person engineering team, and AI.&lt;/p&gt;

&lt;p&gt;And it's working.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem With How Most Tech Companies Market Themselves
&lt;/h2&gt;

&lt;p&gt;Most tech companies do one of two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hire a marketing team they can't yet afford and burn cash trying to outspend competitors&lt;/li&gt;
&lt;li&gt;Do nothing and hope referrals carry the business forever&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Neither made sense for me.&lt;/p&gt;

&lt;p&gt;I'm a former Senior Software Engineer. I ran engineering teams. I know how to build systems. And when I looked at content marketing, SEO, and lead generation — I realised it's a systems problem, not a creativity problem.&lt;/p&gt;

&lt;p&gt;Systems are something I can build.&lt;/p&gt;

&lt;h2&gt;
  
  
  What AI-Powered Marketing Actually Looks Like
&lt;/h2&gt;

&lt;p&gt;When I say AI does all the marketing, I mean this literally.&lt;/p&gt;

&lt;p&gt;Every blog post on this site was planned by AI. Researched by AI. Written by AI — using our content operating system, a structured framework that embeds our real case studies, our technical opinions, and our company credentials into every piece of content.&lt;/p&gt;

&lt;p&gt;The AI publishes directly to our CMS via an MCP (Model Context Protocol) connection. No copy-paste. No manual formatting. The pipeline goes from strategy → research → draft → publish in one continuous flow.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://dev.to/services/ai-automation"&gt;AI automation workflows&lt;/a&gt; powering our marketing are the same class of workflows we build for clients — n8n pipelines, Make.com automations, custom Python logic. We are our own case study.&lt;/p&gt;

&lt;p&gt;The SEO strategy was built using AI-assisted keyword research, competitor gap analysis, and topical authority mapping. I reviewed it. I made the strategic decisions. But the legwork? AI.&lt;/p&gt;

&lt;p&gt;This doesn't mean I'm absent. It means I'm upstream.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Actually Do
&lt;/h2&gt;

&lt;p&gt;I architect the strategy.&lt;/p&gt;

&lt;p&gt;I decide which topics to cover and why. I define our positioning. I review content before it publishes. I flag anything that doesn't sound like us.&lt;/p&gt;

&lt;p&gt;I also feed the machine with real data. Our actual case studies. Our real pricing. Our honest opinions about tools and platforms. The AI can write. It cannot replace the decades of engineering experience that make the content credible.&lt;/p&gt;

&lt;p&gt;There's a critical distinction between &lt;strong&gt;AI-generated content&lt;/strong&gt; and &lt;strong&gt;AI-executed content&lt;/strong&gt;. Generic AI content reads like no one wrote it. Our content reads like a technical founder wrote it — because a technical founder directed every word.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://dev.to/services/managed-services"&gt;managed services model&lt;/a&gt; we offer clients — where we become their outsourced tech team — is essentially what we're doing ourselves. AI is the execution layer. I'm the principal.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Technical Architecture
&lt;/h2&gt;

&lt;p&gt;For anyone curious about the actual stack:&lt;/p&gt;

&lt;p&gt;The content system runs on a structured prompt framework with 4 stages: research (web search, competitor gap analysis), interrogate (real experience extraction), create (draft using brand voice and EEAT guidelines), and publish (direct to Directus CMS via MCP).&lt;/p&gt;

&lt;p&gt;Each blog post triggers an Unsplash image search, downloads the asset, uploads it to the Directus file library, and attaches it to the post — automatically. The post is saved as draft, not published live, so I retain final review.&lt;/p&gt;

&lt;p&gt;The internal linking strategy, category mapping, and meta tag optimisation are all handled within the same pipeline. What previously required a 3-person content team now requires one strategist and a well-built system.&lt;/p&gt;

&lt;p&gt;As a DPIIT-recognised startup, we had to demonstrate genuine innovation in our application. This content pipeline is part of what we pointed to. It's not just a marketing trick — it's a proof of concept for the kind of &lt;a href="https://dev.to/services/ai-automation"&gt;AI automation work&lt;/a&gt; we do for clients.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Numbers So Far
&lt;/h2&gt;

&lt;p&gt;I'll be transparent about where we are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;50+ clients served&lt;/strong&gt; since founding, growing from zero after the reset&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FloraSoul India&lt;/strong&gt;: +41% mobile conversion lift after speed engineering fixes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Baby Forest India&lt;/strong&gt;: ₹4.2 lakh launch-month revenue on a store built in under 3 weeks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zevarly&lt;/strong&gt;: +55% session duration, +33% repeat purchase rate&lt;/li&gt;
&lt;li&gt;Blog content ranking for targeted keywords in under 6 weeks of publication&lt;/li&gt;
&lt;li&gt;Inbound inquiries from Dubai and Singapore from content published 3 weeks ago&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The content machine is spinning up. Organic leads are starting to come in from markets we'd never reached before — without a rupee of paid media.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters If You're a Founder
&lt;/h2&gt;

&lt;p&gt;The question I'm asking myself — and that every founder should ask — is this: how much of your company's output requires human judgment, and how much requires human execution?&lt;/p&gt;

&lt;p&gt;Most marketing execution doesn't require human judgment. Research, drafting, formatting, publishing, SEO mechanics — these are pattern-recognition and synthesis tasks. AI handles them well.&lt;/p&gt;

&lt;p&gt;What requires human judgment: strategy, authentic story, brand voice, reading the market, deciding what NOT to say.&lt;/p&gt;

&lt;p&gt;If you've been avoiding content marketing because you can't afford a team, that excuse doesn't hold anymore in 2026. The tools exist. The frameworks exist. What's required is a founder willing to build the system instead of just doing the tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Full Story
&lt;/h2&gt;

&lt;p&gt;I'm rebuilding a company that someone tried to take from me.&lt;/p&gt;

&lt;p&gt;I'm doing it without a marketing budget. Without the relationships that were stolen. Without the years of client history that disappeared overnight.&lt;/p&gt;

&lt;p&gt;But I have the engineering skills built over a career. I have a team of 12 developers who build things properly. I have &lt;a href="https://dev.to/about"&gt;DPIIT recognition as a verified Indian startup&lt;/a&gt;. I have real results from real clients who trusted us.&lt;/p&gt;

&lt;p&gt;And I have AI.&lt;/p&gt;

&lt;p&gt;This comeback story isn't finished. But it's being written — post by post, page by page, workflow by workflow.&lt;/p&gt;

&lt;p&gt;If you want to understand how we're building our &lt;a href="https://dev.to/services/ai-automation"&gt;AI automation systems&lt;/a&gt;, our Shopify development practice, or anything else about how Innovatrix Infotech operates — &lt;a href="https://dev.to/blog"&gt;the blog is where to start&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can AI actually replace a marketing team?&lt;/strong&gt;&lt;br&gt;
Not entirely. AI is excellent at execution: research, drafting, publishing, SEO mechanics. What it can't replace is strategic direction, authentic experience, and the judgment call about what's worth saying. The model we run is founder-directed AI execution — not autonomous AI marketing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What tools are you actually using for AI marketing?&lt;/strong&gt;&lt;br&gt;
Core stack: Claude for content creation (structured content operating system with 4 stages), n8n for automation workflows, Make.com for certain integrations, and Directus CMS connected via MCP. The pipeline from strategy to published draft is largely automated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is AI-generated content penalised by Google?&lt;/strong&gt;&lt;br&gt;
Google evaluates content quality, not how it was created. Our content performs because it contains genuine EEAT signals — real case studies, real metrics, technical insights from actual project work. Thin AI content gets filtered out. Substantive, experience-backed content performs well regardless of production method.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much time does managing AI marketing actually take?&lt;/strong&gt;&lt;br&gt;
Currently: 3-4 hours per week of active direction-setting, review, and strategic decisions. Execution (research, drafting, publishing) is handled by the AI pipeline. That compares to a traditional content team effort of 20+ hours per week for equivalent output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you build this kind of AI marketing system for other companies?&lt;/strong&gt;&lt;br&gt;
Yes. Our &lt;a href="https://dev.to/services/ai-automation"&gt;AI automation service&lt;/a&gt; builds exactly these types of content and workflow automation systems for clients. A properly built AI content pipeline is one of the highest-ROI automation investments a B2B company can make in 2026.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Rishabh Sethia — Founder &amp;amp; CEO of Innovatrix Infotech. Former Senior Software Engineer and Head of Engineering. DPIIT Recognised Startup.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://innovatrixinfotech.com/blog/building-tech-company-ai-marketing-2026?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog" rel="noopener noreferrer"&gt;Innovatrix Infotech&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aimarketing</category>
      <category>founderstory</category>
      <category>aiautomation</category>
      <category>contentmarketing</category>
    </item>
    <item>
      <title>Website Accessibility in 2026: What Indian Businesses Need to Know</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Wed, 22 Jul 2026 04:30:01 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/website-accessibility-in-2026-what-indian-businesses-need-to-know-1g7n</link>
      <guid>https://dev.to/emperorakashi20/website-accessibility-in-2026-what-indian-businesses-need-to-know-1g7n</guid>
      <description>&lt;p&gt;Website accessibility in India is moving from best practice to legal requirement. The Digital Personal Data Protection Act 2023 and upcoming BIS standards are changing the compliance landscape. Here's what you need to know.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Legal Landscape in India
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Rights of Persons with Disabilities Act 2016 (RPWD Act):&lt;/strong&gt; Section 46 requires all public-facing websites and apps to follow Web Content Accessibility Guidelines (WCAG) 2.0 Level AA. This applies to government websites mandatorily, and is expected to extend to private sector businesses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BIS IS 17802:2021:&lt;/strong&gt; India's national standard for web accessibility, aligned with WCAG 2.1. Increasingly referenced in procurement and compliance contexts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WHY THIS MATTERS NOW:&lt;/strong&gt; The Digital India initiative and upcoming consumer protection regulations are accelerating enforcement. Businesses that build accessible sites today avoid retrofit costs later.&lt;/p&gt;

&lt;h2&gt;
  
  
  WCAG Compliance Levels
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Level A:&lt;/strong&gt; Basic accessibility (minimum requirement)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Level AA:&lt;/strong&gt; Standard requirement (what most regulations mandate)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Level AAA:&lt;/strong&gt; Highest level (aspirational for most sites)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Target Level AA for compliance.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 4 WCAG Principles (POUR)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Perceivable
&lt;/h3&gt;

&lt;p&gt;Information must be presentable to users in ways they can perceive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Alt text for all images (screen readers read this aloud)&lt;/li&gt;
&lt;li&gt;Captions for video content&lt;/li&gt;
&lt;li&gt;Sufficient color contrast (4.5:1 for body text, 3:1 for large text)&lt;/li&gt;
&lt;li&gt;Text doesn't disappear when zoomed to 200%&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Operable
&lt;/h3&gt;

&lt;p&gt;UI components must be operable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All functionality available via keyboard (no mouse required)&lt;/li&gt;
&lt;li&gt;No content that flashes more than 3 times per second (seizure risk)&lt;/li&gt;
&lt;li&gt;Skip navigation links for keyboard users&lt;/li&gt;
&lt;li&gt;Sufficient time to complete forms (no auto-timeout on critical tasks)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Understandable
&lt;/h3&gt;

&lt;p&gt;Content and UI operation must be understandable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Language declared in HTML (&lt;code&gt;lang="en"&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Error messages that explain what went wrong&lt;/li&gt;
&lt;li&gt;Form labels visible and descriptive&lt;/li&gt;
&lt;li&gt;Consistent navigation across pages&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Robust
&lt;/h3&gt;

&lt;p&gt;Content must be robust enough for assistive technologies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Valid HTML (use proper semantic elements: &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;, not just &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;ARIA labels where semantic HTML isn't sufficient&lt;/li&gt;
&lt;li&gt;No reliance on color alone to convey information&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common Accessibility Issues in Indian Sites
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Low color contrast:&lt;/strong&gt; Light grey text on white backgrounds is extremely common in Indian web design. Check every text/background combination with a contrast checker.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Images without alt text:&lt;/strong&gt; Product images, banners, and icons frequently have missing or generic alt text ("image1.jpg").&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forms without labels:&lt;/strong&gt; Many Indian sites use placeholder text as the label, which disappears when users start typing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Non-semantic HTML:&lt;/strong&gt; Buttons built with &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; and JavaScript instead of &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;. These can't be activated with keyboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PDFs without text layers:&lt;/strong&gt; Scanned PDFs are completely inaccessible to screen readers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Accessibility Audit
&lt;/h2&gt;

&lt;p&gt;Run these free tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WAVE (wave.webaim.org):&lt;/strong&gt; Browser extension showing accessibility errors visually&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;axe DevTools:&lt;/strong&gt; Chrome extension for detailed WCAG testing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Lighthouse:&lt;/strong&gt; Built into Chrome DevTools &amp;gt; Accessibility&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contrast Checker (webaim.org/resources/contrastchecker):&lt;/strong&gt; For color combinations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implementation Priority
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Add alt text to all images (1 day)&lt;/li&gt;
&lt;li&gt;Fix color contrast issues (1-2 days)&lt;/li&gt;
&lt;li&gt;Add proper form labels (1 day)&lt;/li&gt;
&lt;li&gt;Ensure keyboard navigation works (2-3 days)&lt;/li&gt;
&lt;li&gt;Add ARIA landmarks (1 day)&lt;/li&gt;
&lt;li&gt;Test with screen reader (NVDA free, VoiceOver on Mac/iOS)&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Need expert help? Innovatrix Infotech builds &lt;a href="https://www.innovatrixinfotech.com/services/web-development" rel="noopener noreferrer"&gt;accessible, compliant web solutions&lt;/a&gt; for businesses across India. &lt;a href="https://www.innovatrixinfotech.com/contact" rel="noopener noreferrer"&gt;Get a free consultation&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://innovatrixinfotech.com/blog/website-accessibility-india-2026-compliance?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog" rel="noopener noreferrer"&gt;Innovatrix Infotech&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>wcag</category>
      <category>compliance</category>
      <category>india</category>
    </item>
    <item>
      <title>Multi-Language Website Setup: Complete Guide for Indian Businesses Going Global</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Tue, 21 Jul 2026 04:30:01 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/multi-language-website-setup-complete-guide-for-indian-businesses-going-global-mo4</link>
      <guid>https://dev.to/emperorakashi20/multi-language-website-setup-complete-guide-for-indian-businesses-going-global-mo4</guid>
      <description>&lt;p&gt;India's linguistic diversity makes multi-language websites a business necessity, not a nice-to-have. With 22 official languages and hundreds of dialects, reaching beyond English-speaking metro audiences requires localization. Here's how to do it right.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Multi-Language Matters for Indian Businesses
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Only 10-12% of India's population uses English as their primary language&lt;/li&gt;
&lt;li&gt;Hindi-medium internet users have overtaken English by 2x&lt;/li&gt;
&lt;li&gt;Tier 2/3 city users prefer regional language content significantly&lt;/li&gt;
&lt;li&gt;E-commerce conversion rates are 2-3x higher in native language&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Approaches
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option 1: Subdomain Structure
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;en.yoursite.com&lt;/code&gt;, &lt;code&gt;hi.yoursite.com&lt;/code&gt;, &lt;code&gt;bn.yoursite.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Clean separation, easier CDN caching, good for SEO&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; More infrastructure, cookies/sessions can be complex&lt;br&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Large sites with full content translation for each language&lt;/p&gt;
&lt;h3&gt;
  
  
  Option 2: Subdirectory Structure
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;yoursite.com/en/&lt;/code&gt;, &lt;code&gt;yoursite.com/hi/&lt;/code&gt;, &lt;code&gt;yoursite.com/bn/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Domain authority consolidation, simpler infrastructure&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Slightly more complex routing&lt;br&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Most businesses. This is Google's recommended approach.&lt;/p&gt;
&lt;h3&gt;
  
  
  Option 3: Query Parameters (Avoid)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;yoursite.com?lang=hi&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; Poor SEO (Google often ignores params), bad UX, caching issues. Don't use this.&lt;/p&gt;
&lt;h2&gt;
  
  
  Implementation for Different Platforms
&lt;/h2&gt;
&lt;h3&gt;
  
  
  WordPress
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Polylang&lt;/strong&gt; plugin (free) or &lt;strong&gt;WPML&lt;/strong&gt; (paid, ₹10,000/year) handle WordPress multilingual well. WPML has better compatibility with WooCommerce for multilingual e-commerce.&lt;/p&gt;

&lt;p&gt;Key steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install Polylang/WPML&lt;/li&gt;
&lt;li&gt;Add languages&lt;/li&gt;
&lt;li&gt;Translate posts, pages, menus, and custom fields&lt;/li&gt;
&lt;li&gt;Set up hreflang tags (WPML does this automatically)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Shopify
&lt;/h3&gt;

&lt;p&gt;Shopify Markets (built-in) handles multiple languages from Shopify Admin &amp;gt; Markets. Supports automatic translation with some apps (Transcy, Langify). Manual translation gives better quality.&lt;/p&gt;
&lt;h3&gt;
  
  
  Next.js / Custom
&lt;/h3&gt;

&lt;p&gt;next-i18next or next-intl for Next.js apps. Set up i18n routing in next.config.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;i18n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;locales&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hi&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nx"&gt;defaultLocale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each locale gets its own JSON translation file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hreflang: Critical for SEO
&lt;/h2&gt;

&lt;p&gt;hreflang tags tell Google which language version to show to which users. Without them, Google may serve the wrong language version and cannibalize your rankings.&lt;/p&gt;

&lt;p&gt;For each page, include in &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://yoursite.com/en/page"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"hi"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://yoursite.com/hi/page"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"x-default"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://yoursite.com/page"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Translation Quality
&lt;/h2&gt;

&lt;p&gt;Machine translation (DeepL, Google Translate) is acceptable for most content. For:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CTAs and hero copy: Use native speaker translation&lt;/li&gt;
&lt;li&gt;Legal/compliance content: Professional translator required&lt;/li&gt;
&lt;li&gt;Product descriptions: Machine translation + native review&lt;/li&gt;
&lt;li&gt;Blog content: Machine + edit works for informational content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For Hindi and Bengali, ensure your font stack includes proper Unicode support. Noto Sans and Google Fonts regional families handle Indian scripts reliably.&lt;/p&gt;

&lt;h2&gt;
  
  
  Language Detection
&lt;/h2&gt;

&lt;p&gt;Auto-detecting language from browser settings and redirecting is tempting but often annoying. Best practice:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Default to English (or Hindi for Hindi-dominant businesses)&lt;/li&gt;
&lt;li&gt;Show a language switcher prominently&lt;/li&gt;
&lt;li&gt;Remember language preference with a cookie&lt;/li&gt;
&lt;li&gt;Don't auto-redirect without user confirmation&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Need expert help? Innovatrix Infotech builds &lt;a href="https://www.innovatrixinfotech.com/services/web-development-company-kolkata" rel="noopener noreferrer"&gt;multilingual web solutions&lt;/a&gt; for businesses across India. &lt;a href="https://www.innovatrixinfotech.com/contact" rel="noopener noreferrer"&gt;Get a free consultation&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://innovatrixinfotech.com/blog/multi-language-website-setup-india-2026?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog" rel="noopener noreferrer"&gt;Innovatrix Infotech&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>multilingual</category>
      <category>translation</category>
      <category>localization</category>
      <category>international</category>
    </item>
    <item>
      <title>Shopify Theme Customization: When to Use Apps vs Custom Code</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Thu, 16 Jul 2026 09:30:01 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/shopify-theme-customization-when-to-use-apps-vs-custom-code-3b57</link>
      <guid>https://dev.to/emperorakashi20/shopify-theme-customization-when-to-use-apps-vs-custom-code-3b57</guid>
      <description>&lt;p&gt;You need a size chart on your product pages. Do you install an app (₹500/month forever) or pay a developer ₹5,000 once for custom Liquid code? This decision, multiplied across 15–20 features, is the difference between a ₹6,000/month app bill and a lean, fast store.&lt;/p&gt;

&lt;p&gt;Most Shopify store owners don't think about this until their monthly app bill crosses ₹10,000. By then, they're locked into a dozen apps, their store loads in 6+ seconds, and they're bleeding money on features that could have been built natively.&lt;/p&gt;

&lt;p&gt;Let's fix that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The App Bloat Problem
&lt;/h2&gt;

&lt;p&gt;Every Shopify app you install adds JavaScript to your storefront. Some add a lot. Here's what happens when you stack 10–15 apps on a single store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Load time increases by 2–5 seconds.&lt;/strong&gt; Each app injects its own scripts, stylesheets, and sometimes iframes. Your theme might load in 1.8 seconds on its own, but with 12 apps, you're looking at 4–6 seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monthly costs compound.&lt;/strong&gt; That "just ₹300/month" app doesn't feel like much until you have 15 of them. Suddenly you're spending ₹4,500–₹8,000/month on apps alone — more than your Shopify plan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conflicts and bugs.&lt;/strong&gt; Apps modify your theme's DOM. Two apps targeting the same page element will break each other. Debugging this is a nightmare.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You lose control.&lt;/strong&gt; App developers can change pricing, discontinue features, or shut down entirely. Your store's functionality depends on third parties you don't control.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't hypothetical. We've audited stores spending ₹12,000/month on apps where 60% of the functionality could have been replaced with one-time custom code costing ₹30,000 total.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Apps Make Sense
&lt;/h2&gt;

&lt;p&gt;Apps aren't the enemy. For certain use cases, they're the right choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install an app when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The functionality is complex and evolving.&lt;/strong&gt; Email marketing (Klaviyo), reviews with photo/video UGC (Judge.me), subscription management (Recharge) — these are entire products. Building equivalent functionality from scratch would cost lakhs and require ongoing maintenance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You need it yesterday.&lt;/strong&gt; Launching a flash sale tomorrow and need a countdown timer with inventory urgency? Install an app. Speed matters more than optimization when revenue is on the line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The app handles compliance or security.&lt;/strong&gt; Cookie consent, GDPR compliance, tax calculation — these involve legal requirements that change. Let specialists handle them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It integrates with external services.&lt;/strong&gt; Shipping calculators that pull real-time rates from carriers, accounting sync with Tally or Zoho — these need maintained API connections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The app is free or nearly free.&lt;/strong&gt; If a well-maintained free app solves your problem without performance impact, use it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When Custom Code Wins
&lt;/h2&gt;

&lt;p&gt;Custom Liquid code (or theme modifications) should be your default for anything that's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simple and static.&lt;/strong&gt; Size charts, trust badges, custom announcement bars, FAQ accordions, additional product tabs — these are HTML/CSS with minimal logic. An app is overkill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance-critical.&lt;/strong&gt; Anything that loads on every page (header modifications, custom navigation, footer content) should be native code, not app-injected scripts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A one-time implementation.&lt;/strong&gt; If the feature won't change often, build it once. No monthly fees, no external dependencies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Core to your brand.&lt;/strong&gt; Custom product page layouts, unique collection filters, branded checkout messaging — these define your store. They should live in your theme, not in an app that 10,000 other stores also use.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Hybrid Approach
&lt;/h2&gt;

&lt;p&gt;The smartest Shopify stores use both — strategically. The framework is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;List every feature&lt;/strong&gt; your store needs beyond the base theme.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Categorize each&lt;/strong&gt; as "complex/evolving" or "simple/static."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use apps&lt;/strong&gt; for complex, evolving features that would cost more to build and maintain than the subscription.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use custom code&lt;/strong&gt; for simple, static features where a one-time build saves money within 3–6 months.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review quarterly.&lt;/strong&gt; Some apps you installed early on may now have native theme equivalents. Some custom code may need upgrading to an app as your needs grow.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Performance Impact: Apps vs Custom Code
&lt;/h2&gt;

&lt;p&gt;We tested a store with 14 apps installed, then replaced 8 of them with custom Liquid code. Here's what changed:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;With 14 Apps&lt;/th&gt;
&lt;th&gt;After Replacing 8 with Code&lt;/th&gt;
&lt;th&gt;Improvement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Page load time (mobile)&lt;/td&gt;
&lt;td&gt;5.8s&lt;/td&gt;
&lt;td&gt;2.4s&lt;/td&gt;
&lt;td&gt;59% faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total page weight&lt;/td&gt;
&lt;td&gt;4.2 MB&lt;/td&gt;
&lt;td&gt;1.8 MB&lt;/td&gt;
&lt;td&gt;57% lighter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript requests&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;63% fewer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lighthouse Performance&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;td&gt;+44 points&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time to Interactive&lt;/td&gt;
&lt;td&gt;8.1s&lt;/td&gt;
&lt;td&gt;3.2s&lt;/td&gt;
&lt;td&gt;60% faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First Contentful Paint&lt;/td&gt;
&lt;td&gt;3.4s&lt;/td&gt;
&lt;td&gt;1.6s&lt;/td&gt;
&lt;td&gt;53% faster&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's not a marginal improvement. That's the difference between a store that converts and one that loses visitors before the page finishes loading. Google's data says 53% of mobile visitors leave if a page takes longer than 3 seconds to load. A 5.8-second load time means you're losing more than half your traffic before they see a single product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost Comparison: 12-Month View
&lt;/h2&gt;

&lt;p&gt;Here's what the numbers look like for common customizations over a year:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;App Cost (₹/month)&lt;/th&gt;
&lt;th&gt;App Cost (12 months)&lt;/th&gt;
&lt;th&gt;Custom Code (One-Time)&lt;/th&gt;
&lt;th&gt;Break-Even&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Size chart&lt;/td&gt;
&lt;td&gt;₹400&lt;/td&gt;
&lt;td&gt;₹4,800&lt;/td&gt;
&lt;td&gt;₹3,000&lt;/td&gt;
&lt;td&gt;Month 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trust badges&lt;/td&gt;
&lt;td&gt;₹300&lt;/td&gt;
&lt;td&gt;₹3,600&lt;/td&gt;
&lt;td&gt;₹2,000&lt;/td&gt;
&lt;td&gt;Month 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Announcement bar (advanced)&lt;/td&gt;
&lt;td&gt;₹500&lt;/td&gt;
&lt;td&gt;₹6,000&lt;/td&gt;
&lt;td&gt;₹4,000&lt;/td&gt;
&lt;td&gt;Month 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FAQ accordion&lt;/td&gt;
&lt;td&gt;₹350&lt;/td&gt;
&lt;td&gt;₹4,200&lt;/td&gt;
&lt;td&gt;₹2,500&lt;/td&gt;
&lt;td&gt;Month 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product tabs&lt;/td&gt;
&lt;td&gt;₹400&lt;/td&gt;
&lt;td&gt;₹4,800&lt;/td&gt;
&lt;td&gt;₹3,500&lt;/td&gt;
&lt;td&gt;Month 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom popup&lt;/td&gt;
&lt;td&gt;₹600&lt;/td&gt;
&lt;td&gt;₹7,200&lt;/td&gt;
&lt;td&gt;₹5,000&lt;/td&gt;
&lt;td&gt;Month 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wishlist (basic)&lt;/td&gt;
&lt;td&gt;₹500&lt;/td&gt;
&lt;td&gt;₹6,000&lt;/td&gt;
&lt;td&gt;₹8,000&lt;/td&gt;
&lt;td&gt;Month 16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reviews (basic)&lt;/td&gt;
&lt;td&gt;₹400&lt;/td&gt;
&lt;td&gt;₹4,800&lt;/td&gt;
&lt;td&gt;₹12,000&lt;/td&gt;
&lt;td&gt;Month 30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total (all 8)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;₹3,450&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;₹41,400&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;₹40,000&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For the first six features — size chart through custom popup — custom code pays for itself within 9 months. For wishlists and reviews, the app is cheaper unless you're planning to run the store for 2+ years without changing providers.&lt;/p&gt;

&lt;p&gt;The sweet spot: &lt;strong&gt;replace simple apps with custom code, keep complex apps as subscriptions.&lt;/strong&gt; In this example, replacing just the first 6 saves ₹19,400 in the first year and ₹28,600 every year after.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Shopify Customizations: App vs Code
&lt;/h2&gt;

&lt;p&gt;Here's a practical decision for the 12 most common store customizations:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Customization&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Size chart&lt;/td&gt;
&lt;td&gt;Custom code&lt;/td&gt;
&lt;td&gt;Static content, simple implementation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trust badges&lt;/td&gt;
&lt;td&gt;Custom code&lt;/td&gt;
&lt;td&gt;HTML/CSS only, no logic needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Announcement bar&lt;/td&gt;
&lt;td&gt;Custom code&lt;/td&gt;
&lt;td&gt;Unless you need A/B testing or scheduling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FAQ page/accordion&lt;/td&gt;
&lt;td&gt;Custom code&lt;/td&gt;
&lt;td&gt;Basic HTML/JS, no ongoing changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product tabs&lt;/td&gt;
&lt;td&gt;Custom code&lt;/td&gt;
&lt;td&gt;Theme modification, one-time setup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exit-intent popup&lt;/td&gt;
&lt;td&gt;Depends&lt;/td&gt;
&lt;td&gt;Simple popup = code. Smart triggers/A/B testing = app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wishlist&lt;/td&gt;
&lt;td&gt;App&lt;/td&gt;
&lt;td&gt;Needs user accounts, persistence, email triggers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product reviews&lt;/td&gt;
&lt;td&gt;App&lt;/td&gt;
&lt;td&gt;UGC management, photo moderation, email requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upsell/cross-sell&lt;/td&gt;
&lt;td&gt;App&lt;/td&gt;
&lt;td&gt;Needs AI recommendations, A/B testing, analytics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email marketing&lt;/td&gt;
&lt;td&gt;App&lt;/td&gt;
&lt;td&gt;Entire platform, not a theme feature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subscription/recurring&lt;/td&gt;
&lt;td&gt;App&lt;/td&gt;
&lt;td&gt;Payment processing, customer portal, dunning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live chat&lt;/td&gt;
&lt;td&gt;App&lt;/td&gt;
&lt;td&gt;Real-time infrastructure, agent dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How to Evaluate a Shopify App Before Installing
&lt;/h2&gt;

&lt;p&gt;Before you click "Add app," run through this checklist:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check the JavaScript payload.&lt;/strong&gt; Use Chrome DevTools (Network tab) on a demo store or the app's own website. If the app adds more than 100KB of JavaScript, think twice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the 1-star reviews.&lt;/strong&gt; Not to find problems — every app has some — but to see how the developer responds. Slow or dismissive responses = avoid.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Look at the update history.&lt;/strong&gt; An app last updated 6+ months ago on a platform that changes quarterly is a risk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test on PageSpeed Insights before and after.&lt;/strong&gt; Install the app on a dev store, run Lighthouse, compare scores. If it drops more than 5 points, that's a red flag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calculate the 2-year cost.&lt;/strong&gt; ₹500/month feels small. ₹12,000 over two years feels different. Compare against a one-time custom build.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check for theme conflicts.&lt;/strong&gt; Does the app modify your theme files directly? If yes, updating your theme later could break the app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify the uninstall process.&lt;/strong&gt; Some apps leave code snippets in your theme even after uninstall. Check their docs for cleanup instructions.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Finding a Good Shopify Developer
&lt;/h2&gt;

&lt;p&gt;If you're going the custom code route, the developer matters more than the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to look for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Liquid expertise specifically.&lt;/strong&gt; A great React developer who's never touched Shopify will struggle. Liquid is its own templating language with specific patterns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Theme architecture knowledge.&lt;/strong&gt; They should understand sections, blocks, schema settings, and the Online Store 2.0 structure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance awareness.&lt;/strong&gt; Ask how they'd minimize render-blocking resources. If they can't answer clearly, keep looking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A portfolio of Shopify work.&lt;/strong&gt; Not just "web development" — actual Shopify stores they've built or customized.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Red flags:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They want to install an app instead of writing code (for simple features).&lt;/li&gt;
&lt;li&gt;They can't explain the difference between &lt;code&gt;theme.liquid&lt;/code&gt; and a section file.&lt;/li&gt;
&lt;li&gt;They quote a timeline before understanding the requirement.&lt;/li&gt;
&lt;li&gt;They don't mention testing on mobile.&lt;/li&gt;
&lt;li&gt;They can't provide a staging/dev store for review before pushing live.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Liquid Basics: What Non-Developers Should Know
&lt;/h2&gt;

&lt;p&gt;You don't need to become a developer, but understanding Liquid at a conceptual level helps you make better decisions and evaluate proposals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Liquid&lt;/strong&gt; is Shopify's templating language. It lets you insert dynamic data (product names, prices, variant options) into HTML templates.&lt;/p&gt;

&lt;p&gt;Three things it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Objects&lt;/strong&gt; pull data: &lt;code&gt;{{ product.title }}&lt;/code&gt; displays the product name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tags&lt;/strong&gt; add logic: &lt;code&gt;{% if product.available %}&lt;/code&gt; shows content only if in stock.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filters&lt;/strong&gt; transform data: &lt;code&gt;{{ product.price | money }}&lt;/code&gt; formats the price with currency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every Shopify theme is built with Liquid files (&lt;code&gt;.liquid&lt;/code&gt; extension). When a developer says they'll "add custom Liquid," they mean they'll edit or create these template files to add your feature directly into the theme — no external app, no extra JavaScript, no monthly fee.&lt;/p&gt;

&lt;p&gt;The key insight: &lt;strong&gt;most simple customizations are just Liquid + CSS.&lt;/strong&gt; A size chart is a Liquid snippet that renders an HTML table with CSS styling. A trust badge section is an image and text in a Liquid section with theme editor settings. These aren't complex engineering tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migration: Replacing Apps with Custom Code
&lt;/h2&gt;

&lt;p&gt;If you're already running a store with too many apps, here's how to clean house without breaking anything:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Audit your current apps.&lt;/strong&gt;&lt;br&gt;
Go to Settings &amp;gt; Apps and sales channels. List every app, its monthly cost, and what it does. Be specific — "adds size chart to product pages" not just "size chart."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Categorize each app.&lt;/strong&gt;&lt;br&gt;
Mark each as "keep" (complex, evolving, worth the subscription) or "replace" (simple, static, could be custom code).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Prioritize by cost and simplicity.&lt;/strong&gt;&lt;br&gt;
Start with the easiest, most expensive apps to replace. A ₹500/month trust badge app that's just displaying images is a quick win.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Build replacements on a development theme.&lt;/strong&gt;&lt;br&gt;
Never modify your live theme directly. Duplicate it, build the custom replacements, and test thoroughly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Test everything.&lt;/strong&gt;&lt;br&gt;
Check on mobile, tablet, and desktop. Test across browsers. Verify that the custom code works with your other apps (the ones you're keeping).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Deploy and uninstall.&lt;/strong&gt;&lt;br&gt;
Publish the updated theme, verify everything works on production, then uninstall the replaced apps one at a time. Wait 24 hours between each uninstall to catch issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 7: Clean up leftover code.&lt;/strong&gt;&lt;br&gt;
Many apps inject code into your theme files during installation. After uninstalling, check &lt;code&gt;theme.liquid&lt;/code&gt;, &lt;code&gt;product.liquid&lt;/code&gt;, and other templates for orphaned app snippets. Remove them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 8: Run a final performance test.&lt;/strong&gt;&lt;br&gt;
Compare your Lighthouse scores before and after the migration. Document the improvement — it's satisfying, and it justifies the investment.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Will custom code break when Shopify updates my theme?&lt;/strong&gt;&lt;br&gt;
It depends on how it's built. Code written as standalone sections and snippets (the correct approach) survives theme updates. Code that modifies core theme files may need adjustment. A good developer builds for durability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I edit custom Liquid code myself?&lt;/strong&gt;&lt;br&gt;
Simple changes like updating text, swapping images, or adjusting colors — yes, if the developer builds it with theme editor settings. Complex logic changes will need a developer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I know if an app is slowing down my store?&lt;/strong&gt;&lt;br&gt;
Install the app on a test/dev store and run Google PageSpeed Insights before and after. Or use Chrome DevTools' Network tab to see exactly what scripts the app loads and how long they take.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it worth replacing a ₹200/month app?&lt;/strong&gt;&lt;br&gt;
Do the math. If custom code costs ₹3,000, you'll break even in 15 months. If you plan to run the store for 2+ years, yes. If you might close or pivot in 6 months, keep the app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What about Shopify's built-in features?&lt;/strong&gt;&lt;br&gt;
Shopify keeps adding native functionality (metafields, sections everywhere, built-in markets). Before installing an app or commissioning custom code, check if Shopify already does it. Many store owners are paying for apps that duplicate features Shopify added in recent updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can apps and custom code coexist?&lt;/strong&gt;&lt;br&gt;
Absolutely. The hybrid approach is ideal. Use apps for complex features and custom code for simple ones. Just ensure your developer tests compatibility with your installed apps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How long does it take to replace an app with custom code?&lt;/strong&gt;&lt;br&gt;
Simple features (size chart, trust badges, FAQ): 1–2 days. Medium complexity (custom product page layout, advanced filtering): 3–5 days. The timeline depends on the feature, not the developer's speed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I replace all my apps at once?&lt;/strong&gt;&lt;br&gt;
No. Migrate one at a time, test thoroughly between each replacement, and keep your old app active until you've verified the custom code works perfectly. Rushing this process causes preventable downtime.&lt;/p&gt;




&lt;p&gt;Want to audit your Shopify apps and identify what can be replaced with custom code? We'll analyze your store's performance and create an optimization plan. &lt;a href="https://dev.to/contact"&gt;Get your free store audit&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://innovatrixinfotech.com/blog/shopify-theme-customization-apps-vs-custom-code?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog" rel="noopener noreferrer"&gt;Innovatrix Infotech&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>customization</category>
      <category>theme</category>
      <category>apps</category>
    </item>
    <item>
      <title>How to Use Claude Code: A Real Developer's Setup Guide (Not the Docs Version)</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Thu, 16 Jul 2026 04:30:02 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/how-to-use-claude-code-a-real-developers-setup-guide-not-the-docs-version-2i0k</link>
      <guid>https://dev.to/emperorakashi20/how-to-use-claude-code-a-real-developers-setup-guide-not-the-docs-version-2i0k</guid>
      <description>&lt;p&gt;Most developers read the official Claude Code docs, install it, type a vague prompt, get confused output, and conclude the tool is overhyped.&lt;/p&gt;

&lt;p&gt;We've been running Claude Code across a 12-person development team at &lt;a href="https://innovatrixinfotech.com" rel="noopener noreferrer"&gt;Innovatrix Infotech&lt;/a&gt; — building Shopify stores, Next.js applications, and React Native apps for clients. What we've learned is that the tool isn't the variable. The setup is.&lt;/p&gt;

&lt;p&gt;This guide skips everything that's already in the docs and gets straight to what actually matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Installation Decision That Trips Up Most Teams
&lt;/h2&gt;

&lt;p&gt;The official Anthropic documentation shows two installation paths: npm global install (&lt;code&gt;npm install -g @anthropic-ai/claude-code&lt;/code&gt;) and the native installer.&lt;/p&gt;

&lt;p&gt;Use the native installer. Every time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS/Linux&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://claude.ai/install.sh | sh

&lt;span class="c"&gt;# Or via Homebrew&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;claude-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The npm approach works, but it creates a dependency on your Node.js version and doesn't auto-update. When you're managing a team and you want everyone on the same version without anyone thinking about it, the native installer handles that invisibly. We switched to it across our entire team after too many "it worked for me but not for you" conversations traced back to version mismatches.&lt;/p&gt;

&lt;p&gt;On Windows, use the PowerShell equivalent. Claude Code works on Windows 11 — avoid WSL if you can, the file system overhead is real on large codebases.&lt;/p&gt;

&lt;h2&gt;
  
  
  CLAUDE.md Is Not Optional — It's the Whole Game
&lt;/h2&gt;

&lt;p&gt;The single highest-leverage thing you can do before writing a single prompt is investing 30–45 minutes in a CLAUDE.md file. This file lives at the root of your repository and tells Claude Code everything it needs to know about how your project works.&lt;/p&gt;

&lt;p&gt;Here's a template we use for Next.js projects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Project Overview&lt;/span&gt;
[Client name] ecommerce platform — Next.js 15 with TypeScript, Tailwind CSS, and a headless Shopify backend via the Storefront API.

&lt;span class="gh"&gt;# Tech Stack&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Frontend: Next.js 15, TypeScript, Tailwind CSS
&lt;span class="p"&gt;-&lt;/span&gt; Backend: Next.js API routes, Shopify Storefront API
&lt;span class="p"&gt;-&lt;/span&gt; Auth: NextAuth.js
&lt;span class="p"&gt;-&lt;/span&gt; Testing: Vitest, React Testing Library
&lt;span class="p"&gt;-&lt;/span&gt; Deployment: Vercel

&lt;span class="gh"&gt;# Key Commands&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`npm run dev`&lt;/span&gt; — Start dev server on port 3000
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`npm run test`&lt;/span&gt; — Run all tests
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`npm run lint`&lt;/span&gt; — ESLint + TypeScript type check
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`npm run build`&lt;/span&gt; — Production build

&lt;span class="gh"&gt;# Code Standards&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Functional components only — no class components
&lt;span class="p"&gt;-&lt;/span&gt; Named exports preferred over default exports
&lt;span class="p"&gt;-&lt;/span&gt; Tailwind utility classes only — no custom CSS files
&lt;span class="p"&gt;-&lt;/span&gt; All API calls must go through &lt;span class="sb"&gt;`/lib/api/`&lt;/span&gt; — never call Shopify directly from components

&lt;span class="gh"&gt;# Key Architecture&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`/app`&lt;/span&gt; — App Router pages and layouts
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`/components`&lt;/span&gt; — Shared UI components (atomic, no business logic)
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`/features`&lt;/span&gt; — Feature-specific components and hooks
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`/lib`&lt;/span&gt; — API clients, utilities, type definitions

&lt;span class="gh"&gt;# Workflow Rules&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Create feature branches before any changes
&lt;span class="p"&gt;-&lt;/span&gt; Run tests before committing
&lt;span class="p"&gt;-&lt;/span&gt; Never modify &lt;span class="sb"&gt;`/lib/api/shopify.ts`&lt;/span&gt; without testing against staging first
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What makes a CLAUDE.md file actually useful isn't length — it's precision. The Anthropic best practices docs put it well: for each line, ask whether removing it would cause Claude to make mistakes. If not, cut it. An overly long CLAUDE.md is worse than a concise one because Claude loses track of the important rules buried in the noise.&lt;/p&gt;

&lt;p&gt;One pattern we've adopted: run &lt;code&gt;/init&lt;/code&gt; on a new repo first to get an auto-generated CLAUDE.md baseline, then heavily edit it down. The auto-generated version catches things you'd forget to document but tends to be verbose.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Explore-Plan-Code-Commit Workflow
&lt;/h2&gt;

&lt;p&gt;The docs mention this workflow. What the docs don't emphasize enough is that &lt;strong&gt;Plan Mode is the difference between Claude Code being useful and Claude Code being dangerous on a shared codebase&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Before Claude touches any code in a session:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explore&lt;/strong&gt;: Point Claude at the relevant files and ask it to explain what it sees before doing anything. Critical on projects you inherited.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plan&lt;/strong&gt;: Switch to Plan Mode (&lt;code&gt;Shift+Tab&lt;/code&gt; twice from Normal Mode — it cycles through Normal → Auto-Accept → Plan Mode). Ask Claude to plan the change, then read the plan. If the plan touches files you didn't expect, ask why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code&lt;/strong&gt;: Let Claude execute. Review the diff before accepting anything that touches shared components.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Commit&lt;/strong&gt;: Commit after each logical change, not at the end of a long session. If Claude made a mistake, you want a clean revert point.&lt;/p&gt;

&lt;p&gt;The most expensive mistake we've made with Claude Code is running it in Auto-Accept mode on a shared component that cascaded changes through 20 files. The fix took longer than the original task. Plan Mode would have caught it in 30 seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP Servers: Where Claude Code Becomes a Real Workflow Tool
&lt;/h2&gt;

&lt;p&gt;The native Claude Code installation gives you the ability to connect MCP (Model Context Protocol) servers, which give Claude direct access to your development environment. For a web agency, the practical wins here are significant.&lt;/p&gt;

&lt;p&gt;For our Directus CMS work, we connect an MCP server so Claude Code can read the schema, query collections, and understand the full data structure when writing API integration code — without us having to copy-paste schema dumps into every prompt.&lt;/p&gt;

&lt;p&gt;To add an MCP server, edit &lt;code&gt;.claude/settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"directus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://your-cms.domain.com/mcp?access_token=YOUR_TOKEN"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Shopify work, MCP servers connect to the Partner API. For Next.js projects with a database, connecting Supabase or Postgres via MCP means Claude Code can generate correct queries against your actual schema instead of hallucinating field names.&lt;/p&gt;

&lt;h2&gt;
  
  
  Context Management for Long Sessions
&lt;/h2&gt;

&lt;p&gt;Claude Code compresses its context window during long sessions — the equivalent of an intern who loses track of early decisions as the day goes on. Two patterns help:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session notes&lt;/strong&gt;: Keep a running &lt;code&gt;.claude/session-notes.md&lt;/code&gt; that captures architectural decisions made during the session. Point Claude to this file at the start of any continuation session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Worktree isolation&lt;/strong&gt;: For complex features that require parallel work, Claude Code supports git worktrees with the &lt;code&gt;--worktree&lt;/code&gt; flag. Each worktree gets an isolated context, which prevents debugging conversations from bleeding into architecture decisions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start Claude in an isolated worktree for a specific feature&lt;/span&gt;
claude &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"implement the new product filter component"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What Nobody Tells You About Team Adoption
&lt;/h2&gt;

&lt;p&gt;The hardest part of rolling Claude Code out to a team isn't the technical setup. It's calibrating what level of autonomy to grant in different contexts.&lt;/p&gt;

&lt;p&gt;Our current framework for a 12-person team:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Greenfield features with good test coverage&lt;/strong&gt;: Auto-Accept mode is fine. Claude has a safety net.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared components or library code&lt;/strong&gt;: Plan Mode only. Review every diff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Legacy code without tests&lt;/strong&gt;: Explore only — never let Claude auto-edit legacy code without a human reviewing the plan in detail.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New repository&lt;/strong&gt;: Always start with &lt;code&gt;/init&lt;/code&gt; to generate CLAUDE.md, then edit before running any tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As an Official &lt;a href="https://innovatrixinfotech.com/services/shopify-development" rel="noopener noreferrer"&gt;Shopify Partner&lt;/a&gt; and DPIIT-recognised startup, we build under real client SLAs. Claude Code is a productivity multiplier when used with discipline — and a liability when treated as autocomplete on steroids.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do I need a paid Claude plan to use Claude Code?&lt;/strong&gt;&lt;br&gt;
Yes. Claude Code requires Claude Pro ($20/month) at minimum. For teams, API pricing is often more cost-effective at scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Claude Code work without an internet connection?&lt;/strong&gt;&lt;br&gt;
No. Claude Code is cloud-based and requires connectivity. For air-gapped environments, look at Tabnine or self-hosted Ollama with Cline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I prevent Claude Code from modifying files I don't want touched?&lt;/strong&gt;&lt;br&gt;
Add explicit rules to your CLAUDE.md: "Never modify &lt;code&gt;/lib/api/shopify.ts&lt;/code&gt; without explicit instruction." You can also use &lt;code&gt;--allowed-paths&lt;/code&gt; to restrict which directories Claude can write to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the difference between Normal Mode, Auto-Accept, and Plan Mode?&lt;/strong&gt;&lt;br&gt;
Normal Mode asks for permission before each file edit. Auto-Accept applies edits without prompting. Plan Mode produces a plan without executing. Use Plan Mode for anything touching shared components.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can Claude Code write tests, not just features?&lt;/strong&gt;&lt;br&gt;
Yes, and it does this well. Add a custom command in &lt;code&gt;.claude/commands/write-tests.md&lt;/code&gt; with your testing patterns and Claude Code generates tests that match your existing test style.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is my code sent to Anthropic and used for training?&lt;/strong&gt;&lt;br&gt;
API and Claude Code usage is not used for training by default. Verify in Anthropic's privacy documentation. Enterprise plans offer additional data processing agreements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does Claude Code handle monorepos?&lt;/strong&gt;&lt;br&gt;
Set CLAUDE.md at the monorepo root with workspace-level conventions, then create separate CLAUDE.md files in each package directory for package-specific rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the best way to use Claude Code for code reviews?&lt;/strong&gt;&lt;br&gt;
Point Claude at a diff: &lt;code&gt;claude "review the changes in this PR for security issues and edge cases"&lt;/code&gt; with the diff piped in. Best at catching edge cases — pair it with ESLint for stylistic issues.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Rishabh Sethia, Founder &amp;amp; CEO of Innovatrix Infotech. Former SSE/Head of Engineering. DPIIT Recognized Startup.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://innovatrixinfotech.com/blog/how-to-use-claude-code-real-developer-setup-guide?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog" rel="noopener noreferrer"&gt;Innovatrix Infotech&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>aicoding</category>
      <category>developertools</category>
      <category>setupguide</category>
    </item>
    <item>
      <title>OpenAI Codex in 2026: What It Can Do, What It Can't, and When to Use It</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Wed, 15 Jul 2026 04:30:01 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/openai-codex-in-2026-what-it-can-do-what-it-cant-and-when-to-use-it-3opj</link>
      <guid>https://dev.to/emperorakashi20/openai-codex-in-2026-what-it-can-do-what-it-cant-and-when-to-use-it-3opj</guid>
      <description>&lt;p&gt;OpenAI Codex has had a genuinely interesting evolution. When it launched in April 2025, it was positioned as a cloud-based coding agent — a meaningful departure from the original 2021 Codex API that most developers know from GitHub Copilot's early days. By early 2026, it's matured enough to be a serious tool, but it's also well-defined enough that its limitations are clear.&lt;/p&gt;

&lt;p&gt;This isn't a restatement of the official documentation. It's what the tool actually does, where it falls short, and how to decide whether it belongs in your stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Codex Actually Is in 2026
&lt;/h2&gt;

&lt;p&gt;Codex is a cloud-based software engineering agent. The key word is &lt;em&gt;cloud-based&lt;/em&gt;. Unlike Claude Code (which runs in your local terminal and touches your filesystem directly) or Cursor (which is an IDE you run on your machine), Codex operates entirely in isolated cloud sandboxes. You connect your GitHub repository, queue tasks, and the agent works asynchronously in its own environment.&lt;/p&gt;

&lt;p&gt;The current default model is GPT-5.4-Codex — OpenAI's most capable frontier model for professional work — which brings a 1M context window and native computer-use capabilities for complex, long-horizon tasks. Each task runs in a sandboxed container preloaded with your repository and configured dependencies, and you can queue multiple tasks to run in parallel. When Codex finishes, it commits its changes to a branch and provides you with a diff, terminal logs, and test results as verifiable evidence of what it did.&lt;/p&gt;

&lt;p&gt;The March 2026 desktop app for macOS and Windows added a visual supervision layer that made managing parallel agent threads genuinely practical. Before the desktop app, the web interface worked but felt like a compromise. Now it's closer to a proper workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Codex Does Well
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Batch maintenance tasks.&lt;/strong&gt; This is Codex's strongest use case. Renaming patterns across a large codebase, updating deprecated API calls, standardising error handling, migrating configuration formats — tasks where the pattern is clear and repetitive. When there's a failing test and a clear bug description, Codex's approach of making the test pass without breaking anything else works reliably.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Background delegation.&lt;/strong&gt; When you're in a flow state on one problem and don't want to context-switch, queuing a well-scoped task to Codex and reviewing the output later is genuinely productive. OpenAI's internal teams use this model: triage on-call issues, plan tasks at day start, and offload background work to keep focus.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PR scaffolding and documentation.&lt;/strong&gt; Codex handles writing features, answering questions about the codebase, fixing bugs, and proposing pull requests. Task completion typically takes between 1 and 30 minutes depending on complexity, and each task runs independently in its own environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parallel execution.&lt;/strong&gt; The ability to run 4–5 tasks simultaneously is a real differentiator for certain workflows. If you're working on a multi-sprint project and want to queue several independent tickets in parallel, this is a capability neither Claude Code nor Cursor offers in the same way.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Codex Doesn't Do Well
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Real-time interactive coding.&lt;/strong&gt; Codex isn't built for the experience of typing and having AI suggestions appear inline. The workflow is fundamentally asynchronous — you queue a task, it runs, you review the output. If you want AI assistance while you're actively writing code, this isn't the tool. Claude Code or Cursor will serve that use case far better.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frontend work without visual context.&lt;/strong&gt; As OpenAI themselves acknowledge, Codex currently lacks image inputs for frontend work. If you're building UI and need to match a Figma design or debug a visual layout issue, Codex can't see what you're seeing. This is a meaningful gap for frontend-heavy agencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Air-gapped or offline work.&lt;/strong&gt; Every Codex task runs in a cloud sandbox with your repository preloaded. If your project can't be on GitHub, or if you're working in an environment where internet access is restricted, Codex doesn't work at all. For client projects with strict data residency requirements, this becomes a blocker.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mid-task course correction.&lt;/strong&gt; While recent versions improved the ability to steer tasks in progress, it's still not as fluid as Claude Code's interactive session model. Delegating to a remote agent takes longer than interactive editing, and getting used to that latency is a real behavioural shift.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model selection control.&lt;/strong&gt; The system routes tasks based on complexity, and you don't choose which model handles which task directly. Cursor's explicit model selection — choosing Claude Opus for architectural reasoning versus a faster model for routine work — is more transparent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing and Access in 2026
&lt;/h2&gt;

&lt;p&gt;Codex is included with ChatGPT Plus, Pro, Business, and Enterprise plans. Plus users get rate-limited access; Pro and Business get more generous allocation. When you hit limits, there's a smaller model (GPT-5.4-Codex-Mini) that provides roughly 4x more usage within your subscription.&lt;/p&gt;

&lt;p&gt;For developers building directly with the models, the API offers &lt;code&gt;codex-mini-latest&lt;/code&gt; at $1.50 per million input tokens and $6 per million output tokens, with a 75% prompt caching discount on repeated context — which matters a lot for large codebases.&lt;/p&gt;

&lt;p&gt;The desktop app is free with any qualifying subscription. The CLI, IDE extension, and Codex Cloud web interface are all included.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Codex Fits in a Real Dev Workflow
&lt;/h2&gt;

&lt;p&gt;As a DPIIT-recognised startup running a 12-person team across Shopify builds, Next.js platforms, and React Native projects, we've found a clear pattern: Codex works best as a delegated background worker, not as your primary coding assistant.&lt;/p&gt;

&lt;p&gt;The mental model that works is treating Codex like a well-briefed contractor. Give it clear, scoped tasks. Write context files that explain your project conventions. Review the output as you would a PR. Don't expect it to function as an interactive pair programmer — that's not what it was built for.&lt;/p&gt;

&lt;p&gt;For agencies doing intensive development where time-to-review matters, combining Codex for delegated batch work with Claude Code for interactive complex sessions and Copilot for daily inline work is the stack that actually makes sense. Each tool serves a distinct role rather than competing for the same use case.&lt;/p&gt;

&lt;p&gt;The Codex desktop app's visual dashboard, showing running, queued, and completed tasks across projects, is worth spending time with if you're considering it seriously. The workflow shift it enables — treating coding tasks like a queue rather than a stream — is real, but it requires building new habits around task scoping and review cadence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where This Leaves Things
&lt;/h2&gt;

&lt;p&gt;Codex is a solid tool for what it does. Cloud-based async task execution, parallel work streams, auditable outputs. The fact that it runs on GPT-5.4, the same model powering OpenAI's most capable professional workflows, means the quality ceiling is high.&lt;/p&gt;

&lt;p&gt;What it's not is a replacement for interactive AI coding tools. It occupies a specific niche: well-scoped background work that doesn't require you to be present while it runs. If that's a bottleneck in your current workflow, it's worth evaluating seriously. If you primarily need AI that helps you while you're actively coding, look at Cursor or Claude Code instead.&lt;/p&gt;

&lt;p&gt;For dev teams interested in how we're building &lt;a href="https://dev.to/services/ai-automation"&gt;AI automation workflows&lt;/a&gt; and using tools like this in production, our &lt;a href="https://dev.to/services/shopify-development"&gt;Shopify development&lt;/a&gt; engagements often involve exactly the kind of multi-tool AI stack we've described here.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is the 2026 Codex the same as the original OpenAI Codex API from 2021?&lt;/strong&gt;&lt;br&gt;
No — they share a name but are fundamentally different. The original Codex was a code completion model powering early Copilot. The current Codex is a full cloud-based coding agent built on GPT-5.4. The 2021 model was deprecated in 2023.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Codex support private repositories?&lt;/strong&gt;&lt;br&gt;
Yes. You connect Codex to your GitHub account, including private repos. Tasks run in isolated sandboxes with internet access disabled during execution, so your code doesn't leave the sandbox to hit external APIs mid-task.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How is Codex different from Claude Code?&lt;/strong&gt;&lt;br&gt;
Codex is cloud-based and asynchronous — you queue tasks and review results later. Claude Code runs locally in your terminal and is interactive and real-time. Claude Code handles complex multi-step reasoning in an active session. Codex handles delegated background work in parallel. Most serious teams use both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens when Codex makes a mistake?&lt;/strong&gt;&lt;br&gt;
Codex creates a new branch rather than committing to main, so mistakes are contained. It provides terminal logs, test output, and a diff for every task, giving you full visibility into what it did before you merge anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can Codex work on Shopify Liquid codebases?&lt;/strong&gt;&lt;br&gt;
Yes, though you'll want detailed context files explaining your theme architecture and any Shopify-specific patterns like metafield structures and cart AJAX. Without that context, Codex may generate generic patterns rather than Shopify-native ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Codex replace a CI/CD pipeline?&lt;/strong&gt;&lt;br&gt;
No. It generates code and PRs, but your CI/CD pipeline still handles testing, linting, deployment, and approval workflows. Codex is an input to the pipeline, not a replacement for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Codex suitable for regulated industries like fintech or healthcare?&lt;/strong&gt;&lt;br&gt;
For highly regulated environments, check OpenAI's enterprise data handling agreements. Codex runs in cloud sandboxes, which means code is processed on OpenAI's infrastructure. Air-gapped deployments aren't supported. Enterprise contracts can include data processing agreements that may satisfy compliance requirements, but verify before committing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the main reason teams avoid Codex?&lt;/strong&gt;&lt;br&gt;
The asynchronous workflow takes adjustment. Developers used to real-time AI assistance find the queue-and-review model unintuitive at first. If your primary need is inline code completion while actively writing, Codex isn't the right fit.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Rishabh Sethia, Founder &amp;amp; CEO of Innovatrix Infotech. Former SSE/Head of Engineering. DPIIT Recognized Startup.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://innovatrixinfotech.com/blog/openai-codex-2026-what-it-can-do?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog" rel="noopener noreferrer"&gt;Innovatrix Infotech&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>openaicodex</category>
      <category>aicodingtools</category>
      <category>gpt5codex</category>
      <category>developertools</category>
    </item>
    <item>
      <title>Cursor vs GitHub Copilot vs Claude Code: The Honest Breakdown for Dev Teams</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Tue, 14 Jul 2026 04:30:01 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/cursor-vs-github-copilot-vs-claude-code-the-honest-breakdown-for-dev-teams-44ke</link>
      <guid>https://dev.to/emperorakashi20/cursor-vs-github-copilot-vs-claude-code-the-honest-breakdown-for-dev-teams-44ke</guid>
      <description>&lt;p&gt;Three tools dominate the serious AI coding conversation in 2026: GitHub Copilot, Cursor, and Claude Code. They're not interchangeable. Choosing the wrong one creates real friction — in daily workflow, in team onboarding, in actual cost. Choosing the right one is a measurable advantage.&lt;/p&gt;

&lt;p&gt;This comparison is based on running all three across our 12-person team at Innovatrix Infotech on real client projects — Shopify theme builds, Next.js platforms, React Native apps. Not benchmarks or press summaries. Actual use.&lt;/p&gt;

&lt;p&gt;The short version: each tool has a different answer to the same question. What should AI actually &lt;em&gt;do&lt;/em&gt; while a developer is working?&lt;/p&gt;

&lt;p&gt;Copilot answers: assist, inline, everywhere. Cursor answers: understand the whole codebase, apply changes coherently. Claude Code answers: execute complex tasks autonomously, without constant oversight.&lt;/p&gt;




&lt;h2&gt;
  
  
  GitHub Copilot: The Universal Standard
&lt;/h2&gt;

&lt;p&gt;Copilot is the original mainstream AI coding assistant — launched by GitHub (Microsoft) in 2021, now powered by a rotating selection of models including OpenAI and Anthropic models depending on task type.&lt;/p&gt;

&lt;p&gt;Its core experience is inline autocomplete. As you type, Copilot suggests completions from single tokens to entire functions. It integrates natively across every major editor — VS Code, the complete JetBrains suite, Visual Studio 2022, Xcode, Eclipse, Neovim, Azure Data Studio — which is a genuine differentiator when you have a team using different IDEs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where Copilot excels:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inline boilerplate generation: API endpoints, database queries, component scaffolding, TypeScript interfaces, test stubs&lt;/li&gt;
&lt;li&gt;GitHub ecosystem integration: PR summaries, Autofix in Actions, Copilot Workspace&lt;/li&gt;
&lt;li&gt;IP indemnity protection at the Business tier ($19/user/month) — a real enterprise requirement that neither Cursor nor Claude Code provides&lt;/li&gt;
&lt;li&gt;Maximum IDE compatibility for mixed teams&lt;/li&gt;
&lt;li&gt;Free tier available for verified students and open-source maintainers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where Copilot falls short:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-file coordination: when you need a pattern applied consistently across a codebase, Copilot's file-level focus becomes limiting. It doesn't understand how a change in one component affects the five components that consume it.&lt;/li&gt;
&lt;li&gt;Reasoning quality on complex architectural questions lags slightly behind Claude-based tools. Not dramatically, but noticeably on hard problems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; $10/month (Copilot Starter) or $19/month (Copilot Pro) for individuals; $19/user/month (Business) or $39/user/month (Enterprise) for teams. Included in GitHub's higher-tier organisation plans.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose Copilot if:&lt;/strong&gt; Your team spans multiple IDEs, you need enterprise compliance features (IP indemnity, SSO, audit logs), you're already deep in the GitHub ecosystem, or you want the lowest-cost AI coding baseline for a larger team.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cursor: The IDE That Understands Your Codebase
&lt;/h2&gt;

&lt;p&gt;Cursor is a fork of VS Code with AI built into the core of the editor rather than bolted on as an extension. Its defining capability is codebase indexing — it semantically indexes your entire project so the AI understands relationships between files, components, functions, and patterns.&lt;/p&gt;

&lt;p&gt;Composer mode is the feature that generates the strongest reactions from developers who switch. Describe a change, point Composer at the relevant directories, and it plans and applies the change coherently across as many files as the task requires. It understands which components consume the interfaces being modified, which tests cover the code being touched, and which utilities already implement similar patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where Cursor excels:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-file refactoring and large feature work: making consistent changes across complex codebases is where Cursor is genuinely ahead&lt;/li&gt;
&lt;li&gt;Model flexibility: you can explicitly choose which AI model handles which task (Claude Opus for architectural reasoning, a faster model for routine autocomplete)&lt;/li&gt;
&lt;li&gt;Codebase-aware context: the difference between suggestions based on "what's in this file" versus "what's in this project" is substantial on large codebases&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;/chat&lt;/code&gt; and inline edit experience for developers who prefer IDE-native interaction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where Cursor falls short:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VS Code only: if any team members use JetBrains, Visual Studio, or Xcode, they can't use Cursor. This either requires a tooling split or standardising everyone on VS Code.&lt;/li&gt;
&lt;li&gt;Code is indexed on Cursor's servers: privacy-sensitive teams may be wary, though you can opt out of training data usage&lt;/li&gt;
&lt;li&gt;Higher cost than Copilot for the same inline autocomplete use case&lt;/li&gt;
&lt;li&gt;Less mature enterprise compliance compared to Copilot's established SOC 2 Type 1 certification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Pro at $20/month (individual); Teams at $40/user/month (centralised billing, privacy controls, usage analytics). The recent shift to usage-based pricing for some tiers means heavy users should check current limits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose Cursor if:&lt;/strong&gt; Your team can standardise on VS Code, you're working on large TypeScript or Next.js codebases where codebase-wide context matters, you need multi-file refactoring capabilities regularly, or you want model flexibility rather than being locked to one provider.&lt;/p&gt;




&lt;h2&gt;
  
  
  Claude Code: The Autonomous Agent
&lt;/h2&gt;

&lt;p&gt;Claude Code is Anthropic's terminal-based coding agent. It's not an IDE extension or an autocomplete tool — it reads your entire codebase, makes multi-step changes, runs tests, commits code, and creates pull requests from natural language prompts. It operates from your terminal and touches your local filesystem directly.&lt;/p&gt;

&lt;p&gt;The 200K context window is genuinely useful on large codebases. During extended sessions, Claude Code can maintain awareness of architectural decisions made earlier in the conversation — something that matters when you're doing a substantial refactor over multiple hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where Claude Code excels:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Autonomous multi-step execution: write code, run tests, fix failures, commit, create PR — all without you reviewing every intermediate step&lt;/li&gt;
&lt;li&gt;Complex, long-horizon tasks that require understanding how many pieces fit together&lt;/li&gt;
&lt;li&gt;Terminal power users and agencies doing intensive autonomous development&lt;/li&gt;
&lt;li&gt;MCP server integration: connecting Claude Code directly to your CMS, database, or internal APIs via the Model Context Protocol gives it direct access to your actual data structures rather than requiring you to paste schemas into context&lt;/li&gt;
&lt;li&gt;GitHub Actions integration for automated PR review, issue triage, and CI-driven coding tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where Claude Code falls short:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No inline autocomplete: if you want suggestions as you type in your editor, you need a separate tool alongside Claude Code&lt;/li&gt;
&lt;li&gt;Terminal-first interface requires CLI comfort. If your team isn't comfortable in a terminal, the onboarding cost is real&lt;/li&gt;
&lt;li&gt;Mistakes can be larger in scope: because it acts autonomously, an incorrect direction can change more than you expected before you catch it. Plan Mode (Shift+Tab to enter) and careful diff review are essential habits&lt;/li&gt;
&lt;li&gt;No IDE integration beyond extensions for VS Code and JetBrains&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Claude Pro at $20/month for individuals; Teams plan for organisations. Heavy users doing intensive work often find the API pay-per-token model more economical than flat subscriptions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose Claude Code if:&lt;/strong&gt; You're building complex features that need autonomous multi-step execution, you lead a team where developer attention is the bottleneck, you're comfortable in the terminal, or you need the most capable agentic tool available regardless of interface.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Actually Pick
&lt;/h2&gt;

&lt;p&gt;For most serious dev teams, the honest answer is two tools rather than one. The tools don't fully overlap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The most common serious setup:&lt;/strong&gt; Claude Code for autonomous task execution + GitHub Copilot for inline daily assistance = $30/month per developer. You get both paradigms at a cost below Cursor Teams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For large Next.js/TypeScript projects where codebase context is the primary bottleneck:&lt;/strong&gt; Cursor Pro at $20/month gives you capabilities that neither Copilot nor Claude Code's terminal interface replicates in the same IDE-native way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For enterprise teams with compliance requirements:&lt;/strong&gt; GitHub Copilot Business at $19/user/month is the only option with IP indemnity and mature SOC 2 certifications at this price point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For agencies doing intensive work:&lt;/strong&gt; The combination we run on real client projects — Claude Code for heavy autonomous lifting, Copilot for daily inline coding, Cursor for sessions where codebase-wide context matters most — is the highest-capability setup. The total per-developer cost at this combination is higher, but the velocity gains on complex multi-sprint projects justify it.&lt;/p&gt;

&lt;p&gt;The choice between these tools isn't primarily about which one is "best." It's about which friction points are most expensive in your current workflow, and which capability gap costs you the most time.&lt;/p&gt;

&lt;p&gt;For teams we work with on &lt;a href="https://dev.to/services/shopify-development"&gt;Shopify builds&lt;/a&gt; and &lt;a href="https://dev.to/services/web-development"&gt;Next.js platforms&lt;/a&gt;, the answer depends on the project complexity, team IDE preferences, and whether autonomous execution or codebase-wide intelligence is the bigger bottleneck.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can I use all three tools simultaneously?&lt;/strong&gt;&lt;br&gt;
Technically yes — Copilot for inline editing, Claude Code in the terminal, and Cursor open as your IDE. In practice, paying for all three simultaneously gets expensive, and there's overlap between Cursor and Copilot for inline use. Pairing Claude Code with one of the other two is the more economical approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which handles Shopify Liquid best?&lt;/strong&gt;&lt;br&gt;
All three handle Liquid reasonably well, but Claude Code performs best because its large context window can fit entire themes at once. Cursor's indexing also works well for non-JavaScript projects. Copilot shines most on mainstream languages where its training data is richest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Cursor worth the extra cost over Copilot for a small team?&lt;/strong&gt;&lt;br&gt;
For teams working on complex codebases — large TypeScript projects, design systems, legacy code with tangled dependencies — the codebase-wide context Cursor provides often pays for itself quickly. For simpler projects like MVPs or small sites where the entire project fits in one developer's head, Copilot's cost and simplicity are hard to beat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which tool is best for junior developers?&lt;/strong&gt;&lt;br&gt;
GitHub Copilot. The IDE-native inline autocomplete is the lowest-friction entry point, doesn't require CLI comfort, and the instant feedback loop matters more at early career stages than autonomous execution. Claude Code's terminal interface has a real learning curve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does privacy work for each tool?&lt;/strong&gt;&lt;br&gt;
GitHub Copilot Business has the most mature enterprise controls with IP indemnity and you can opt out of training at the organisation level. Claude Code's API architecture keeps code within Anthropic's systems. Cursor indexes code on their servers but offers opt-out from training. For regulated industries, Copilot's established compliance certifications are the safest starting point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which tool handles React Native best?&lt;/strong&gt;&lt;br&gt;
Claude Code's large context window and autonomous execution are particularly useful for React Native projects, where platform-specific code paths (iOS/Android branches, native modules) can span many files. Cursor's codebase indexing also works well. Copilot is fine for individual component work but less useful for cross-platform architecture decisions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If I can only afford one, which should I pick?&lt;/strong&gt;&lt;br&gt;
For a solo developer or very small team: Claude Code ($20/month) if you're terminal-comfortable and do complex multi-file work; GitHub Copilot Pro ($19/month) if you want inline assistance without a terminal workflow change. Cursor Pro ($20/month) if you're doing large TypeScript/Next.js projects and codebase context is your bottleneck.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Rishabh Sethia, Founder &amp;amp; CEO of Innovatrix Infotech. Former SSE/Head of Engineering. DPIIT Recognized Startup.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://innovatrixinfotech.com/blog/cursor-vs-github-copilot-vs-claude-code-honest-breakdown?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog" rel="noopener noreferrer"&gt;Innovatrix Infotech&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cursor</category>
      <category>githubcopilot</category>
      <category>claudecode</category>
      <category>aicodingtools</category>
    </item>
    <item>
      <title>Why We Switched Our Dev Team to Cursor (And What We Miss About Copilot)</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Mon, 13 Jul 2026 09:30:01 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/why-we-switched-our-dev-team-to-cursor-and-what-we-miss-about-copilot-1459</link>
      <guid>https://dev.to/emperorakashi20/why-we-switched-our-dev-team-to-cursor-and-what-we-miss-about-copilot-1459</guid>
      <description>&lt;p&gt;We ran GitHub Copilot across our whole team for months. It worked. $10 per developer, clean IDE integration, no friction during onboarding. For most of our projects — smaller client builds, feature work that stayed mostly in one file — Copilot was exactly what it needed to be.&lt;/p&gt;

&lt;p&gt;The switch to Cursor wasn't driven by Copilot failing. It was driven by a single task that revealed the ceiling.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Task That Changed the Decision
&lt;/h2&gt;

&lt;p&gt;We were building a Next.js platform with 60+ components using App Router and TypeScript, with a custom Tailwind-based design system. The client needed standardised loading states across 23 button components. These components had been built incrementally by different developers, and the implementations were inconsistent — some used a &lt;code&gt;loading&lt;/code&gt; boolean, some had their own spinner logic, a few had no loading state at all.&lt;/p&gt;

&lt;p&gt;With Copilot, the workflow was: open each file, look at the suggestion, accept or adjust, close, next file. Copilot could suggest what a loading state should look like in the current component, but it had no awareness of the pattern we were establishing across the other 22. We had to mentally maintain that consistency ourselves.&lt;/p&gt;

&lt;p&gt;A team member suggested trying Cursor's Composer mode on the same task. The experience was different in a way that's hard to overstate.&lt;/p&gt;

&lt;p&gt;We described the loading state pattern once, pointed Composer at the component directory, and it planned the change across all 23 files with awareness of each component's existing interface. It identified two edge cases we'd missed — a button inside a form that needed different loading state handling, and a ghost variant that didn't take a &lt;code&gt;disabled&lt;/code&gt; prop the same way as the others. The entire refactor took about 20 minutes instead of most of an afternoon.&lt;/p&gt;

&lt;p&gt;That was the moment. Not because the task was impossible in Copilot, but because Cursor understood the problem as a codebase problem rather than 23 separate file problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Actually Different
&lt;/h2&gt;

&lt;p&gt;Copilot and Cursor both provide inline code completion and chat. The visible surface is similar enough that the switch feels incremental. But the underlying model of how AI interacts with your code is genuinely different.&lt;/p&gt;

&lt;p&gt;Copilot works at the file level. It sees the current file, the imports, some surrounding context — but it doesn't have a semantic model of the whole project. When you ask it to refactor something that touches multiple files, it can help you do that file by file. What it can't do is reason about the whole change at once.&lt;/p&gt;

&lt;p&gt;Cursor indexes the entire project semantically. When you ask it to make a change, it understands which components consume the interface being modified, which tests cover the affected code, and which utilities already implement similar patterns. The suggestions aren't “based on what you've typed” — they're based on how the change fits into everything.&lt;/p&gt;

&lt;p&gt;For our work — complex Shopify builds, large Next.js apps, React Native projects with shared component libraries — that distinction is the difference between a tool that assists you and a tool that understands your intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Trade-offs We Accepted
&lt;/h2&gt;

&lt;p&gt;Switching wasn't cost-free. We made deliberate trade-offs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost.&lt;/strong&gt; Cursor Pro is $20 per developer per month versus Copilot's $10. For our team, that's an extra $1,200 per year. We decided it was worth it, but it's not trivial, and for a larger team the number compounds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JetBrains.&lt;/strong&gt; Cursor is a VS Code fork. Two developers on our team use IntelliJ IDEA for certain Java-adjacent tooling. They still run Copilot — we have a split tool environment now. Cursor doesn't work in JetBrains, and that's not going to change any time soon. For teams with mixed IDEs, this is a real issue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup overhead.&lt;/strong&gt; Copilot works immediately after install. Cursor needs to index your project first — typically 2 to 5 minutes on a medium Next.js project, incremental after that — and for large monorepos you sometimes need to configure which directories to index. Not a big deal, but it's friction that Copilot doesn't have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub-native features.&lt;/strong&gt; Copilot's PR summary generation, Autofix in Actions, and Copilot Workspace integrations are genuinely good. We lost access to those when we shifted primary tools. Claude Code fills some of that gap for us, but it's worth acknowledging the loss.&lt;/p&gt;

&lt;h2&gt;
  
  
  When We Use What Now
&lt;/h2&gt;

&lt;p&gt;Most of the team runs Cursor as the primary IDE tool. For the two developers on JetBrains, it's still Copilot. Claude Code runs in the terminal for autonomous tasks — the kind of multi-step work where you write a clear prompt and want Claude to execute, test, and commit without constant review.&lt;/p&gt;

&lt;p&gt;The practical split is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cursor:&lt;/strong&gt; Large features on complex projects where codebase-aware suggestions matter, design system work, refactors that touch multiple components, anything where understanding the whole project is important&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copilot:&lt;/strong&gt; JetBrains users, GitHub Actions integrations, teams where IDE standardisation isn't feasible&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code:&lt;/strong&gt; Autonomous terminal execution for well-scoped tasks, heavy refactors where you want AI to work autonomously, MCP-connected sessions where Claude talks directly to our CMS or APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When Copilot Would Still Be the Right Call
&lt;/h2&gt;

&lt;p&gt;We don't recommend Cursor for every team or every project.&lt;/p&gt;

&lt;p&gt;For smaller, self-contained projects — MVPs, landing pages, simple client sites — the indexing overhead isn't justified. When the entire project fits in one developer's mental model, Cursor's codebase intelligence doesn't add proportional value. Copilot's cost and simplicity are more appropriate.&lt;/p&gt;

&lt;p&gt;For teams using multiple IDEs, Cursor's VS Code-only constraint is a hard blocker. A team where half the developers are on JetBrains can't standardise on Cursor without forcing an IDE switch that has its own significant cost.&lt;/p&gt;

&lt;p&gt;For teams where GitHub ecosystem integration — PR workflows, Actions, Copilot Workspace — is a real part of the workflow, Copilot's native integrations are better than anything Cursor offers in that space.&lt;/p&gt;

&lt;p&gt;As an Official Shopify Partner running projects across Shopify, Next.js, and React Native, we've found the decision hinges on project scale more than anything else. Complex builds with large component libraries justify the switch. Smaller engagements don't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Honest Takeaway
&lt;/h2&gt;

&lt;p&gt;Cursor is a better tool for our specific work. Complex projects, large codebases, codebase-wide consistency problems. For that category of work, the extra $10 per developer per month is clearly worth it.&lt;/p&gt;

&lt;p&gt;What we miss about Copilot: the zero-friction install, the GitHub-native integrations, and the fact that it works everywhere. Those aren't small things. Copilot is a very good tool that's the right choice for a large category of teams and projects.&lt;/p&gt;

&lt;p&gt;If you're evaluating the switch, the question isn't which tool is better in the abstract. It's whether codebase-wide context is the bottleneck in your current work. If it is, Cursor will be a noticeable improvement. If it isn't, the cost premium doesn't make sense.&lt;/p&gt;

&lt;p&gt;For teams interested in how we structure AI tooling across client engagements, our &lt;a href="https://dev.to/services/web-development"&gt;web development&lt;/a&gt; and &lt;a href="https://dev.to/services/ai-automation"&gt;AI automation&lt;/a&gt; services both reflect this kind of tool-considered approach.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How long does it take to switch a team from Copilot to Cursor?&lt;/strong&gt;&lt;br&gt;
The technical switch is fast — install Cursor, import your VS Code settings and extensions, done. The workflow adjustment takes longer. Developers need to build habits around using Composer mode rather than just inline autocomplete. Give it two weeks of deliberate use on a real project before judging whether it's worth it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Cursor work with JetBrains IDEs?&lt;/strong&gt;&lt;br&gt;
No. Cursor is a VS Code fork and runs only on VS Code. If your team uses JetBrains IDEs (IntelliJ, WebStorm, PyCharm, etc.), you'll need to keep Copilot for those developers or ask them to switch editors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is there a free tier for Cursor?&lt;/strong&gt;&lt;br&gt;
Cursor has a Hobby tier with limited usage. For any serious team use, you'll want Cursor Pro at $20/month or Teams at $40/user/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you run Cursor and Copilot at the same time?&lt;/strong&gt;&lt;br&gt;
You can install both, but running Copilot as an extension inside Cursor creates conflicts. Most developers choose one as their primary inline tool and use the other only in specific contexts (e.g., Copilot for GitHub Actions integrations, Cursor for everything else in the editor).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does Cursor handle large monorepos?&lt;/strong&gt;&lt;br&gt;
Well, but you may need to configure which directories to index. The default indexing handles most projects fine. For very large monorepos, selectively indexing the packages you're actively working in reduces indexing time and improves relevance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the switch affect code quality for junior developers?&lt;/strong&gt;&lt;br&gt;
The learning curve matters more for juniors. Copilot's inline suggestions feel familiar and are easy to evaluate. Cursor's Composer mode, which generates multi-file changes, requires more judgment to review and use responsibly. We'd lean toward starting junior developers on Copilot and introducing Cursor once they have enough context to evaluate multi-file changes confidently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What about Cursor's privacy policy for client code?&lt;/strong&gt;&lt;br&gt;
Cursor indexes your code on their servers for the semantic search features. You can opt out of training data usage. For sensitive client work, review Cursor's data processing agreement. For clients with strict data residency or confidentiality requirements, the indexing behaviour is worth discussing with your legal team before deploying widely.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Rishabh Sethia, Founder &amp;amp; CEO of Innovatrix Infotech. Former SSE/Head of Engineering. DPIIT Recognized Startup.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://innovatrixinfotech.com/blog/why-we-switched-dev-team-to-cursor?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog" rel="noopener noreferrer"&gt;Innovatrix Infotech&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cursor</category>
      <category>githubcopilot</category>
      <category>developertools</category>
      <category>aicoding</category>
    </item>
    <item>
      <title>WordPress to Headless CMS: Is It Worth the Migration in 2026?</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Mon, 13 Jul 2026 04:30:02 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/wordpress-to-headless-cms-is-it-worth-the-migration-in-2026-11ba</link>
      <guid>https://dev.to/emperorakashi20/wordpress-to-headless-cms-is-it-worth-the-migration-in-2026-11ba</guid>
      <description>&lt;p&gt;Your WordPress site takes 4 seconds to load, gets hacked twice a year, and your content team fights with the editor daily. A headless CMS could fix all three problems — or create entirely new ones. Here's how to decide.&lt;/p&gt;

&lt;p&gt;I've helped teams migrate from WordPress to headless setups, and I've also talked founders &lt;em&gt;out&lt;/em&gt; of it. The truth is that headless CMS isn't universally better — it's a different set of trade-offs. This article gives you everything you need to make the call for your specific situation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "Headless CMS" Actually Means
&lt;/h2&gt;

&lt;p&gt;Traditional WordPress is a &lt;strong&gt;monolithic&lt;/strong&gt; system. The CMS (where you write content) and the frontend (what visitors see) are welded together. Your theme, your plugins, your database, your PHP rendering engine — all one unit.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;headless CMS&lt;/strong&gt; rips that apart. The CMS becomes a pure content repository with an API. Your frontend — built with React, Next.js, Vue, whatever — fetches content through that API and renders it however you want.&lt;/p&gt;

&lt;p&gt;Think of it like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Traditional WordPress&lt;/strong&gt;: The kitchen and the dining room are the same room. The chef cooks and serves at the same counter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Headless CMS&lt;/strong&gt;: The kitchen (CMS) sends dishes through a window (API) to a separate dining room (frontend). The dining room can be redesigned without touching the kitchen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This separation unlocks real advantages. It also introduces real complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Honest Case FOR Migration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Performance That Actually Matters
&lt;/h3&gt;

&lt;p&gt;Headless architectures paired with static site generation (SSG) or incremental static regeneration (ISR) deliver pages in under 500ms consistently. Traditional WordPress, even with aggressive caching, typically lands between 1.5-4 seconds.&lt;/p&gt;

&lt;p&gt;Why? WordPress renders pages on every request using PHP. Even with object caching and page caching plugins, you're still dealing with a database query layer, plugin overhead, and server-side rendering bottlenecks.&lt;/p&gt;

&lt;p&gt;A headless setup with Next.js serves pre-built HTML from a CDN edge node. No PHP execution. No database queries at request time. The content was already fetched and baked into static HTML during the build step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world benchmark data:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Traditional WordPress (Optimized)&lt;/th&gt;
&lt;th&gt;Headless + Next.js (SSG)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Time to First Byte (TTFB)&lt;/td&gt;
&lt;td&gt;800ms – 1.8s&lt;/td&gt;
&lt;td&gt;50ms – 150ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Largest Contentful Paint (LCP)&lt;/td&gt;
&lt;td&gt;2.2s – 4.5s&lt;/td&gt;
&lt;td&gt;0.8s – 1.5s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Blocking Time (TBT)&lt;/td&gt;
&lt;td&gt;300ms – 900ms&lt;/td&gt;
&lt;td&gt;0ms – 50ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Core Web Vitals pass rate&lt;/td&gt;
&lt;td&gt;~45% of WP sites pass&lt;/td&gt;
&lt;td&gt;~90% of headless sites pass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CDN-edge serving&lt;/td&gt;
&lt;td&gt;Plugin-dependent&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These aren't theoretical numbers. Google's CWV report consistently shows WordPress sites underperforming compared to Jamstack/headless architectures.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Security You Don't Have to Think About
&lt;/h3&gt;

&lt;p&gt;WordPress powers 43% of the web. That makes it the single biggest target for automated attacks. Brute force login attempts, SQL injection through plugins, XSS vulnerabilities in themes — the attack surface is enormous.&lt;/p&gt;

&lt;p&gt;With a headless setup, your CMS sits behind a firewall, unexposed to the public internet. Visitors interact with static files on a CDN — there's no database to inject, no login page to brute force, no PHP to exploit.&lt;/p&gt;

&lt;p&gt;The security model shifts from "patch everything constantly and hope nothing slips through" to "there's nothing to attack on the public-facing side."&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Multi-Channel Content Delivery
&lt;/h3&gt;

&lt;p&gt;If your content needs to appear on a website, a mobile app, a kiosk display, and a partner's platform — WordPress makes this painful. You end up duplicating content or building hacky integrations.&lt;/p&gt;

&lt;p&gt;A headless CMS serves content as structured data through an API. Any frontend can consume it. Write once, publish everywhere. This matters if you're building beyond just a website.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Developer Experience and Velocity
&lt;/h3&gt;

&lt;p&gt;Modern frontend developers work in React, Vue, or Svelte. Asking them to build in PHP with WordPress theme conventions is like asking a Formula 1 engineer to tune a tractor. They'll do it, but slowly and unhappily.&lt;/p&gt;

&lt;p&gt;Headless lets your frontend team use the tools they're fastest with. Component-based architecture, TypeScript, hot module replacement, proper version control — all the things that make developers ship faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Honest Case AGAINST Migration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Cost: It's Not Even Close (Initially)
&lt;/h3&gt;

&lt;p&gt;Let me be direct about this. A headless setup costs more upfront. Significantly more.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cost Component&lt;/th&gt;
&lt;th&gt;Traditional WordPress (INR)&lt;/th&gt;
&lt;th&gt;Headless CMS + Next.js (INR)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Initial build (brochure site, 8-12 pages)&lt;/td&gt;
&lt;td&gt;₹80,000 – ₹2,00,000&lt;/td&gt;
&lt;td&gt;₹2,50,000 – ₹6,00,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CMS license (annual)&lt;/td&gt;
&lt;td&gt;₹0 (self-hosted WP)&lt;/td&gt;
&lt;td&gt;₹0 – ₹3,00,000 (depends on CMS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosting (annual)&lt;/td&gt;
&lt;td&gt;₹3,000 – ₹15,000&lt;/td&gt;
&lt;td&gt;₹6,000 – ₹36,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ongoing maintenance (annual)&lt;/td&gt;
&lt;td&gt;₹30,000 – ₹80,000&lt;/td&gt;
&lt;td&gt;₹60,000 – ₹1,50,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plugin/integration costs&lt;/td&gt;
&lt;td&gt;₹5,000 – ₹30,000/year&lt;/td&gt;
&lt;td&gt;Custom development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Year 1 total (typical)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;₹1,18,000 – ₹3,25,000&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;₹3,16,000 – ₹10,86,000&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The headless setup costs 2-3x more in year one. That gap narrows over time as you avoid the WordPress plugin tax and security patching cycle — but it takes 2-3 years to break even on cost alone.&lt;/p&gt;

&lt;p&gt;If budget is your primary constraint, WordPress is still the rational choice for most small businesses.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Editorial Experience: A Real Step Backward
&lt;/h3&gt;

&lt;p&gt;WordPress's editor — especially Gutenberg — gives content teams a visual, block-based editing experience. They see something close to the final page as they write. Headers, images, columns, buttons — all visual.&lt;/p&gt;

&lt;p&gt;Most headless CMS editors show you form fields. Title field. Body field (Markdown or rich text). Image upload field. Your content team types into boxes and has no idea what the final page looks like until it's published.&lt;/p&gt;

&lt;p&gt;Some headless CMS platforms (Sanity with its Studio, Directus with custom layouts) are closing this gap. But out of the box, the editorial experience is worse than WordPress for non-technical users. If your content team isn't technically inclined, this is a real friction point.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Complexity: More Moving Parts
&lt;/h3&gt;

&lt;p&gt;Traditional WordPress: one server, one application, one database. Done.&lt;/p&gt;

&lt;p&gt;Headless setup: CMS server, API layer, frontend application, CDN configuration, build pipeline, preview environment, webhook integrations. That's six things that can break instead of one.&lt;/p&gt;

&lt;p&gt;Every additional component is a potential failure point, a configuration surface, and something someone needs to understand and maintain.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The Talent Problem in India
&lt;/h3&gt;

&lt;p&gt;This one doesn't get discussed enough. Finding a WordPress developer in India takes a day. Finding a developer who understands headless CMS architecture, API design, modern frontend frameworks, and deployment pipelines? That takes weeks.&lt;/p&gt;

&lt;p&gt;The talent pool for headless CMS development in India is growing but still small compared to WordPress. This affects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hiring costs&lt;/strong&gt;: Headless-capable developers command 40-80% higher salaries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agency availability&lt;/strong&gt;: Fewer agencies offer headless CMS services competently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge transfer&lt;/strong&gt;: If your developer leaves, finding a replacement is harder&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community support&lt;/strong&gt;: WordPress has forums, YouTube tutorials, and Stack Overflow answers for everything. Headless CMS solutions have smaller communities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is improving rapidly — the Next.js ecosystem in India has grown enormously — but it's still a factor for teams building in-house.&lt;/p&gt;

&lt;h2&gt;
  
  
  Popular Headless CMS Options Compared
&lt;/h2&gt;

&lt;p&gt;Not all headless CMS platforms are equal. Here's how the major players stack up:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Directus&lt;/th&gt;
&lt;th&gt;Strapi&lt;/th&gt;
&lt;th&gt;Contentful&lt;/th&gt;
&lt;th&gt;Sanity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Open source&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes (GPL)&lt;/td&gt;
&lt;td&gt;Yes (MIT)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Partially&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-hosted option&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No (SaaS only)&lt;/td&gt;
&lt;td&gt;No (SaaS only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Database&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Any SQL (Postgres, MySQL, SQLite)&lt;/td&gt;
&lt;td&gt;Postgres, MySQL, SQLite&lt;/td&gt;
&lt;td&gt;Proprietary&lt;/td&gt;
&lt;td&gt;Proprietary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;REST + GraphQL&lt;/td&gt;
&lt;td&gt;REST + GraphQL&lt;/td&gt;
&lt;td&gt;REST + GraphQL&lt;/td&gt;
&lt;td&gt;GROQ (proprietary)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Free tier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unlimited (self-hosted)&lt;/td&gt;
&lt;td&gt;Unlimited (self-hosted)&lt;/td&gt;
&lt;td&gt;1 space, 5 users&lt;/td&gt;
&lt;td&gt;3 users, 10k docs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Editorial UX&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Good (custom layouts possible)&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;Excellent (Studio)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Learning curve&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Steep (GROQ)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Teams wanting full control&lt;/td&gt;
&lt;td&gt;Startups, rapid prototyping&lt;/td&gt;
&lt;td&gt;Enterprise, large teams&lt;/td&gt;
&lt;td&gt;Developer-heavy teams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;India hosting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Any cloud (AWS Mumbai, etc.)&lt;/td&gt;
&lt;td&gt;Any cloud&lt;/td&gt;
&lt;td&gt;US/EU only (SaaS)&lt;/td&gt;
&lt;td&gt;US/EU only (SaaS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data ownership&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full (your database)&lt;/td&gt;
&lt;td&gt;Full (your database)&lt;/td&gt;
&lt;td&gt;Vendor-locked&lt;/td&gt;
&lt;td&gt;Vendor-locked&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Our take&lt;/strong&gt;: For teams in India and those who value data ownership, self-hosted options like Directus or Strapi make the most sense. You control your data, host in your region for lower latency, and avoid SaaS pricing that scales with usage.&lt;/p&gt;

&lt;p&gt;Contentful and Sanity are strong products, but vendor lock-in and SaaS costs become significant at scale. Sanity's proprietary query language (GROQ) is powerful but means your team's skills don't transfer to other platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  WordPress as Headless: The Hybrid Approach
&lt;/h2&gt;

&lt;p&gt;Here's something most "headless CMS" articles skip: you can use WordPress itself as a headless CMS.&lt;/p&gt;

&lt;p&gt;WordPress ships with a REST API out of the box. You can keep your WordPress backend — the editor your team already knows — and build a separate frontend in Next.js, Astro, or any framework that consumes the WordPress REST API.&lt;/p&gt;

&lt;p&gt;This gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Familiar editor&lt;/strong&gt;: Your content team keeps using Gutenberg&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Existing content&lt;/strong&gt;: No migration needed — your posts and pages are already there&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugin ecosystem&lt;/strong&gt;: Most plugins that affect content (ACF, Yoast, etc.) expose data via the API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lower migration cost&lt;/strong&gt;: You're only rebuilding the frontend, not replacing the entire CMS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The downsides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WordPress maintenance continues&lt;/strong&gt;: You still need to update WordPress, PHP, and plugins&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance overhead&lt;/strong&gt;: The API is slower than purpose-built headless CMS APIs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API limitations&lt;/strong&gt;: Not everything in WordPress translates cleanly to API responses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security surface remains&lt;/strong&gt;: Your WordPress admin is still exposed (though visitors never touch it)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key insight&lt;/strong&gt;: WordPress-as-headless is the most underrated migration strategy. It gives you 70% of the headless benefits at 40% of the cost and complexity. For many teams, this is the right first step — not a full CMS replacement.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Performance Deep Dive: Real Numbers
&lt;/h2&gt;

&lt;p&gt;Let's look at what actually happens to site performance when you move from traditional WordPress to headless.&lt;/p&gt;

&lt;p&gt;We measured across multiple client projects (8-15 page business sites, similar content complexity):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Traditional WordPress (managed hosting, caching enabled, optimized images):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Homepage load: 2.1s (first visit), 1.4s (cached)&lt;/li&gt;
&lt;li&gt;Lighthouse Performance score: 62-78&lt;/li&gt;
&lt;li&gt;Time to Interactive: 3.2s&lt;/li&gt;
&lt;li&gt;Server response time: 420ms average&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Same content, headless CMS + Next.js (Vercel hosting, ISR enabled):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Homepage load: 0.8s (first visit), 0.4s (cached)&lt;/li&gt;
&lt;li&gt;Lighthouse Performance score: 94-100&lt;/li&gt;
&lt;li&gt;Time to Interactive: 1.1s&lt;/li&gt;
&lt;li&gt;Server response time: 45ms average&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's roughly a &lt;strong&gt;60% improvement&lt;/strong&gt; across the board. For businesses where page speed directly affects conversion (e-commerce, SaaS landing pages, lead generation), this translates to measurable revenue impact.&lt;/p&gt;

&lt;p&gt;But here's the nuance: if your WordPress site already scores 85+ on Lighthouse and loads in under 2 seconds, the performance gains from going headless are marginal. You'd be spending ₹3-5 lakhs to shave 500ms off your load time. The ROI doesn't justify it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migration Approaches: Big Bang vs. Incremental
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Big Bang Migration
&lt;/h3&gt;

&lt;p&gt;You rebuild everything at once. New CMS, new frontend, new hosting. Flip the switch on launch day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When it works&lt;/strong&gt;: Small sites (under 50 pages), teams with clear requirements, projects where the old site is fundamentally broken.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Risks&lt;/strong&gt;: Everything breaks at once if something goes wrong. No fallback. High pressure on launch day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timeline&lt;/strong&gt;: 8-16 weeks for a typical business site.&lt;/p&gt;

&lt;h3&gt;
  
  
  Incremental Migration (Recommended)
&lt;/h3&gt;

&lt;p&gt;You migrate piece by piece. Start with high-impact pages (blog, landing pages), keep the rest on WordPress, and gradually move everything over.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 1 (Weeks 1-4)&lt;/strong&gt;: Set up headless CMS, migrate blog content, build blog frontend. WordPress handles everything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 2 (Weeks 5-8)&lt;/strong&gt;: Migrate landing pages and high-traffic pages. Set up redirects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 3 (Weeks 9-12)&lt;/strong&gt;: Migrate remaining pages. Decommission WordPress frontend (keep as headless backend if using WP-as-headless approach).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 4 (Weeks 13-16)&lt;/strong&gt;: Performance optimization, SEO validation, monitoring setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why incremental wins&lt;/strong&gt;: You catch problems early, maintain a working site throughout, and can pause or reverse if priorities change. The business never goes offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Decision Framework: Who Needs Headless?
&lt;/h2&gt;

&lt;p&gt;Stop asking "should I go headless?" and start asking these five questions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Does your site need to serve content to multiple platforms?&lt;/strong&gt;&lt;br&gt;
If yes (website + app + kiosk + partner feeds) → headless makes strong sense.&lt;br&gt;
If no (website only) → headless is optional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Is performance a direct revenue driver?&lt;/strong&gt;&lt;br&gt;
If yes (e-commerce, SaaS with conversion funnels) → headless pays for itself.&lt;br&gt;
If no (informational site, internal tool) → WordPress with caching is fine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Does your development team work in modern JavaScript frameworks?&lt;/strong&gt;&lt;br&gt;
If yes → headless lets them work at full speed.&lt;br&gt;
If no → you'll need to hire or retrain, adding cost and time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Is your content team technically comfortable?&lt;/strong&gt;&lt;br&gt;
If yes → they'll adapt to a headless editor.&lt;br&gt;
If no → the WordPress editor is genuinely better for non-technical users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. What's your annual technology budget?&lt;/strong&gt;&lt;br&gt;
If under ₹3 lakhs/year → stay on WordPress, optimize what you have.&lt;br&gt;
If ₹3-8 lakhs/year → consider WordPress-as-headless hybrid.&lt;br&gt;
If above ₹8 lakhs/year → full headless is feasible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Score yourself&lt;/strong&gt;: If you answered "yes" to 3+ of the first four questions AND have the budget → migrate. Otherwise → optimize your WordPress setup first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migration Checklist
&lt;/h2&gt;

&lt;p&gt;If you've decided to proceed, here's what the process looks like:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pre-Migration (Week 1-2)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Audit existing content (pages, posts, custom post types, media library)&lt;/li&gt;
&lt;li&gt;Map URL structure and plan redirects&lt;/li&gt;
&lt;li&gt;Choose headless CMS based on team skills and requirements&lt;/li&gt;
&lt;li&gt;Define content model (structured types, not WordPress's freeform approach)&lt;/li&gt;
&lt;li&gt;Set up staging environments for both CMS and frontend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Content Migration (Week 2-4)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Export WordPress content (WP CLI or REST API export)&lt;/li&gt;
&lt;li&gt;Transform content to match new content model&lt;/li&gt;
&lt;li&gt;Import into headless CMS&lt;/li&gt;
&lt;li&gt;Validate all content transferred correctly (automated checks)&lt;/li&gt;
&lt;li&gt;Migrate media assets (images, documents, videos)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Frontend Build (Week 3-8)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build component library matching existing design&lt;/li&gt;
&lt;li&gt;Implement page templates consuming CMS API&lt;/li&gt;
&lt;li&gt;Set up preview mode for content team&lt;/li&gt;
&lt;li&gt;Implement SEO elements (meta tags, structured data, sitemap)&lt;/li&gt;
&lt;li&gt;Configure CDN and caching strategy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Testing and Launch (Week 8-12)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SEO audit: compare old and new meta tags, structured data, internal links&lt;/li&gt;
&lt;li&gt;Performance testing across devices&lt;/li&gt;
&lt;li&gt;Content team training on new CMS&lt;/li&gt;
&lt;li&gt;Redirect testing (every old URL must resolve)&lt;/li&gt;
&lt;li&gt;Staged rollout (DNS switch with monitoring)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Post-Launch (Week 12-16)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitor 404s and fix redirect gaps&lt;/li&gt;
&lt;li&gt;Track Core Web Vitals improvement&lt;/li&gt;
&lt;li&gt;Compare search rankings (expect 2-4 week settling period)&lt;/li&gt;
&lt;li&gt;Gather content team feedback and iterate on CMS workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Timeline Expectations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simple brochure site (5-15 pages)&lt;/strong&gt;: 6-10 weeks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content-heavy blog (100+ posts)&lt;/strong&gt;: 10-14 weeks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E-commerce catalog (500+ products)&lt;/strong&gt;: 14-20 weeks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise site with custom integrations&lt;/strong&gt;: 16-24+ weeks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Double these timelines if you're also redesigning the site simultaneously. Migration and redesign at the same time is the number one cause of project delays and budget overruns.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Will I lose SEO rankings when migrating to headless?&lt;/strong&gt;&lt;br&gt;
Temporarily, yes — expect a 2-4 week settling period. If you maintain the same URL structure, implement proper 301 redirects, preserve meta tags and structured data, and keep content identical, your rankings should recover and likely improve due to better Core Web Vitals. The biggest risk is broken redirects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use WordPress plugins with a headless setup?&lt;/strong&gt;&lt;br&gt;
Plugins that affect content (ACF, Yoast SEO, WPML) generally expose data via the REST API and work fine. Plugins that affect the frontend (page builders, slider plugins, popup plugins) won't work — their output is tied to the WordPress theme layer. You'll rebuild that functionality in your frontend framework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much does headless CMS hosting cost in India?&lt;/strong&gt;&lt;br&gt;
Self-hosted (Directus or Strapi on AWS Mumbai or DigitalOcean Bangalore): ₹2,000-₹8,000/month for a small-to-medium site. SaaS options (Contentful, Sanity): ₹5,000-₹25,000/month depending on usage. Frontend hosting (Vercel, Netlify): free tier covers most small sites, ₹1,500-₹5,000/month for production workloads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is headless CMS good for e-commerce?&lt;/strong&gt;&lt;br&gt;
Yes, but with caveats. Headless commerce (Shopify Storefront API, Medusa, Saleor) delivers excellent performance. However, you lose the plug-and-play nature of Shopify themes or WooCommerce. Every checkout flow, product filter, and cart interaction needs custom frontend development. Budget 2-3x more for headless e-commerce compared to traditional setups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens to my WordPress site during migration?&lt;/strong&gt;&lt;br&gt;
Nothing — it stays live until you're ready to switch. With incremental migration, both systems run in parallel. Your visitors experience zero downtime. The DNS switch (pointing your domain to the new frontend) takes 5-15 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can a non-technical team manage a headless CMS?&lt;/strong&gt;&lt;br&gt;
It depends on the CMS. Directus and Contentful have intuitive interfaces that non-technical users can learn in a few hours. Sanity requires some technical comfort. Strapi is developer-friendly but can overwhelm content editors. The key is investing in proper content team training — budget 2-3 days of hands-on training during migration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I migrate my blog first or my main site?&lt;/strong&gt;&lt;br&gt;
Blog first, always. Blog content is typically the most structured (title, body, author, date, tags), making it the simplest migration target. It lets your team learn the new system on low-risk content before tackling complex pages. If the blog migration goes poorly, you can reverse it without affecting your main site.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I handle forms and dynamic features in a headless setup?&lt;/strong&gt;&lt;br&gt;
Forms, search, comments, and other dynamic features need separate solutions. Options include serverless functions (API routes in Next.js), third-party services (Formspree, Algolia), or your headless CMS's built-in features (Directus supports custom endpoints and flows). Plan these integrations during the architecture phase — they're often the most underestimated part of a headless migration.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Considering a headless CMS migration?&lt;/strong&gt; We've migrated WordPress sites to headless for clients across India, UK, and US. Let's evaluate if it makes sense for your specific case. &lt;a href="https://cal.com/innovatrix-infotech/discovery-call" rel="noopener noreferrer"&gt;Book a free discovery call&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://innovatrixinfotech.com/blog/wordpress-to-headless-cms-migration-2026?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog" rel="noopener noreferrer"&gt;Innovatrix Infotech&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>headlesscms</category>
      <category>wordpress</category>
      <category>jamstack</category>
      <category>migration</category>
    </item>
  </channel>
</rss>
