<?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>How to Build an Arabic RTL Shopify Store: The Complete Technical Guide</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Wed, 19 Aug 2026 04:30:01 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/how-to-build-an-arabic-rtl-shopify-store-the-complete-technical-guide-bdb</link>
      <guid>https://dev.to/emperorakashi20/how-to-build-an-arabic-rtl-shopify-store-the-complete-technical-guide-bdb</guid>
      <description>&lt;p&gt;There's a post I kept wishing existed when we first took on an Arabic Shopify build. A post that covered the real implementation: not just "add dir=rtl to your HTML" (which breaks more than it fixes), but the actual CSS overrides, the font stack decisions, the Liquid conditionals, and the third-party apps that silently wreck your layout the moment a customer switches to Arabic.&lt;/p&gt;

&lt;p&gt;This is that post.&lt;/p&gt;

&lt;p&gt;As a &lt;a href="https://dev.to/services/shopify"&gt;Shopify Partner&lt;/a&gt; that's built RTL stores for clients across &lt;a href="https://dev.to/services/saudi-arabia"&gt;Saudi Arabia&lt;/a&gt; and the &lt;a href="https://dev.to/services/dubai"&gt;UAE&lt;/a&gt;, we've made every mistake this guide warns you about. Consider this the distilled version.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You'll Learn
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How Shopify OS 2.0 handles RTL natively (and where it falls short)&lt;/li&gt;
&lt;li&gt;The CSS properties that require manual overrides in RTL&lt;/li&gt;
&lt;li&gt;Arabic font stacks that actually render well at small screen sizes&lt;/li&gt;
&lt;li&gt;Using Liquid's &lt;code&gt;locale.direction&lt;/code&gt; for conditional rendering&lt;/li&gt;
&lt;li&gt;Handling bidirectional (bidi) content: Arabic text with embedded English numbers&lt;/li&gt;
&lt;li&gt;Which popular Shopify apps break in RTL and how to fix them&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A Shopify store on a 2.0 theme (Dawn, Sense, Refresh, or a premium 2.0-compatible theme)&lt;/li&gt;
&lt;li&gt;Access to Online Store &amp;gt; Themes &amp;gt; Edit Code&lt;/li&gt;
&lt;li&gt;Arabic added as a language via Settings &amp;gt; Languages&lt;/li&gt;
&lt;li&gt;Basic CSS knowledge&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Enable Arabic as a Language in Shopify
&lt;/h2&gt;

&lt;p&gt;Before any code changes, add Arabic through Shopify's language system.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings &amp;gt; Languages&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add language&lt;/strong&gt; and select &lt;strong&gt;Arabic (ar)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Use Shopify's &lt;strong&gt;Translate &amp;amp; Adapt&lt;/strong&gt; app (free, from Shopify) to translate your theme strings, or use a third-party translation app&lt;/li&gt;
&lt;li&gt;Once Arabic is active, Shopify OS 2.0 themes with &lt;code&gt;dir="rtl"&lt;/code&gt; support will automatically flip to RTL layout when a customer's locale is Arabic&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What Shopify handles automatically in OS 2.0:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text direction (&lt;code&gt;dir="rtl"&lt;/code&gt; applied to &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Text alignment for paragraph content&lt;/li&gt;
&lt;li&gt;Some Flexbox reversals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What it does NOT handle automatically (you must fix these manually):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CSS &lt;code&gt;left&lt;/code&gt;/&lt;code&gt;right&lt;/code&gt; positioning on absolutely or fixed positioned elements&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;float&lt;/code&gt; declarations (largely legacy but still common in older themes/apps)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;margin-left&lt;/code&gt; / &lt;code&gt;margin-right&lt;/code&gt; asymmetric values&lt;/li&gt;
&lt;li&gt;Icon direction (arrows, chevrons that point left in LTR should point right in RTL)&lt;/li&gt;
&lt;li&gt;Third-party app widgets injected via JavaScript&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 2: The Core CSS Overrides
&lt;/h2&gt;

&lt;p&gt;Create a new snippet file called &lt;code&gt;rtl-overrides.css.liquid&lt;/code&gt; and include it conditionally. Then add your RTL styles inside a conditional block.&lt;/p&gt;

&lt;p&gt;In your &lt;code&gt;theme.liquid&lt;/code&gt; (inside the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tag), add:&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;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;direction&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;'rtl'&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="s1"&gt;'rtl-overrides.css'&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;asset_url&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;stylesheet_tag&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;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;In your &lt;code&gt;assets/rtl-overrides.css&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* =============================================
   INNOVATRIX RTL OVERRIDES: Arabic Shopify Stores
   ============================================= */&lt;/span&gt;

&lt;span class="c"&gt;/* Flip all left/right margin/padding pairs */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;.left-content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;margin-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;margin-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--spacing&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;.right-content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;margin-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;margin-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--spacing&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Flip Flexbox row direction */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;.flex-row&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;row-reverse&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Product grid: image + content alignment */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;.product-card__info&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;right&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;.product-card__price&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;right&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Navigation: reverse the dropdown direction */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;.header__menu-item&lt;/span&gt; &lt;span class="nc"&gt;.header__submenu&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
  &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
  &lt;span class="nl"&gt;right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Chevron/arrow icons: flip horizontally */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;.icon-arrow-right&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;.icon-chevron-right&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;scaleX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;-1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Breadcrumb separator */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;.breadcrumb__separator&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;scaleX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;-1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Input fields: right-align text */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nt"&gt;textarea&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nt"&gt;select&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;right&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rtl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Cart quantity: fix mis-aligned stepper */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;.quantity-selector&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;row-reverse&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;&lt;strong&gt;Critical gotcha:&lt;/strong&gt; Don't use &lt;code&gt;[dir="rtl"] * { direction: rtl; }&lt;/code&gt; as a catch-all. It will break embedded iframes (payment widgets, review apps, chat tools) that need to render LTR internally. Target elements explicitly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Arabic Font Stack
&lt;/h2&gt;

&lt;p&gt;Shopify themes ship with Latin fonts by default. Arabic text rendered in a Latin font falls back to the browser's default Arabic font, which is usually inconsistent across devices and rarely legible at small sizes.&lt;/p&gt;

&lt;p&gt;The three Arabic Google Fonts that perform well in ecommerce contexts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cairo&lt;/strong&gt;: clean, geometric, excellent readability at all sizes, works at 14px+&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tajawal&lt;/strong&gt;: slightly more rounded, good for headings and hero text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Noto Sans Arabic&lt;/strong&gt;: extremely legible at small sizes, ideal for body copy and meta&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add to the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; in &lt;code&gt;theme.liquid&lt;/code&gt;:&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;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;direction&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;'rtl'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt;
  &amp;lt;link rel="preconnect" href="https://fonts.googleapis.com"&amp;gt;
  &amp;lt;link rel="preconnect" href="https://fonts.gstatic.com" crossorigin&amp;gt;
  &amp;lt;link href="https://fonts.googleapis.com/css2?family=Cairo:wght@400;500;600;700&amp;amp;family=Tajawal:wght@400;500;700&amp;amp;display=swap" rel="stylesheet"&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;In your &lt;code&gt;rtl-overrides.css&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Apply Arabic font stack when RTL is active */&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;.product-card__title&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;.cart__item-name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Cairo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'Tajawal'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'Noto Sans Arabic'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Arial&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* Arabic text needs more line height than Latin */&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.05rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* Slight upsize: Arabic at 14px is harder to read */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nt"&gt;h3&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Tajawal'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'Cairo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;700&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;letter-spacing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* Zero letter-spacing: Arabic glyphs connect */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Arabic is a cursive script: glyphs connect to each other. Never apply &lt;code&gt;letter-spacing&lt;/code&gt; values to Arabic text. It breaks the visual joining of characters and looks like corrupted text.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Liquid Conditional Rendering
&lt;/h2&gt;

&lt;p&gt;Some layout decisions require Liquid logic, not just CSS. The &lt;code&gt;locale.direction&lt;/code&gt; variable returns &lt;code&gt;"rtl"&lt;/code&gt; or &lt;code&gt;"ltr"&lt;/code&gt; based on the active language.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Conditional icon rendering&lt;/strong&gt;&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;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;direction&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;'rtl'&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;render&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'icon-arrow-left'&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;else&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;render&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'icon-arrow-right'&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;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;&lt;strong&gt;Example: RTL-aware product card layout&lt;/strong&gt;&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;div class="product-card &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;locale&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;direction&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;'rtl'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt;product-card--rtl&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;
  &amp;lt;div class="product-card__image"&amp;gt;...&amp;lt;/div&amp;gt;
  &amp;lt;div class="product-card__info"&amp;gt;
    &amp;lt;h3 class="product-card__title"&amp;gt;&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;title&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&amp;lt;/h3&amp;gt;
    &amp;lt;p class="product-card__price"&amp;gt;&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;price&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;money&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example: RTL-aware &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; tag (add to theme.liquid)&lt;/strong&gt;&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;html lang="&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;iso_code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;" dir="&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;direction&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;This ensures the &lt;code&gt;dir&lt;/code&gt; attribute is dynamically set on the document root based on the active language: which is what drives all CSS &lt;code&gt;[dir="rtl"]&lt;/code&gt; selectors.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Handling Bidirectional (Bidi) Content
&lt;/h2&gt;

&lt;p&gt;Mixed Arabic/English content is common in ecommerce: product names in Arabic, prices in Arabic numerals or English numerals, brand names in Latin characters embedded in Arabic descriptions.&lt;/p&gt;

&lt;p&gt;The Unicode bidirectional algorithm handles most of this automatically, but it can produce unexpected results in specific cases: especially around punctuation, numbers at the end of Arabic strings, and parentheses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use the &lt;code&gt;unicode-bidi&lt;/code&gt; CSS property for mixed-direction containers:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;.product-description&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;unicode-bidi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;plaintext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c"&gt;/* Renders bidi content in its natural direction without forcing the container direction */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For product names with embedded English brand names:&lt;/strong&gt;&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;span dir="auto"&amp;gt;&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;title&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;dir="auto"&lt;/code&gt; HTML attribute uses the first strong character in the text to set direction: if the product name starts with Arabic, it renders RTL; if it starts with a Latin brand name, it renders LTR. This is more reliable than hard-coding for mixed catalogs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: Third-Party Apps That Break in RTL
&lt;/h2&gt;

&lt;p&gt;This is the section you won't find in most guides. Here are the apps and widget categories that commonly produce broken layouts in Arabic RTL Shopify stores, and how to handle each:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Review Apps (Judge.me, Loox, Stamped.io)&lt;/strong&gt;&lt;br&gt;
Stars-and-review widgets inject their own CSS, often with hard-coded &lt;code&gt;text-align: left&lt;/code&gt; and &lt;code&gt;float: left&lt;/code&gt;. Override via the Shopify theme's custom CSS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;.jdgm-rev__body&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;.jdgm-rev__author&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;right&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rtl&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;&lt;strong&gt;BNPL Widgets (Tabby, Tamara)&lt;/strong&gt;&lt;br&gt;
Tabby and Tamara both have Arabic-aware widget options: pass &lt;code&gt;lang="ar"&lt;/code&gt; in their embed configuration to get Arabic-localised messaging. Without this, they default to English.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Klaviyo / Email Capture Popups&lt;/strong&gt;&lt;br&gt;
Klaviyo's popup form renders LTR by default. In Klaviyo's form editor, set text direction to RTL in the form settings for Arabic templates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Chat (Tidio, Freshchat, Intercom)&lt;/strong&gt;&lt;br&gt;
Most live chat tools auto-detect the user's browser language and flip their own widget. If yours doesn't, check the language configuration in the chat tool's settings: most enterprise-tier chat tools have explicit RTL support.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search Apps (Searchie, Boost Commerce)&lt;/strong&gt;&lt;br&gt;
Search result dropdowns and filter panels often have their own CSS scope. You'll need app-specific overrides. Test your search experience in Arabic explicitly: it's commonly broken and commonly overlooked.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Issues and Fixes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Checkout page is still LTR in Arabic mode.&lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; Shopify's checkout (for non-Shopify Plus merchants) is a Shopify-controlled surface. You cannot customise its RTL behaviour without a Shopify Plus checkout.liquid. For standard plans, the checkout will use Shopify's built-in Arabic support, which is reasonable but not fully customisable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Product image gallery carousel swiping direction is inverted (swipe left in Arabic, but it goes right).&lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; Most carousel libraries (Splide, Swiper) have a &lt;code&gt;dir&lt;/code&gt; option. Set &lt;code&gt;dir: 'rtl'&lt;/code&gt; in your carousel initialisation when &lt;code&gt;locale.direction == 'rtl'&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Breadcrumb shows &lt;code&gt;Home / Products / Product Name&lt;/code&gt; instead of &lt;code&gt;اسم المنتج / المنتجات / الرئيسية&lt;/code&gt;.&lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; This is a translation issue, not an RTL issue. Use Translate &amp;amp; Adapt to translate breadcrumb strings. The RTL layout will handle direction once translation is in place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Email notifications are still LTR.&lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; Shopify email notification templates are separate from theme files. Go to Settings &amp;gt; Notifications and manually add &lt;code&gt;dir="rtl"&lt;/code&gt; to the relevant email HTML templates for Arabic-language notifications.&lt;/p&gt;




&lt;h2&gt;
  
  
  Results: What Proper RTL Delivers
&lt;/h2&gt;

&lt;p&gt;For one of our Saudi Arabia-facing clients, we implemented the full RTL treatment described above on a mid-size fashion store. The before/after on the Arabic-language variant told the story clearly: session duration in Arabic increased substantially, and cart abandonment on the Arabic checkout path dropped to match the English path: which it had meaningfully underperformed before the RTL work.&lt;/p&gt;

&lt;p&gt;Proper RTL is not cosmetic. Saudi and UAE consumers who encounter a broken Arabic layout typically don't report it. They leave. The conversion gap between a properly-built Arabic store and a half-implemented one is measurable in direct revenue.&lt;/p&gt;

&lt;p&gt;If you want us to audit your existing Shopify store's Arabic experience or build a new RTL-ready store, &lt;a href="https://dev.to/services/saudi-arabia"&gt;start with a discovery call here&lt;/a&gt;.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Does Shopify natively support Arabic RTL?&lt;/strong&gt;&lt;br&gt;
Partially. Shopify OS 2.0 themes apply &lt;code&gt;dir="rtl"&lt;/code&gt; to the HTML element when Arabic is the active language, and handle basic text direction. However, CSS positioning, flexbox layouts, icon direction, margins, and third-party app widgets all require manual fixes. Native support handles perhaps 60-70% of what a proper Arabic store needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I build a bilingual English/Arabic store on Shopify?&lt;/strong&gt;&lt;br&gt;
Yes. Using Shopify Markets with multiple languages, you can serve English (LTR) and Arabic (RTL) from the same store. The &lt;code&gt;locale.direction&lt;/code&gt; variable handles layout switching automatically. Translation is handled via Translate &amp;amp; Adapt or a paid app like Weglot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Shopify plan do I need for a bilingual store?&lt;/strong&gt;&lt;br&gt;
Multiple languages are available on all Shopify plans. You can add up to 20 languages on standard plans. Shopify Markets (which lets you configure currency, language, and domains per region) is available from Basic and above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which Arabic fonts work best in Shopify?&lt;/strong&gt;&lt;br&gt;
For body copy: Noto Sans Arabic (most legible at small sizes). For headings: Tajawal or Cairo. Always use &lt;code&gt;line-height: 1.6&lt;/code&gt; to &lt;code&gt;1.8&lt;/code&gt; for Arabic body text: Arabic scripts need more vertical space than Latin equivalents. Never use &lt;code&gt;letter-spacing&lt;/code&gt; on Arabic text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I handle product names that are in English inside an Arabic store?&lt;/strong&gt;&lt;br&gt;
Use &lt;code&gt;dir="auto"&lt;/code&gt; on the element containing the product name. This uses the first strong-directional character to set the display direction automatically: works well for mixed-language product catalogs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this guide work for Shopify Hydrogen (headless) stores?&lt;/strong&gt;&lt;br&gt;
The Liquid-specific parts don't apply to headless builds, but the CSS principles, font strategy, and bidi content handling are all relevant. In Hydrogen, use React's &lt;code&gt;dir&lt;/code&gt; prop on the root element and manage RTL through Tailwind's RTL plugin or a CSS-in-JS RTL helper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the hardest part of building an Arabic Shopify store?&lt;/strong&gt;&lt;br&gt;
In our experience: third-party app compatibility. The core theme can be handled cleanly with the approach above. The unpredictable part is the 10-15 apps a typical merchant has installed, each injecting their own CSS that may fight your RTL overrides. Audit every installed app in Arabic view before launch.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://innovatrixinfotech.com/blog/how-to-build-arabic-rtl-shopify-store?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>arabic</category>
      <category>rtl</category>
      <category>middleeast</category>
    </item>
    <item>
      <title>Multi-Currency Shopify Setup for GCC: AED, SAR, KWD Step-by-Step</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Tue, 18 Aug 2026 04:30:01 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/multi-currency-shopify-setup-for-gcc-aed-sar-kwd-step-by-step-45fb</link>
      <guid>https://dev.to/emperorakashi20/multi-currency-shopify-setup-for-gcc-aed-sar-kwd-step-by-step-45fb</guid>
      <description>&lt;p&gt;Here's what most GCC multi-currency guides don't tell you: Shopify Payments is not available in the UAE or Saudi Arabia. That single fact changes your entire architecture.&lt;/p&gt;

&lt;p&gt;In Western markets, the standard Shopify multi-currency setup leans on Shopify Payments for currency management. In GCC markets, you're working with third-party payment gateways, and not all of them support settlement in every GCC currency. Getting this wrong means you either can't collect SAR payments, or you collect them and settle in AED at unfavourable exchange rates with margin implications you didn't model for.&lt;/p&gt;

&lt;p&gt;As a &lt;a href="https://dev.to/services/shopify"&gt;Shopify Partner&lt;/a&gt; that's built multi-currency stores for &lt;a href="https://dev.to/services/dubai"&gt;UAE&lt;/a&gt; and &lt;a href="https://dev.to/services/saudi-arabia"&gt;Saudi Arabia&lt;/a&gt; clients, we've mapped every decision in this setup. This guide gives you the architecture and the specific configuration steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You'll Build
&lt;/h2&gt;

&lt;p&gt;A Shopify store with separate Markets for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UAE (AED: Arab Emirates Dirham)&lt;/li&gt;
&lt;li&gt;Saudi Arabia (SAR: Saudi Riyal)&lt;/li&gt;
&lt;li&gt;Kuwait (KWD: Kuwaiti Dinar)&lt;/li&gt;
&lt;li&gt;Qatar (QAR: Qatari Riyal) [optional, same pattern]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each market with: local currency pricing, correct language assignment, payment gateway configuration, and tax settings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Shopify Basic plan or above (Markets is available on all paid plans)&lt;/li&gt;
&lt;li&gt;A payment gateway that supports multi-currency settlement in your target GCC currencies (we'll cover which ones)&lt;/li&gt;
&lt;li&gt;Your store's base currency set (typically AED or USD depending on where you're incorporated)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Navigate to Shopify Markets
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings &amp;gt; Markets&lt;/strong&gt; in your Shopify admin&lt;/li&gt;
&lt;li&gt;You'll see your primary market already configured (likely your home market)&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add market&lt;/strong&gt; to create each GCC market&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For each market, you'll configure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Country/region (which countries are in this market)&lt;/li&gt;
&lt;li&gt;Currency&lt;/li&gt;
&lt;li&gt;Language&lt;/li&gt;
&lt;li&gt;Domain or subdirectory (optional)&lt;/li&gt;
&lt;li&gt;Pricing rules&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 2: Create the GCC Markets
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;UAE Market (if not already your primary)&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Market name: &lt;code&gt;UAE&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Countries: United Arab Emirates&lt;/li&gt;
&lt;li&gt;Currency: AED (United Arab Emirates Dirham)&lt;/li&gt;
&lt;li&gt;Language: English (you can add Arabic as a secondary language)&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Saudi Arabia Market&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Market name: &lt;code&gt;Saudi Arabia&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Countries: Saudi Arabia&lt;/li&gt;
&lt;li&gt;Currency: SAR (Saudi Arabian Riyal)&lt;/li&gt;
&lt;li&gt;Language: Arabic (ar): this is critical; KSA customers have higher conversion on Arabic-first experiences&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Kuwait Market&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Market name: &lt;code&gt;Kuwait&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Countries: Kuwait&lt;/li&gt;
&lt;li&gt;Currency: KWD (Kuwaiti Dinar)&lt;/li&gt;
&lt;li&gt;Language: Arabic or English depending on your customer research&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Qatar Market (optional)&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Market name: &lt;code&gt;Qatar&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Countries: Qatar&lt;/li&gt;
&lt;li&gt;Currency: QAR (Qatari Riyal)&lt;/li&gt;
&lt;li&gt;Language: Arabic or English&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step 3: Fixed Local Pricing vs. Automatic Currency Conversion
&lt;/h2&gt;

&lt;p&gt;This is the most consequential decision in your multi-currency setup, and most tutorials gloss over it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automatic currency conversion&lt;/strong&gt; takes your base price (e.g., AED 200) and converts it to the target currency using Shopify's live exchange rate, updated regularly. It's fast to implement and requires no maintenance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fixed local pricing&lt;/strong&gt; means you set the exact price in each currency manually. SAR 210 is SAR 210, regardless of what the AED/SAR exchange rate does on any given day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our recommendation: Use fixed local pricing.&lt;/strong&gt; Here's why:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consumer experience.&lt;/strong&gt; SAR 209.73 looks like a foreign price. SAR 210 or SAR 199 looks like a locally-priced product. Pricing psychology is real, and round-number or .99 pricing in local currency converts better than auto-converted amounts with three decimal places.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Margin predictability.&lt;/strong&gt; If you're pricing AED 200 and the AED/SAR rate moves, your effective SAR price changes. Over a month of fluctuation, your KSA margin can drift materially from what you modelled.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Promotional pricing control.&lt;/strong&gt; When you run a 20% discount, you want it applied to a clean base price, not to a fluctuating converted amount.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The tradeoff is ongoing maintenance: if your base AED pricing changes, you need to update SAR and KWD prices manually or via a bulk CSV update. For most brands with &amp;lt;1,000 SKUs, this is manageable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to set fixed prices per market:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In Settings &amp;gt; Markets, click on your Saudi Arabia market&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Manage pricing&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Pricing by country&lt;/strong&gt;, you'll see options to set fixed prices per product or apply a price adjustment multiplier&lt;/li&gt;
&lt;li&gt;For granular control, use the &lt;strong&gt;price adjustment&lt;/strong&gt; approach (e.g., +5% over base price for KSA to account for VAT and logistics) as a starting point, then override individual products that need specific local pricing&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step 4: Payment Gateway Selection: The Critical Decision
&lt;/h2&gt;

&lt;p&gt;As of early 2026, &lt;strong&gt;Shopify Payments is not available in the UAE or Saudi Arabia.&lt;/strong&gt; This means you need a third-party gateway, and not all third-party gateways are equal for GCC multi-currency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The key question:&lt;/strong&gt; Does your gateway support settlement in the destination currency, or does it collect in local currency but settle in your base currency (AED or USD) after conversion?&lt;/p&gt;

&lt;p&gt;For GCC multi-currency, these are the gateways we recommend and have configured for clients:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Checkout.com&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports AED, SAR, KWD, QAR collection and settlement&lt;/li&gt;
&lt;li&gt;Strong technical documentation and Shopify integration&lt;/li&gt;
&lt;li&gt;Settlement accounts can be configured per currency&lt;/li&gt;
&lt;li&gt;Our first recommendation for brands targeting multiple GCC markets&lt;/li&gt;
&lt;li&gt;Setup requires a Checkout.com account per legal entity or one account with multi-currency settlement enabled&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Telr&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UAE-founded, strong regional presence&lt;/li&gt;
&lt;li&gt;Supports AED, SAR, and other GCC currencies&lt;/li&gt;
&lt;li&gt;Popular with UAE-incorporated merchants&lt;/li&gt;
&lt;li&gt;Simpler merchant onboarding than Checkout.com for UAE entities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;PayTabs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Saudi Arabia-founded, excellent KSA coverage&lt;/li&gt;
&lt;li&gt;Supports SAR, AED, KWD, QAR&lt;/li&gt;
&lt;li&gt;Good option if your primary market is KSA rather than UAE&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What to avoid:&lt;/strong&gt; Using a single gateway onboarded for AED that claims it "accepts" multi-currency but settles everything to AED. Your SAR revenue gets converted at the gateway's exchange rate before settlement, with both a conversion fee and rate risk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shopify + Checkout.com configuration:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install the Checkout.com app from the Shopify App Store&lt;/li&gt;
&lt;li&gt;In Settings &amp;gt; Payments &amp;gt; Payment providers, add Checkout.com as your primary gateway&lt;/li&gt;
&lt;li&gt;In your Checkout.com dashboard, enable the currencies corresponding to your Markets (SAR, KWD, QAR in addition to AED)&lt;/li&gt;
&lt;li&gt;Verify that each currency has a settlement account configured in Checkout.com&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step 5: Add BNPL Per Market
&lt;/h2&gt;

&lt;p&gt;Buy-now-pay-later is table stakes in GCC ecommerce. The provider selection varies by market:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UAE:&lt;/strong&gt; Tabby and Tamara are both strong. Tabby has strong brand recognition. Tamara is Saudi-founded but operates in UAE.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Saudi Arabia:&lt;/strong&gt; Tamara dominates. Install Tamara first. Tabby also operates in KSA.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kuwait/Qatar:&lt;/strong&gt; BNPL adoption is growing but less mature than UAE/KSA. Tabby covers both markets.&lt;/p&gt;

&lt;p&gt;For Shopify, both Tabby and Tamara have official Shopify apps. Install them and configure them to display in the appropriate markets via Shopify's market-conditional app settings.&lt;/p&gt;

&lt;p&gt;One critical configuration note: When setting up Tamara for KSA, pass &lt;code&gt;lang="ar"&lt;/code&gt; in the widget configuration to get Arabic-language BNPL messaging on product pages. Without this, it defaults to English even for Arabic-locale visitors.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: Language Assignment Per Market
&lt;/h2&gt;

&lt;p&gt;Shopify Markets lets you assign a primary language to each market. This is separate from making your store bilingual: it sets which language a customer from that market sees by default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UAE Market:&lt;/strong&gt; Set English as primary, add Arabic as secondary (many UAE residents are comfortable in English, but Arabic option matters for the Arabic-speaking majority)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Saudi Arabia Market:&lt;/strong&gt; Set Arabic as primary. KSA's online consumer base skews more Arabic-primary than UAE's, and Arabic-first experiences have meaningfully higher conversion in our client data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kuwait/Qatar:&lt;/strong&gt; English or Arabic as primary depending on your customer research. If uncertain, start with English primary and add Arabic as secondary.&lt;/p&gt;

&lt;p&gt;To enable multiple languages per market:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In Settings &amp;gt; Markets, click on the market&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Languages&lt;/strong&gt;, click &lt;strong&gt;Add language&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select your target language&lt;/li&gt;
&lt;li&gt;Use Translate &amp;amp; Adapt (free Shopify app) to provide translations for theme content&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For Arabic specifically, the RTL layout requirements apply as described in our &lt;a href="https://dev.to/blog/how-to-build-arabic-rtl-shopify-store"&gt;Arabic RTL Shopify guide&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: Tax Configuration Per Market
&lt;/h2&gt;

&lt;p&gt;GCC tax configuration is an area where mistakes have commercial consequences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UAE (AED):&lt;/strong&gt; 5% VAT. In Shopify, go to Settings &amp;gt; Taxes and duties &amp;gt; UAE. Enable VAT at 5%. For B2C (direct to consumer), prices are typically displayed inclusive of VAT in the UAE. Set your tax-inclusive/exclusive display preference in the market's settings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Saudi Arabia (SAR):&lt;/strong&gt; 15% VAT. This is not a typo. Saudi Arabia raised VAT from 5% to 15% in 2020. Go to Settings &amp;gt; Taxes and duties &amp;gt; Saudi Arabia. Enable VAT at 15%. If you're pricing SAR products at AED-equivalent levels and not accounting for the 10% VAT differential, your effective price is materially different from what you intended.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kuwait (KWD):&lt;/strong&gt; Kuwait does not currently have VAT. No tax configuration required for Kuwait sales. This can be a pricing advantage: your Kuwait prices can be clean without a VAT uplift.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qatar (QAR):&lt;/strong&gt; Qatar also does not currently apply VAT on ecommerce sales. Same as Kuwait: no tax configuration required at point of sale.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8: Liquid Code for Currency-Aware Display
&lt;/h2&gt;

&lt;p&gt;For stores that need to customise the display based on the active market, Shopify provides market-aware Liquid variables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Display currency symbol based on market:&lt;/strong&gt;&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;assign&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;market_currency&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="nv"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;currency&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;market_currency&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;'SAR'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt;
  &amp;lt;span class="currency-note"&amp;gt;س.ر (SAR 15% VAT included)&amp;lt;/span&amp;gt;
&lt;span class="cp"&gt;{%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;elsif&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;market_currency&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;'KWD'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt;
  &amp;lt;span class="currency-note"&amp;gt;KD (VAT-free)&amp;lt;/span&amp;gt;
&lt;span class="cp"&gt;{%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;elsif&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;market_currency&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;'AED'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt;
  &amp;lt;span class="currency-note"&amp;gt;AED (5% VAT included)&amp;lt;/span&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;&lt;strong&gt;Market-conditional announcement bar:&lt;/strong&gt;&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;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;localization&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;market&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;handle&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;when&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'saudi-arabia'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt;
    &amp;lt;p&amp;gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Free shipping on orders over SAR 200'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&amp;lt;/p&amp;gt;
  &lt;span class="cp"&gt;{%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;when&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'kuwait'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt;
    &amp;lt;p&amp;gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Free shipping on orders over KWD 15'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&amp;lt;/p&amp;gt;
  &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;
    &amp;lt;p&amp;gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Free shipping on orders over AED 150'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&amp;lt;/p&amp;gt;
&lt;span class="cp"&gt;{%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;endcase&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;&lt;strong&gt;Market-conditional payment badge display:&lt;/strong&gt;&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;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;localization&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;market&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;handle&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;'saudi-arabia'&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;render&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'payment-badges-ksa'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt; {# Shows MADA, Tamara, Visa, MC #}
&lt;span class="cp"&gt;{%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;elsif&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;localization&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;market&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;handle&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;'uae'&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;render&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'payment-badges-uae'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt; {# Shows Tabby, Tamara, Visa, MC, Apple Pay #}
&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;
  &lt;span class="cp"&gt;{%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;render&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'payment-badges-default'&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;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;h2&gt;
  
  
  Common Issues We've Fixed in Client Projects
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; SAR prices display correctly on product pages but revert to AED at checkout.&lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; Check that your payment gateway is configured to accept SAR transactions. If the gateway doesn't support SAR, Shopify falls back to the base currency at checkout. This is the most common multi-currency failure mode in GCC setups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; KWD prices show with three decimal places (e.g., KWD 12.500).&lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; KWD is one of the world's highest-value currencies and is denominated to three decimal places. This is technically correct. If you want to display it as KWD 12.5, use Shopify's money filters: &lt;code&gt;{{ product.price | money_without_trailing_zeros }}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Arabic locale customers see prices in AED despite being on the SAR market.&lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; The market assignment is based on the customer's country, not their language selection. Verify that Saudi Arabia is correctly assigned to the SAR market in Settings &amp;gt; Markets. If a Saudi customer is browsing via a VPN from another country, they may see a different market's pricing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Tax is being double-applied in UAE (once in Shopify, once at checkout by the gateway).&lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; Ensure your gateway is configured as a tax-inclusive setup matching your Shopify tax-inclusive display setting. Both Shopify and your gateway should be aware of whether prices already include VAT or are pre-tax.&lt;/p&gt;




&lt;h2&gt;
  
  
  Results From a Real GCC Multi-Currency Project
&lt;/h2&gt;

&lt;p&gt;For a UAE-based fashion brand we expanded to KSA on Shopify Markets, the transition from automatic currency conversion to fixed SAR pricing was the single highest-impact change in the launch sprint. Checkout abandonment on the KSA variant dropped by approximately 18% in the first two weeks post-launch, which we attribute to cleaner pricing presentation and the trust signal of locally-priced products.&lt;/p&gt;

&lt;p&gt;For KSA-specific payment configuration, correctly surfacing MADA via Checkout.com alongside Tamara was the second material lever. MADA usage in KSA is high enough that stores without it visible at checkout are simply not accessible to a significant share of Saudi shoppers.&lt;/p&gt;

&lt;p&gt;If you want us to review your current multi-currency setup or build GCC market expansion into your Shopify store from scratch, &lt;a href="https://dev.to/services/saudi-arabia"&gt;book a discovery call here&lt;/a&gt;.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Is Shopify Payments available in the UAE or Saudi Arabia?&lt;/strong&gt;&lt;br&gt;
No. As of early 2026, Shopify Payments is not available in the UAE, Saudi Arabia, or other GCC countries. You must use a third-party payment gateway. Checkout.com, Telr, and PayTabs are the most commonly used gateways for GCC multi-currency Shopify stores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I use automatic currency conversion or fixed local prices for GCC?&lt;/strong&gt;&lt;br&gt;
Fixed local prices, for the reasons covered above: better consumer experience, margin predictability, and promotional pricing control. The maintenance overhead is manageable for most brand sizes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Kuwait have VAT?&lt;/strong&gt;&lt;br&gt;
No. Kuwait does not currently apply VAT to ecommerce purchases. Qatar also has no ecommerce VAT currently. The UAE has 5% VAT; Saudi Arabia has 15% VAT.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many currencies can I have on one Shopify store?&lt;/strong&gt;&lt;br&gt;
Shopify supports up to 133 currencies via Shopify Markets. You can have multiple markets, each with different currencies, languages, and pricing. There is no technical limit to the number of GCC markets you configure on a single store.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens if a Saudi customer pays in AED instead of SAR?&lt;/strong&gt;&lt;br&gt;
Shopify assigns the market based on the customer's detected country. If the system correctly identifies a Saudi customer, they'll see SAR pricing and the KSA market configuration. Customers can sometimes manually change their currency: you can restrict this by removing the currency selector from your theme header if you want strict market enforcement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I have different product availability per GCC market?&lt;/strong&gt;&lt;br&gt;
Yes. Shopify Markets allows you to control which products are available in each market. If certain products aren't compliant for a specific market (e.g., items requiring halal certification that you haven't obtained), you can exclude them from that market's catalogue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need a separate Shopify store for each GCC country?&lt;/strong&gt;&lt;br&gt;
No. One Shopify store with properly configured Markets handles all GCC countries from a single codebase, product catalogue, and admin. Separate stores are rarely the right answer and create significant management overhead.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://innovatrixinfotech.com/blog/multi-currency-shopify-setup-gcc-aed-sar-kwd?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>multicurrency</category>
      <category>gcc</category>
      <category>aed</category>
    </item>
    <item>
      <title>UAE VAT Compliance for Shopify: The Complete 2026 Setup Guide</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Mon, 17 Aug 2026 09:30:01 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/uae-vat-compliance-for-shopify-the-complete-2026-setup-guide-5e8c</link>
      <guid>https://dev.to/emperorakashi20/uae-vat-compliance-for-shopify-the-complete-2026-setup-guide-5e8c</guid>
      <description>&lt;p&gt;This guide is not tax advice. You should always confirm your specific VAT treatment with a UAE-registered tax agent. What this guide is: a complete, technically accurate walkthrough of how to configure your Shopify store for UAE VAT compliance: one that doesn't gloss over the parts that most generic guides skip.&lt;/p&gt;

&lt;p&gt;We've configured UAE VAT for &lt;a href="https://dev.to/services/dubai"&gt;Dubai&lt;/a&gt; and UAE-based Shopify clients as part of our work as a &lt;a href="https://dev.to/services/shopify"&gt;Shopify Partner&lt;/a&gt;. The technical setup is straightforward. The compliance questions, what needs to be on your invoices, how exports are treated, what changed in January 2026, are where most store owners get it wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Changed in January 2026
&lt;/h2&gt;

&lt;p&gt;Before we get into the setup, it's worth flagging the VAT rule changes that took effect on January 1, 2026 under Federal Decree-Law No. 16 of 2025 and Federal Decree-Law No. 17 of 2025. These are not minor administrative updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Self-invoicing for reverse charge is removed.&lt;/strong&gt; Previously, when a UAE business purchased services from a foreign supplier (e.g., Shopify subscription fees, Meta advertising), it had to issue a self-invoice to itself under the reverse charge mechanism. From January 2026, this requirement is removed. You no longer self-invoice, but you must maintain the supporting documentation (contracts, purchase orders, payment confirmations) to substantiate the VAT treatment during any FTA audit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5-year deadline for reclaiming VAT credits.&lt;/strong&gt; VAT input tax credits from 2021 began expiring in 2026. If you've been carrying forward excess input VAT without filing refund claims, some of that credit may have expired. Check your credit balances and filing history now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;E-invoicing pilot launches July 2026.&lt;/strong&gt; The UAE is rolling out mandatory e-invoicing in phases. The voluntary pilot starts July 2026, with mandatory compliance for businesses with revenue exceeding AED 50 million starting January 2027. If you're in or approaching that revenue range, start reviewing the requirements now. For most SME Shopify merchants, the mandatory phase arrives in 2027-2028.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expanded FTA audit powers.&lt;/strong&gt; The FTA now has explicit authority to deny input VAT recovery if a supply is connected to tax evasion, even if you didn't know about the evasion. Vet your suppliers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Do You Need to Register for VAT?
&lt;/h2&gt;

&lt;p&gt;Before you configure anything in Shopify, you need to know whether you're required to register.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mandatory registration threshold:&lt;/strong&gt; AED 375,000 in taxable supplies and imports in any 12-month rolling period. If you've crossed this threshold, you must register within 30 days. Failure to register on time carries an AED 10,000 penalty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Voluntary registration threshold:&lt;/strong&gt; AED 187,500. If your taxable supplies are between AED 187,500 and AED 375,000, you can voluntarily register. Voluntary registration is often commercially sensible: it allows you to reclaim input VAT on your business expenses (Shopify subscription, advertising, logistics), which improves your effective cost structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're a new business:&lt;/strong&gt; Calculate your projected first-12-month revenue against these thresholds. If you expect to exceed AED 375,000 in year one, register before you start trading to avoid an immediate compliance gap.&lt;/p&gt;

&lt;p&gt;Registration is done through the FTA's EmaraTax portal. You'll receive a Tax Registration Number (TRN) that must appear on every VAT invoice you issue.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Configure UAE VAT in Shopify
&lt;/h2&gt;

&lt;p&gt;Once you're VAT-registered (or if you're setting up in advance), here's the Shopify configuration:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings &amp;gt; Taxes and duties&lt;/strong&gt; in your Shopify admin&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Tax regions&lt;/strong&gt;, click &lt;strong&gt;United Arab Emirates&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You'll see the option to set a tax rate. The standard rate is &lt;strong&gt;5%&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Set the rate to 5% and save&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Tax-inclusive vs. tax-exclusive pricing:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the UAE, B2C ecommerce prices are typically displayed inclusive of VAT: meaning the price your customer sees on the product page already includes the 5% VAT. This is the standard consumer expectation.&lt;/p&gt;

&lt;p&gt;To display prices inclusive of VAT:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In Settings &amp;gt; Taxes and duties, check &lt;strong&gt;"All prices include tax"&lt;/strong&gt; under your UAE market&lt;/li&gt;
&lt;li&gt;Shopify will calculate the tax component from your price (e.g., if you price at AED 210, Shopify knows AED 10 of that is VAT)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For B2B customers (businesses buying from you who are VAT-registered themselves), you may want to display prices exclusive of VAT. This is a more complex setup requiring different price lists or customer tags. For most D2C Shopify stores, tax-inclusive B2C pricing is the correct default.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: VAT Invoice Compliance
&lt;/h2&gt;

&lt;p&gt;This is where most Shopify stores have a gap. Shopify's default order confirmation email and invoice template is not fully FTA-compliant out of the box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the FTA requires on a UAE VAT invoice:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The word "Tax Invoice" on the document&lt;/li&gt;
&lt;li&gt;Your business name and address&lt;/li&gt;
&lt;li&gt;Your Tax Registration Number (TRN)&lt;/li&gt;
&lt;li&gt;The customer's name and address (for B2B)&lt;/li&gt;
&lt;li&gt;A unique, sequential invoice number&lt;/li&gt;
&lt;li&gt;The date of the supply&lt;/li&gt;
&lt;li&gt;A description of the goods or services&lt;/li&gt;
&lt;li&gt;The quantity and unit price&lt;/li&gt;
&lt;li&gt;The taxable amount per VAT rate&lt;/li&gt;
&lt;li&gt;The VAT rate applied&lt;/li&gt;
&lt;li&gt;The total VAT amount&lt;/li&gt;
&lt;li&gt;The total amount payable (inclusive of VAT)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What Shopify's default template typically lacks:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your TRN displayed prominently&lt;/li&gt;
&lt;li&gt;A "Tax Invoice" label&lt;/li&gt;
&lt;li&gt;Consistent tax-rate breakdowns per line item in some configurations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fixing this: Two options&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 1: Sufio (paid app, cleanest solution):&lt;/strong&gt; Sufio generates FTA-compliant UAE VAT invoices automatically for every order. It handles TRN display, sequential invoice numbering, tax breakdowns, and document formatting. For most SME merchants, this is the fastest path to compliance. Plans start around $19/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 2: Custom Liquid invoice template:&lt;/strong&gt; If you want to avoid the ongoing app cost, you can customise Shopify's invoice template yourself. This is a technical task but not an advanced one for anyone comfortable with Liquid.&lt;/p&gt;

&lt;p&gt;In your Shopify admin, go to Settings &amp;gt; Notifications &amp;gt; Order invoice. The template uses Liquid syntax. Add your TRN, "Tax Invoice" label, and ensure the tax breakdown renders correctly:&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;h1&amp;gt;Tax Invoice&amp;lt;/h1&amp;gt;
&amp;lt;p&amp;gt;Tax Registration Number: &amp;lt;strong&amp;gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;shop&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;metafields&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;custom&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;trn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;!-- Or hardcode your TRN directly: --&amp;gt;
&amp;lt;p&amp;gt;TRN: &amp;lt;strong&amp;gt;1234567890123456&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;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;line&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;subtotal_line_items&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td&amp;gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;quantity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;price&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;money&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;tax_lines&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;map&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'rate'&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;first&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;times&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;%&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;total_tax&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;money&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&amp;lt;/td&amp;gt;
  &amp;lt;/tr&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;

&amp;lt;p&amp;gt;Subtotal (excl. VAT): &lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subtotal_price&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;minus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tax_price&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;money&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;VAT (5%): &lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tax_price&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;money&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Total (incl. VAT): &lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;total_price&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;money&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Store your TRN in a Shopify metafield (&lt;code&gt;shop.metafields.custom.trn&lt;/code&gt;) so it's maintainable without touching code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Shopify + Accounting Integration for VAT Reporting
&lt;/h2&gt;

&lt;p&gt;Filing your UAE VAT return requires a clear record of your output VAT (VAT you collected from customers) and input VAT (VAT you paid on business expenses). Shopify is your sales system; you need it to flow correctly into your accounting software.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Xero + Shopify:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Xero has a native Shopify integration (or use the A2X connector for more granular control). The integration pulls order revenue, tax, refunds, and payment data into Xero. In your Xero setup:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a VAT tax rate in Xero for UAE: 5% on revenue accounts&lt;/li&gt;
&lt;li&gt;Map your Shopify income account to your UAE sales account in Xero&lt;/li&gt;
&lt;li&gt;Verify that imported Shopify transactions show the correct tax treatment&lt;/li&gt;
&lt;li&gt;VAT returns in Xero &amp;gt; Tax &amp;gt; VAT Returns pull this data into the correct FTA return boxes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;QuickBooks Online + Shopify:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;QuickBooks Online supports UAE VAT (it has a UAE-specific VAT centre). The Shopify connector maps your Shopify sales to QuickBooks. Set up your UAE 5% VAT tax rate in QuickBooks, then run periodic reconciliations between Shopify sales reports and QuickBooks VAT liability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key reconciliation items to check monthly:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total Shopify net revenue should match income in accounting software&lt;/li&gt;
&lt;li&gt;Output VAT in your accounting system should match Shopify tax reports (Reports &amp;gt; Taxes &amp;gt; UAE)&lt;/li&gt;
&lt;li&gt;Refunds and returns reduce both revenue and VAT: verify these flow correctly&lt;/li&gt;
&lt;li&gt;Shopify subscription fees (charged in USD) and Meta/Google ad spend may be subject to reverse charge VAT: confirm with your accountant&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 5: Cross-Border and Export VAT Treatment
&lt;/h2&gt;

&lt;p&gt;If you're selling from the UAE to customers outside the UAE, the VAT treatment is different, and this is where D2C brands commonly make expensive mistakes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exports of goods from UAE are zero-rated (0% VAT).&lt;/strong&gt; This means you don't charge VAT on goods shipped to customers outside the UAE. You still need to record these as zero-rated supplies on your VAT return, and you need documentation proving the export (airway bill, courier tracking, etc.) because without proof, the FTA can reclassify the sale as standard-rated and assess you for the 5% VAT.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In Shopify, configure export tax handling:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In Settings &amp;gt; Taxes and duties, under UAE tax settings, Shopify can be configured to charge 0% tax for orders shipping to addresses outside the UAE&lt;/li&gt;
&lt;li&gt;Verify your shipping zones are correctly mapped: UAE addresses → 5% VAT; international addresses → 0% VAT&lt;/li&gt;
&lt;li&gt;Check this configuration in a test order before going live&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;For KSA customers:&lt;/strong&gt; Saudi Arabia has its own 15% VAT system. Sales from a UAE store to Saudi Arabia are, for most Shopify merchants, treated as exports from UAE (zero-rated in UAE) and potentially subject to import VAT/customs in KSA at the point of entry. The specifics depend on your product category and delivery structure. Confirm with a UAE tax advisor if this is a significant revenue stream.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: B2B Customers and Reverse Charge
&lt;/h2&gt;

&lt;p&gt;If you have B2B customers, other VAT-registered UAE businesses buying from you, the invoicing requirements are more stringent, and the reverse charge mechanism may apply in some cases.&lt;/p&gt;

&lt;p&gt;For UAE-to-UAE B2B sales, standard 5% VAT applies. Your B2B customer can reclaim this input VAT on their own VAT return, so they'll want a proper VAT invoice from you (see Step 3 above).&lt;/p&gt;

&lt;p&gt;For services you purchase from non-UAE suppliers (foreign software, foreign consultants, foreign platforms: including Shopify's own subscription fees if you're not set up with a UAE entity), you as the UAE VAT-registered business account for VAT under the reverse charge mechanism. From January 2026, you no longer need to issue a self-invoice for this, but you must maintain the underlying documentation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Compliance Mistakes We See
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;No TRN on invoices.&lt;/strong&gt; The most common and the most obvious gap. If your Shopify order confirmation email doesn't display your TRN, your invoices are technically non-compliant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong VAT on KSA orders.&lt;/strong&gt; Stores that haven't configured shipping zones correctly can charge 5% UAE VAT on orders shipping to Saudi Arabia. Saudi-bound shipments from UAE should be zero-rated (export). KSA has its own separate 15% VAT that applies at import.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ignoring Shopify's own fees.&lt;/strong&gt; Shopify charges you subscription fees and transaction fees. These may be subject to UAE VAT (Shopify added UAE VAT to its invoices for UAE-registered businesses). Make sure you're capturing this input VAT.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Missing refund VAT adjustments.&lt;/strong&gt; When you refund a customer, the VAT element of the refund should reduce your output VAT liability. Verify that your accounting integration handles this correctly: some configurations don't pull Shopify refunds into accounting software automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expired VAT credits.&lt;/strong&gt; Post-2026, any input VAT credit older than five years expires. If you've been carrying forward credits from 2021, check your position before year-end.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Reference: UAE VAT Setup Checklist
&lt;/h2&gt;

&lt;p&gt;Before going live with a UAE Shopify store, verify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] VAT registration obtained if above AED 375K threshold (or voluntary registration in place)&lt;/li&gt;
&lt;li&gt;[ ] TRN added to Shopify invoice template or via Sufio app&lt;/li&gt;
&lt;li&gt;[ ] Shopify tax rate set to 5% for UAE market&lt;/li&gt;
&lt;li&gt;[ ] Tax-inclusive pricing enabled for B2C ("All prices include tax")&lt;/li&gt;
&lt;li&gt;[ ] Shipping zones configured: UAE = 5% VAT, international = 0% (export)&lt;/li&gt;
&lt;li&gt;[ ] Accounting software connected (Xero or QuickBooks) with UAE VAT rates mapped&lt;/li&gt;
&lt;li&gt;[ ] Monthly reconciliation process documented&lt;/li&gt;
&lt;li&gt;[ ] Export documentation process in place (for international shipments)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want a professional review of your Shopify VAT configuration, or you're setting up a new &lt;a href="https://dev.to/services/dubai"&gt;Dubai or UAE ecommerce presence&lt;/a&gt; and want it done correctly from day one, &lt;a href="https://dev.to/services/shopify"&gt;book a discovery call here&lt;/a&gt;. We don't do tax advisory (for that, you need a UAE-registered tax agent), but we do ensure your Shopify technical configuration matches what your accountant needs.&lt;/p&gt;

&lt;p&gt;For KSA context, note that Saudi Arabia's VAT is 15%: three times the UAE rate. Read our &lt;a href="https://dev.to/blog/multi-currency-shopify-setup-gcc-aed-sar-kwd"&gt;multi-currency GCC Shopify guide&lt;/a&gt; for how to configure both markets correctly from one store.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Is UAE VAT 5% or has it increased?&lt;/strong&gt;&lt;br&gt;
The UAE standard VAT rate remains 5% as of 2026. There has been no increase. (Saudi Arabia, by contrast, raised its rate from 5% to 15% in 2020. Don't confuse the two.) The 2026 changes were procedural, removal of self-invoicing requirement, 5-year credit expiry, e-invoicing pilot, not a rate change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does my Shopify store automatically handle UAE VAT?&lt;/strong&gt;&lt;br&gt;
Shopify can be configured to collect and display UAE VAT at 5%. But configuration is not automatic: you must set up the tax rate, configure tax-inclusive pricing, and ensure your invoice template includes your TRN. These do not happen by default when you create a Shopify store.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the UAE VAT registration threshold?&lt;/strong&gt;&lt;br&gt;
Mandatory registration: AED 375,000 in taxable supplies in any 12-month rolling period. Voluntary registration: AED 187,500. Failure to register when mandatory carries a AED 10,000 penalty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need to charge VAT on orders shipped outside the UAE?&lt;/strong&gt;&lt;br&gt;
No. Exported goods are zero-rated (0% VAT) in the UAE. You must maintain export documentation (courier tracking, airway bills) to substantiate the zero-rating. Without documentation, the FTA can reclassify the sale as standard-rated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the e-invoicing mandate and when does it affect my store?&lt;/strong&gt;&lt;br&gt;
The UAE is implementing mandatory e-invoicing in phases starting July 2026. The voluntary pilot begins July 2026. Mandatory compliance applies first to businesses with revenue above AED 50 million (from January 2027). Smaller businesses will follow in subsequent phases. For most SME Shopify merchants, mandatory e-invoicing is a 2027-2028 concern, but it's worth understanding the direction now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changed with reverse charge VAT in January 2026?&lt;/strong&gt;&lt;br&gt;
The requirement to issue self-invoices for reverse charge transactions (services purchased from foreign suppliers) was removed. From January 2026, you account for reverse charge VAT without issuing a self-invoice, but you must retain supporting documents (contracts, purchase orders, payment evidence) for audit purposes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Sufio the only option for FTA-compliant Shopify invoices?&lt;/strong&gt;&lt;br&gt;
No. Sufio is the most popular paid app for this. You can also build compliance into Shopify's native invoice notification template using Liquid: it requires a developer's attention but is technically achievable and has no ongoing monthly cost. For high-volume stores, Sufio's automation saves meaningful admin time.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://innovatrixinfotech.com/blog/uae-vat-compliance-shopify-2026-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>shopify</category>
      <category>uae</category>
      <category>vat</category>
      <category>taxcompliance</category>
    </item>
    <item>
      <title>How to Add Tabby and Tamara BNPL to Your Shopify Store [UAE Guide]</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Wed, 12 Aug 2026 04:30:02 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/how-to-add-tabby-and-tamara-bnpl-to-your-shopify-store-uae-guide-2n67</link>
      <guid>https://dev.to/emperorakashi20/how-to-add-tabby-and-tamara-bnpl-to-your-shopify-store-uae-guide-2n67</guid>
      <description>&lt;p&gt;UAE shoppers expect Buy Now, Pay Later at checkout. It's not a feature you offer to stand out anymore — it's one you're penalized for not offering. The BNPL market in the UAE is projected to grow from $2.07 billion in 2023 to $4.41 billion by 2029, driven heavily by the 18–35 demographic that makes up a significant portion of online shoppers.&lt;/p&gt;

&lt;p&gt;Tabby and Tamara are the two dominant BNPL providers in the UAE. For Shopify merchants, the good news is that both offer official Shopify app integrations. The bad news is that most implementation guides stop at "install the app" — and the stores that just install the app see minimal lift.&lt;/p&gt;

&lt;p&gt;The lift comes from where you put the widgets.&lt;/p&gt;

&lt;p&gt;This guide walks through the complete installation of both Tabby and Tamara on a Shopify store, the configuration that actually moves conversion metrics, and the gotchas we've encountered building UAE Shopify stores as a Shopify Partner.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You'll Learn
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How Tabby and Tamara work (and the difference between them)&lt;/li&gt;
&lt;li&gt;Prerequisites before you apply for merchant accounts&lt;/li&gt;
&lt;li&gt;Step-by-step installation for both apps on Shopify&lt;/li&gt;
&lt;li&gt;Widget placement strategy: PDP, cart, and checkout&lt;/li&gt;
&lt;li&gt;Test mode setup and how to run end-to-end test transactions&lt;/li&gt;
&lt;li&gt;Common errors and how to fix them&lt;/li&gt;
&lt;li&gt;The AOV optimization layer most stores miss&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before you start the installation, you need to have the following in place:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For both Tabby and Tamara:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A valid UAE, Saudi Arabia, or Kuwait trade license&lt;/li&gt;
&lt;li&gt;A corporate bank account in the same country as your trade license&lt;/li&gt;
&lt;li&gt;A live (or near-live) Shopify store URL&lt;/li&gt;
&lt;li&gt;An SSL certificate on your domain (Shopify provides this automatically)&lt;/li&gt;
&lt;li&gt;Products priced within BNPL eligibility ranges (more on this below)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For Tabby specifically:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your store must primarily serve UAE, KSA, or Kuwait billing addresses. Tabby only processes orders from these three markets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For Tamara specifically:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tamara operates in UAE, Saudi Arabia, Kuwait, and Bahrain. Similar market restrictions apply.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you don't have a UAE trade license yet, read our guide on &lt;a href="https://dev.to/blog/start-ecommerce-dubai-2026"&gt;how to start an ecommerce business in Dubai&lt;/a&gt; first — getting the gateway approved before the business is legally registered is a common sequencing mistake.&lt;/p&gt;




&lt;h2&gt;
  
  
  Understanding the BNPL Model (Important Before You Apply)
&lt;/h2&gt;

&lt;p&gt;Before integrating, understand exactly how the commercial model works:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For your customers:&lt;/strong&gt; They split the purchase into 4 equal interest-free installments. For Tabby, 25% is paid upfront at checkout; the remaining 3 payments are auto-debited every 2 weeks or monthly, depending on the plan. For Tamara, options include 2-part or 4-part payments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For you as the merchant:&lt;/strong&gt; You receive the full purchase amount upfront. Tabby and Tamara assume the collection risk. Your cost is the merchant discount rate (MDR) — typically 3–6% per transaction, depending on your agreement and monthly volume.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Order eligibility ranges:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tabby: typically eligible for orders between AED 100 and AED 5,000 (thresholds confirmed at merchant onboarding)&lt;/li&gt;
&lt;li&gt;Tamara: similar ranges; confirm specific thresholds during merchant application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Orders below the minimum or above the maximum won't display the BNPL option. Configure your widget display logic accordingly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 1: Installing Tabby on Shopify
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Apply for a Tabby Merchant Account
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://tabby.ai" rel="noopener noreferrer"&gt;tabby.ai&lt;/a&gt; and click &lt;strong&gt;Become a Partner&lt;/strong&gt; or &lt;strong&gt;Merchant Sign Up&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Fill in your business details: trade license number, business name, website URL, and contact information.&lt;/li&gt;
&lt;li&gt;Upload required documents: trade license copy, bank account details (IBAN + bank name), and authorized signatory's ID.&lt;/li&gt;
&lt;li&gt;Tabby will review your application. Approval typically takes 2–5 business days. You'll receive your &lt;strong&gt;Merchant API Key&lt;/strong&gt; and &lt;strong&gt;Secret Key&lt;/strong&gt; upon approval.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Do not start Step 2 until you have your API credentials. The app won't function without them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 2: Install the Tabby App from Shopify App Store
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In your Shopify Admin, go to &lt;strong&gt;Apps&lt;/strong&gt; → &lt;strong&gt;App and sales channel settings&lt;/strong&gt; → &lt;strong&gt;Shopify App Store&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Search for &lt;strong&gt;"Tabby"&lt;/strong&gt; and select the official Tabby app (published by Tabby).&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add App&lt;/strong&gt; and confirm the installation permissions.&lt;/li&gt;
&lt;li&gt;You'll be redirected to the Tabby app configuration screen within Shopify Admin.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;[SCREENSHOT: Shopify App Store showing the official Tabby app listing]&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Connect Your Tabby Merchant Account
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In the Tabby app, navigate to &lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;API Credentials&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enter your &lt;strong&gt;Public Key&lt;/strong&gt; and &lt;strong&gt;Secret Key&lt;/strong&gt; from your Tabby merchant portal.&lt;/li&gt;
&lt;li&gt;Select your primary market: &lt;strong&gt;UAE (AED)&lt;/strong&gt;, &lt;strong&gt;Saudi Arabia (SAR)&lt;/strong&gt;, or &lt;strong&gt;Kuwait (KWD)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If your store serves multiple GCC markets, Tabby handles currency conversion automatically based on the billing address at checkout.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;One thing developers miss here:&lt;/strong&gt; Tabby processes orders in the &lt;em&gt;customer's billing currency&lt;/em&gt;, not your store's base currency. If your store is set to USD base currency but you're serving AED customers, Tabby will convert and process in AED. Ensure your Shopify markets are configured correctly with the right currency enabled for each region.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Configure Payment Settings in Shopify
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;Payments&lt;/strong&gt; in Shopify Admin.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Alternative Payment Methods&lt;/strong&gt;, you should now see Tabby listed.&lt;/li&gt;
&lt;li&gt;Enable it and confirm the payment method is active.&lt;/li&gt;
&lt;li&gt;Set your minimum and maximum order values for Tabby eligibility. This prevents the widget from showing on orders Tabby won't approve.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;[SCREENSHOT: Shopify Payments settings showing Tabby enabled as alternative payment method]&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Add the Tabby Widget to Your Product Pages (Critical Step)
&lt;/h3&gt;

&lt;p&gt;This is where most merchants underperform. Installing the app activates Tabby at checkout. But the conversion lift comes from showing installment amounts &lt;em&gt;on the product page&lt;/em&gt;, before the customer even adds to cart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For Shopify stores using Online Store 2.0 themes:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Online Store&lt;/strong&gt; → &lt;strong&gt;Themes&lt;/strong&gt; → &lt;strong&gt;Customize&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Navigate to your &lt;strong&gt;Product&lt;/strong&gt; template.&lt;/li&gt;
&lt;li&gt;Look for &lt;strong&gt;"Add block"&lt;/strong&gt; near your price section.&lt;/li&gt;
&lt;li&gt;If the Tabby app has registered a block, it will appear in the block options as "Tabby Installment Widget" or similar.&lt;/li&gt;
&lt;li&gt;Add it directly under your price element.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;For stores on older themes (not OS 2.0):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You'll need to manually edit the &lt;code&gt;product.liquid&lt;/code&gt; or &lt;code&gt;product-template.liquid&lt;/code&gt; file. Add the Tabby snippet just below the price display:&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;!-- Tabby PDP Widget --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"TabbyPromo"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;TabbyPromo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#TabbyPromo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;{{ shop.currency }}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;selected_or_first_available_variant&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="na"&gt;divided_by&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;100.0&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
    &lt;span class="na"&gt;lang&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="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;product&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;blockquote&gt;
&lt;p&gt;Note: Tabby provides their own widget initialization script via their merchant portal. The snippet above is illustrative — use the exact script from your Tabby dashboard, as it will include your public key pre-populated.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Also add the widget to your Cart page&lt;/strong&gt; using the same logic, with &lt;code&gt;source: 'cart'&lt;/code&gt; parameter. Showing the installment amount in the cart reinforces the decision already made on the PDP.&lt;/p&gt;

&lt;p&gt;[SCREENSHOT: Product page showing Tabby installment widget under price with "4 payments of AED X" display]&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Enable Test Mode
&lt;/h3&gt;

&lt;p&gt;Before going live, run at least 3 test transactions to verify the full flow.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In your Tabby merchant portal, toggle &lt;strong&gt;Test Mode&lt;/strong&gt; to ON.&lt;/li&gt;
&lt;li&gt;Use Tabby's sandbox test credentials (provided in the merchant portal documentation).&lt;/li&gt;
&lt;li&gt;Complete a test purchase on your store: add product → proceed to checkout → select Tabby → complete simulated payment.&lt;/li&gt;
&lt;li&gt;Verify the order appears in both your Shopify orders dashboard and your Tabby merchant portal.&lt;/li&gt;
&lt;li&gt;Test a refund flow as well: initiate a refund in Shopify and confirm Tabby processes it correctly.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once testing is complete, toggle Test Mode OFF before your store goes live.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 2: Installing Tamara on Shopify
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Apply for a Tamara Merchant Account
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://tamara.co" rel="noopener noreferrer"&gt;tamara.co&lt;/a&gt; and navigate to &lt;strong&gt;Merchant&lt;/strong&gt; → &lt;strong&gt;Sign Up&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Complete the merchant application with your business license, bank details, and website information.&lt;/li&gt;
&lt;li&gt;Tamara is Sharia-compliant and explicitly positioned as such. If your target market includes consumers for whom this matters, Tamara's branding is a selling point you can leverage in your checkout messaging.&lt;/li&gt;
&lt;li&gt;Approval timeline: similar to Tabby, typically 3–5 business days.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: Install the Tamara App from Shopify App Store
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Search for &lt;strong&gt;"Tamara"&lt;/strong&gt; in the Shopify App Store.&lt;/li&gt;
&lt;li&gt;Install the official Tamara app. The app is listed as free with no installation fees (MDR applies per transaction as negotiated in your merchant agreement).&lt;/li&gt;
&lt;li&gt;Confirm installation permissions.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 3: Configure Tamara Credentials
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In the Tamara app settings, enter your &lt;strong&gt;Merchant Token&lt;/strong&gt; from the Tamara merchant portal.&lt;/li&gt;
&lt;li&gt;Select your markets: UAE, Saudi Arabia, Kuwait, or Bahrain.&lt;/li&gt;
&lt;li&gt;Configure your installment options: Tamara offers both 2-part and 4-part payment splits. Enable both to give customers maximum flexibility.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 4: Add Tamara to Checkout
&lt;/h3&gt;

&lt;p&gt;Like Tabby, Tamara appears as an alternative payment method in your Shopify checkout once the app is installed and credentials are entered. Verify it's enabled under &lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;Payments&lt;/strong&gt; → &lt;strong&gt;Alternative Payment Methods&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Widget Placement for Tamara
&lt;/h3&gt;

&lt;p&gt;Follow the same widget placement logic as Tabby — product page under price, cart page, and checkout. Tamara provides its own widget script via the merchant portal.&lt;/p&gt;

&lt;p&gt;If you're running both Tabby and Tamara simultaneously, stack the widgets cleanly. Don't clutter the PDP with two separate BNPL badges competing for visual space — use a combined display that shows both options if your theme supports it, or prioritize Tabby (higher UAE adoption) and show Tamara at checkout.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Test Tamara
&lt;/h3&gt;

&lt;p&gt;Tamara's test mode works via sandbox credentials in their merchant portal. Follow the same test transaction process as Tabby: full purchase → order confirmation → refund flow.&lt;/p&gt;




&lt;h2&gt;
  
  
  The AOV Optimization Layer Most Stores Miss
&lt;/h2&gt;

&lt;p&gt;Installing BNPL and having it show at checkout is the floor, not the ceiling.&lt;/p&gt;

&lt;p&gt;The stores that see 20–40% AOV lift from BNPL do the following:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. PDP microcopy placement.&lt;/strong&gt; "Or 4 payments of AED X with Tabby" placed directly under the price — not below the add-to-cart button, not in a footer FAQ. Under the price.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Cart page reinforcement.&lt;/strong&gt; When a customer has AED 800 in their cart and sees "4 payments of AED 200" in the cart summary, the mental model shifts from "spending AED 800" to "spending AED 200 today." This is the psychological lever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Homepage hero messaging.&lt;/strong&gt; A one-line callout: "Shop now. Pay in 4 interest-free installments with Tabby." Simple, high-visibility. Especially effective for first-time visitors who don't know BNPL is available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Arabic localization of widgets.&lt;/strong&gt; If any portion of your traffic is Arabic-speaking, ensure the Tabby/Tamara widgets are configured to display in Arabic. The lift from Arabic mobile users is disproportionate to effort — both Tabby and Tamara support Arabic widget language settings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. GA4 tracking.&lt;/strong&gt; Set a GA4 custom dimension for payment method to track which payment type correlates with higher AOV and lower return rates. Measure before and after BNPL installation with a 30-day comparison window.&lt;/p&gt;

&lt;p&gt;We set all of this up as part of our standard UAE Shopify builds. The payment infrastructure isn't just about accepting money — it's a conversion layer that should be engineered, not installed and forgotten. See how we approach this in our &lt;a href="https://dev.to/services/shopify-development-company-dubai"&gt;Shopify development work for Dubai brands&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Issues and Fixes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Issue: Tabby widget not showing on product pages.&lt;/strong&gt;&lt;br&gt;
Most common cause: the widget is only initialized at checkout, not on the PDP. Check whether you've added the PDP widget snippet separately from the app installation. The app activates checkout; the PDP widget requires a separate implementation step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Issue: "Tabby cannot process this order" error at checkout.&lt;/strong&gt;&lt;br&gt;
Likely causes: (1) order amount is below Tabby's minimum or above maximum, (2) customer billing address is outside UAE/KSA/Kuwait, or (3) your API credentials are in test mode on a live store. Check each in order.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Issue: Currency mismatch error.&lt;/strong&gt;&lt;br&gt;
Tabby processes in AED, SAR, or KWD corresponding to the customer's billing country. If your Shopify market configuration doesn't have the correct currency enabled for the customer's region, you'll see currency mismatch errors. Go to &lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;Markets&lt;/strong&gt; and verify each market has the correct currency assigned.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Issue: Tamara app not appearing in alternative payment methods.&lt;/strong&gt;&lt;br&gt;
This usually means your merchant token wasn't saved correctly, or the Tamara app doesn't have the required Shopify permissions. Try removing and reinstalling the app, then re-entering your merchant token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Issue: BNPL widget is slow to load on mobile.&lt;/strong&gt;&lt;br&gt;
Both Tabby and Tamara widgets load asynchronously, but a poorly performing theme can delay widget rendering. Load the widget script with &lt;code&gt;async&lt;/code&gt; and &lt;code&gt;defer&lt;/code&gt; attributes to prevent it from blocking product page load. On mobile, widget render time directly impacts conversion.&lt;/p&gt;




&lt;h2&gt;
  
  
  What We Typically See in UAT (User Acceptance Testing) Before Launch
&lt;/h2&gt;

&lt;p&gt;Before we hand over any UAE Shopify store with BNPL integrated, our internal checklist covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Tabby widget visible on PDP, positioned under price&lt;/li&gt;
&lt;li&gt;[ ] Tamara widget (if installed) visible on PDP&lt;/li&gt;
&lt;li&gt;[ ] Cart page shows installment amounts&lt;/li&gt;
&lt;li&gt;[ ] Both gateways visible at checkout&lt;/li&gt;
&lt;li&gt;[ ] Test transaction completed end-to-end for both Tabby and Tamara&lt;/li&gt;
&lt;li&gt;[ ] Refund flow tested and confirmed&lt;/li&gt;
&lt;li&gt;[ ] Arabic widget language tested on Arabic language store variant&lt;/li&gt;
&lt;li&gt;[ ] Order below minimum threshold — widget correctly hidden&lt;/li&gt;
&lt;li&gt;[ ] Order above maximum threshold — widget correctly hidden&lt;/li&gt;
&lt;li&gt;[ ] Test mode toggled OFF before handover&lt;/li&gt;
&lt;li&gt;[ ] GA4 payment type custom dimension firing correctly&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;&lt;strong&gt;Do I need a separate bank account for Tabby and Tamara?&lt;/strong&gt;&lt;br&gt;
No. Tabby and Tamara settle funds to your existing corporate bank account (the same one registered during merchant onboarding). You don't need a separate account for each provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When does Tabby / Tamara pay me as a merchant?&lt;/strong&gt;&lt;br&gt;
Both providers pay you the full order amount upfront, minus the merchant discount rate. Settlement timing is typically within a few business days, as agreed in your merchant contract.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I offer both Tabby and Tamara at the same time?&lt;/strong&gt;&lt;br&gt;
Yes. Both can coexist as alternative payment methods in Shopify. UAE customers will see both options at checkout and can choose their preferred provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens if a customer defaults on installment payments?&lt;/strong&gt;&lt;br&gt;
This is between the customer and the BNPL provider. As a merchant, you've already been paid in full. The default risk sits with Tabby or Tamara, not with you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is BNPL available for all product categories in the UAE?&lt;/strong&gt;&lt;br&gt;
Most physical product categories are eligible. Some BNPL providers restrict certain categories (e.g., financial services, gambling). For standard D2C categories — fashion, beauty, electronics, home goods — there are no restrictions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do Tabby and Tamara work with Shopify's draft orders or B2B features?&lt;/strong&gt;&lt;br&gt;
Both are designed for standard B2C checkout flows. Shopify's draft orders and B2B checkout don't typically trigger BNPL app integrations. For B2B BNPL, you'd need to explore custom API integration directly with the providers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What BNPL impact should I realistically expect on AOV?&lt;/strong&gt;&lt;br&gt;
Stores with proper BNPL widget placement (PDP + cart + checkout) typically see AOV increases of 20–40% among orders where BNPL is selected. The overall store AOV uplift depends on BNPL adoption rate. UAE stores we've built have seen BNPL account for 25–35% of order volume within 60 days of launch when properly implemented.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Need help with BNPL integration, payment gateway setup, or a full UAE Shopify build? Our team handles this end-to-end. &lt;a href="https://cal.com/innovatrix-infotech/explore" rel="noopener noreferrer"&gt;Book a discovery call&lt;/a&gt; to discuss your store.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;About the Author&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rishabh Sethia&lt;/strong&gt; is the Founder &amp;amp; CEO of Innovatrix Infotech. Former Senior Software Engineer and Head of Engineering. DPIIT Recognised Startup | Official Shopify Partner | AWS Partner. He has personally architected payment infrastructure for D2C stores across India, UAE, and Singapore.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://innovatrixinfotech.com/blog/tabby-tamara-bnpl-shopify-uae?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>tabby</category>
      <category>tamara</category>
      <category>bnpluae</category>
      <category>shopifyuae</category>
    </item>
    <item>
      <title>Progressive Web Apps (PWA): Why Your Business Needs One in 2026</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Tue, 11 Aug 2026 09:30:01 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/progressive-web-apps-pwa-why-your-business-needs-one-in-2026-4pah</link>
      <guid>https://dev.to/emperorakashi20/progressive-web-apps-pwa-why-your-business-needs-one-in-2026-4pah</guid>
      <description>&lt;p&gt;Your competitor just launched an "app" that loads instantly, works offline, and cost them ₹3 lakhs. You quoted ₹15 lakhs for a native iOS + Android app. They used a PWA. Here's what you need to know.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is a Progressive Web App (in Plain English)
&lt;/h2&gt;

&lt;p&gt;A Progressive Web App is a website that behaves like a native mobile app. It lives at a URL, runs in a browser engine, but can be "installed" on a phone's home screen — complete with an app icon, splash screen, and full-screen experience. No App Store. No Play Store. No 30% commission.&lt;/p&gt;

&lt;p&gt;The magic is in three technologies working together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Service Workers&lt;/strong&gt; — background scripts that cache assets and handle offline logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web App Manifest&lt;/strong&gt; — a JSON file that tells the browser "treat this site like an app"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTPS&lt;/strong&gt; — mandatory secure connection (which you should have anyway)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a user visits your PWA, the browser prompts them to "Add to Home Screen." After that, it looks and feels identical to a native app. The user doesn't know the difference. They don't care.&lt;/p&gt;

&lt;h2&gt;
  
  
  PWA vs Native App vs Regular Website
&lt;/h2&gt;

&lt;p&gt;Let's kill the confusion with a straight comparison.&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;Regular Website&lt;/th&gt;
&lt;th&gt;PWA&lt;/th&gt;
&lt;th&gt;Native App&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Works offline&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Install from browser&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App Store listing&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No (usually)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Push notifications&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access to camera&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access to GPS&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access to Bluetooth/NFC&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-updates&lt;/td&gt;
&lt;td&gt;Instant&lt;/td&gt;
&lt;td&gt;Instant&lt;/td&gt;
&lt;td&gt;Requires user action&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Development cost&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintenance cost&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;High (2 codebases)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discoverability (SEO)&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;Variable&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;Fastest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Home screen icon&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pattern is clear: PWAs sit in the sweet spot between websites and native apps. They give you 80% of native app functionality at 20-30% of the cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why PWAs Matter for Indian Businesses
&lt;/h2&gt;

&lt;p&gt;India isn't Silicon Valley. The ground reality here changes the math completely.&lt;/p&gt;

&lt;h3&gt;
  
  
  The connectivity problem
&lt;/h3&gt;

&lt;p&gt;Over 300 million smartphone users in India are on inconsistent 3G/4G connections. Pages that take 8 seconds to load on a stable connection take 25 seconds on a flaky tower in Tier 2 and Tier 3 cities. PWAs solve this with aggressive caching — after the first visit, most of the app loads from the device itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  The storage problem
&lt;/h3&gt;

&lt;p&gt;The average Indian smartphone has 32-64 GB of storage, and it's perpetually full. WhatsApp alone eats 2-5 GB. Users actively avoid downloading new apps. A PWA takes up less than 1 MB of storage. A native app? 50-150 MB minimum.&lt;/p&gt;

&lt;h3&gt;
  
  
  The cost problem
&lt;/h3&gt;

&lt;p&gt;Building a native app for both iOS and Android means two codebases, two teams (or one expensive cross-platform team), two testing pipelines, and two app store submissions. A PWA is one codebase that works everywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  The reach problem
&lt;/h3&gt;

&lt;p&gt;App Store Optimization (ASO) is a grind. Most apps never get discovered. PWAs are websites — they show up in Google search results. Every SEO technique you already use works on a PWA. Your existing traffic becomes your install base.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The real ROI of a PWA isn't just lower development cost — it's the compounding effect of lower acquisition cost, zero app store friction, and instant updates. For most Indian SMBs, this changes the unit economics from "can't afford an app" to "can't afford not to have one."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Real-World PWA Examples That Prove the Point
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Flipkart Lite
&lt;/h3&gt;

&lt;p&gt;Flipkart was one of the earliest major PWA adopters. Results: 3x more time spent on site, 40% higher re-engagement rate, 70% increase in conversions. Their PWA loads in under 1 second on 3G connections.&lt;/p&gt;

&lt;h3&gt;
  
  
  Twitter Lite
&lt;/h3&gt;

&lt;p&gt;Twitter's PWA reduced data consumption by 70% compared to the native app. It loads in under 3 seconds on slow connections and takes up less than 1 MB of storage. It became the default experience for emerging markets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Starbucks
&lt;/h3&gt;

&lt;p&gt;Starbucks built a PWA for their ordering system. The PWA is 99.84% smaller than their iOS app (233 KB vs 148 MB). Daily active users on the PWA nearly doubled after launch.&lt;/p&gt;

&lt;h3&gt;
  
  
  OLX
&lt;/h3&gt;

&lt;p&gt;OLX saw a 250% increase in re-engagement after launching their PWA. Page load time dropped by 80%. The lesson: users in price-sensitive markets respond strongly to fast, lightweight experiences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost Breakdown: PWA vs Native App in India (INR)
&lt;/h2&gt;

&lt;p&gt;Let's talk real numbers. These are ranges based on India-based development teams, not US freelancer rates.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;PWA Cost (₹)&lt;/th&gt;
&lt;th&gt;Native App Cost (₹)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;UI/UX Design&lt;/td&gt;
&lt;td&gt;1,00,000 – 2,50,000&lt;/td&gt;
&lt;td&gt;1,50,000 – 4,00,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend Development&lt;/td&gt;
&lt;td&gt;2,00,000 – 5,00,000&lt;/td&gt;
&lt;td&gt;4,00,000 – 12,00,000 (per platform)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend/API&lt;/td&gt;
&lt;td&gt;1,50,000 – 4,00,000&lt;/td&gt;
&lt;td&gt;1,50,000 – 4,00,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testing &amp;amp; QA&lt;/td&gt;
&lt;td&gt;50,000 – 1,50,000&lt;/td&gt;
&lt;td&gt;1,00,000 – 3,00,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App Store Submission&lt;/td&gt;
&lt;td&gt;₹0&lt;/td&gt;
&lt;td&gt;₹8,500 (Google) + ₹8,000/yr (Apple)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total (both platforms)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;₹5,00,000 – ₹13,00,000&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;₹12,00,000 – ₹35,00,000&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Annual Maintenance&lt;/td&gt;
&lt;td&gt;₹50,000 – ₹1,50,000&lt;/td&gt;
&lt;td&gt;₹2,00,000 – ₹6,00,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's a 2-3x cost difference on initial build, and a 3-4x difference on ongoing maintenance. For a startup burning through runway, this isn't a minor detail — it's the difference between shipping and not shipping.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Capabilities: What PWAs Can and Cannot Do in 2026
&lt;/h2&gt;

&lt;p&gt;PWA capabilities have expanded dramatically. Here's the honest state of things.&lt;/p&gt;

&lt;h3&gt;
  
  
  What PWAs can do well
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Offline mode&lt;/strong&gt; — cache pages, data, and media for full offline use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push notifications&lt;/strong&gt; — supported on Android, iOS (since iOS 16.4), and desktop&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Camera access&lt;/strong&gt; — photo and video capture via MediaDevices API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geolocation&lt;/strong&gt; — GPS access with user permission&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Background sync&lt;/strong&gt; — queue actions offline, sync when connected&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File system access&lt;/strong&gt; — read/write local files (with user permission)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment processing&lt;/strong&gt; — Web Payment API for native-feeling checkout&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Biometric auth&lt;/strong&gt; — fingerprint/face via Web Authentication API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screen orientation lock&lt;/strong&gt; — force landscape/portrait&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share target&lt;/strong&gt; — appear in the OS share sheet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Badging&lt;/strong&gt; — show notification counts on the app icon&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What PWAs still cannot do (or do poorly)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bluetooth/NFC&lt;/strong&gt; — Web Bluetooth exists but browser support is patchy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced AR/VR&lt;/strong&gt; — possible but performance lags behind native&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Background audio/location&lt;/strong&gt; — limited compared to native apps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inter-app communication&lt;/strong&gt; — no deep OS integration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App Store presence&lt;/strong&gt; — you can wrap a PWA in TWA (Trusted Web Activity) for Play Store, but Apple's App Store still resists&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iOS limitations&lt;/strong&gt; — Safari still lags behind Chrome in PWA support (no background sync, limited push notification customization)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The gap is closing every quarter. Chrome ships new PWA APIs almost monthly. The direction is clear — the web platform is absorbing native capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Choose PWA Over Native App
&lt;/h2&gt;

&lt;p&gt;This is the decision framework we use with every client.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose PWA when:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your app is primarily content-driven (news, e-commerce, catalogs, dashboards)&lt;/li&gt;
&lt;li&gt;You need to reach users who won't download apps&lt;/li&gt;
&lt;li&gt;Budget is under ₹15 lakhs for both platforms&lt;/li&gt;
&lt;li&gt;Speed to market matters more than pixel-perfect native feel&lt;/li&gt;
&lt;li&gt;SEO and web discoverability are important growth channels&lt;/li&gt;
&lt;li&gt;Your target users are on mid-range Android devices&lt;/li&gt;
&lt;li&gt;You need instant updates without app store review cycles&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The decision flowchart in plain language:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Start here: Does your app need Bluetooth, NFC, advanced AR, or deep OS integration?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Yes&lt;/strong&gt; → Go native.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No&lt;/strong&gt; → Next question: Is App Store presence a hard business requirement (investor demand, enterprise policy)?

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Yes&lt;/strong&gt; → Go native, or consider TWA wrapper for Play Store + native for iOS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No&lt;/strong&gt; → Next question: Is your budget under ₹15 lakhs and timeline under 3 months?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yes&lt;/strong&gt; → PWA is your answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No&lt;/strong&gt; → Evaluate whether the extra budget buys you capabilities you actually need. If it's just "feels more premium," go PWA.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When NOT to Choose PWA
&lt;/h2&gt;

&lt;p&gt;Honesty builds trust. Here's where PWAs fall short.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't build a PWA if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You need heavy device hardware access&lt;/strong&gt; — fitness trackers, IoT controllers, medical devices. The Web Bluetooth and Web USB APIs are improving, but they're not production-ready for mission-critical hardware.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your app is graphics-intensive&lt;/strong&gt; — gaming apps, complex 3D visualizations, or AR experiences. WebGL and WebXR exist, but native still wins on frame rates and battery efficiency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apple ecosystem is your primary market&lt;/strong&gt; — if 70%+ of your users are on iPhones, you'll constantly fight Safari's PWA limitations. Apple has commercial incentives to keep PWAs second-class citizens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You need background processing&lt;/strong&gt; — apps that must run background location tracking, continuous Bluetooth connections, or background audio (like a music player) need native capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise MDM is required&lt;/strong&gt; — if your app needs to be managed through Mobile Device Management systems, native is the only real option.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App Store credibility matters&lt;/strong&gt; — some B2B buyers and enterprise clients perceive App Store presence as a credibility signal. Irrational? Maybe. Real? Absolutely.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implementation Roadmap: From Website to PWA in 4 Weeks
&lt;/h2&gt;

&lt;p&gt;If you already have a modern website (React, Next.js, Vue, or similar), converting to a PWA is faster than you think.&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 1: Audit and Foundation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Performance audit (Lighthouse score baseline)&lt;/li&gt;
&lt;li&gt;HTTPS verification (mandatory for service workers)&lt;/li&gt;
&lt;li&gt;Create Web App Manifest (app name, icons, theme colors, display mode)&lt;/li&gt;
&lt;li&gt;Generate app icons in all required sizes (192x192, 512x512 minimum)&lt;/li&gt;
&lt;li&gt;Set up basic service worker with cache-first strategy for static assets&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Week 2: Offline Experience
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Implement offline fallback page&lt;/li&gt;
&lt;li&gt;Cache critical routes and API responses&lt;/li&gt;
&lt;li&gt;Add background sync for form submissions and user actions&lt;/li&gt;
&lt;li&gt;Test offline behavior across devices&lt;/li&gt;
&lt;li&gt;Implement cache versioning and cleanup strategy&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Week 3: Engagement Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Push notification setup (Firebase Cloud Messaging or equivalent)&lt;/li&gt;
&lt;li&gt;Add to Home Screen prompt optimization&lt;/li&gt;
&lt;li&gt;Implement app shell architecture for instant loading&lt;/li&gt;
&lt;li&gt;Add loading skeletons and optimistic UI patterns&lt;/li&gt;
&lt;li&gt;Set up analytics for PWA-specific metrics (install rate, offline usage)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Week 4: Testing, Optimization, and Launch
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cross-browser testing (Chrome, Safari, Firefox, Samsung Internet)&lt;/li&gt;
&lt;li&gt;Performance optimization (target Lighthouse PWA score of 90+)&lt;/li&gt;
&lt;li&gt;Accessibility audit&lt;/li&gt;
&lt;li&gt;Submit to Microsoft Store and Google Play Store (via TWA) if desired&lt;/li&gt;
&lt;li&gt;Monitor Core Web Vitals post-launch&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Performance Metrics: What to Expect
&lt;/h2&gt;

&lt;p&gt;After launching a PWA, here are realistic benchmarks based on projects we've shipped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;First Contentful Paint:&lt;/strong&gt; Under 1.5 seconds on 4G, under 3 seconds on 3G&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time to Interactive:&lt;/strong&gt; Under 3 seconds on 4G&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lighthouse PWA Score:&lt;/strong&gt; 90+ (aim for 95+)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repeat visit load time:&lt;/strong&gt; Under 0.5 seconds (cached)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install rate:&lt;/strong&gt; 3-8% of regular visitors (varies by prompt strategy)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engagement increase:&lt;/strong&gt; 20-40% more time on site vs mobile web&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conversion lift:&lt;/strong&gt; 15-30% improvement (based on e-commerce benchmarks)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bounce rate reduction:&lt;/strong&gt; 20-35% lower than mobile web&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't aspirational numbers. They're what happens when you eliminate 3-second load times and give users an app-like experience without the download friction.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Do PWAs work on iPhones?
&lt;/h3&gt;

&lt;p&gt;Yes, but with caveats. Since iOS 16.4, Safari supports push notifications for PWAs. However, Apple still restricts background sync, badge updates are limited, and there's a 50 MB storage cap for cached data. PWAs work well on iOS for content-driven apps, but you'll hit walls with advanced features.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can a PWA be listed on the Google Play Store?
&lt;/h3&gt;

&lt;p&gt;Yes. Using Trusted Web Activities (TWA), you can wrap your PWA and publish it on Google Play Store. It looks and behaves like a native app to the user. Apple's App Store is a different story — they actively resist PWA wrappers.&lt;/p&gt;

&lt;h3&gt;
  
  
  How much does a PWA cost compared to a native app?
&lt;/h3&gt;

&lt;p&gt;A PWA typically costs 40-60% less than building native apps for both iOS and Android. For an India-based team, expect ₹5-13 lakhs for a PWA vs ₹12-35 lakhs for native apps covering both platforms. Maintenance costs are 3-4x lower for PWAs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Will a PWA replace my existing website?
&lt;/h3&gt;

&lt;p&gt;A PWA doesn't replace your website — it upgrades it. Your existing URL, content, and SEO rankings stay intact. You're adding capabilities (offline, installability, push notifications) on top of what you already have.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can PWAs work completely offline?
&lt;/h3&gt;

&lt;p&gt;They can work offline for cached content and pre-loaded data. They cannot fetch new data from a server without an internet connection. The trick is smart caching — pre-loading the content users are most likely to need. E-commerce catalogs, article feeds, and dashboards work great offline. Real-time messaging does not.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are PWAs secure?
&lt;/h3&gt;

&lt;p&gt;PWAs require HTTPS by default, which means all data in transit is encrypted. Service workers run in a sandboxed environment. The security model is the same as the web — which is more mature and battle-tested than most native app security implementations.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long does it take to build a PWA?
&lt;/h3&gt;

&lt;p&gt;If you're converting an existing modern website: 3-5 weeks. If you're building from scratch: 8-14 weeks, depending on complexity. That's roughly 40-60% faster than native app development for equivalent functionality.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do PWAs affect SEO?
&lt;/h3&gt;

&lt;p&gt;Positively. PWAs are websites, so they're fully indexable by search engines. The performance improvements (faster load times, better Core Web Vitals) actively boost your search rankings. Unlike native apps, every page of your PWA can rank independently in search results.&lt;/p&gt;




&lt;p&gt;The PWA vs native app debate isn't about which technology is "better." It's about which one fits your budget, timeline, audience, and technical requirements. For most Indian businesses shipping their first mobile experience, the answer is increasingly clear.&lt;/p&gt;

&lt;p&gt;Thinking about a PWA for your business? &lt;a href="https://cal.com/innovatrix-infotech/discovery-call" rel="noopener noreferrer"&gt;Let's discuss if it's the right move for your specific case.&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://innovatrixinfotech.com/blog/progressive-web-apps-pwa-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>pwa</category>
      <category>progressivewebapp</category>
      <category>mobile</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Integrate Razorpay Payment Gateway in Shopify: Complete 2026 Guide</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Mon, 10 Aug 2026 09:30:01 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/how-to-integrate-razorpay-payment-gateway-in-shopify-complete-2026-guide-hao</link>
      <guid>https://dev.to/emperorakashi20/how-to-integrate-razorpay-payment-gateway-in-shopify-complete-2026-guide-hao</guid>
      <description>&lt;p&gt;Razorpay is India's most popular payment gateway. Shopify is India's fastest-growing e-commerce platform. Getting them to work together properly — with UPI, EMI, COD, and proper GST invoicing — requires more than just installing an app.&lt;/p&gt;

&lt;p&gt;This guide covers the complete integration, including the edge cases most tutorials skip.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Set Up Your Razorpay Account
&lt;/h2&gt;

&lt;p&gt;Before you touch Shopify:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a Razorpay account at razorpay.com&lt;/li&gt;
&lt;li&gt;Complete KYC (business documents, bank account, PAN/GST)&lt;/li&gt;
&lt;li&gt;Get your &lt;strong&gt;Live API Keys&lt;/strong&gt; from Dashboard &amp;gt; Settings &amp;gt; API Keys&lt;/li&gt;
&lt;li&gt;Enable the payment methods you need: UPI, cards, netbanking, wallets, EMI, COD&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; KYC approval takes 2-7 working days. Don't start Shopify setup until your Razorpay account is live and approved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Install Razorpay on Shopify
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to Shopify Admin &amp;gt; Settings &amp;gt; Payments&lt;/li&gt;
&lt;li&gt;Under "Third-party providers," search for Razorpay&lt;/li&gt;
&lt;li&gt;Install the official Razorpay app from Shopify App Store&lt;/li&gt;
&lt;li&gt;Enter your Live API Key ID and Key Secret&lt;/li&gt;
&lt;li&gt;Enable "Test mode" first to verify the integration&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Shopify charges a &lt;strong&gt;2% transaction fee&lt;/strong&gt; on all third-party payment gateways if you're on Basic or Shopify plans. To eliminate this fee, you need Shopify Advanced (₹21,000/mo) or Shopify Plus. For most Indian stores, the math makes sense to stay on Basic/Shopify plan and absorb the fee until revenue justifies the upgrade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Configure Payment Methods
&lt;/h2&gt;

&lt;h3&gt;
  
  
  UPI (Critical for India)
&lt;/h3&gt;

&lt;p&gt;In Razorpay Dashboard &amp;gt; Settings &amp;gt; Configuration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable UPI (VPA, QR Code, and UPI Intent)&lt;/li&gt;
&lt;li&gt;Test with a real UPI ID before going live&lt;/li&gt;
&lt;li&gt;UPI is the #1 payment method for Indian online stores — don't skip this&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  EMI
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Enable in Razorpay Dashboard under Payment Methods &amp;gt; EMI&lt;/li&gt;
&lt;li&gt;Specify minimum order amount for EMI (typically ₹5,000+)&lt;/li&gt;
&lt;li&gt;No-cost EMI requires coordination with your bank partner (Razorpay handles this)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  COD (Cash on Delivery)
&lt;/h3&gt;

&lt;p&gt;Shopify handles COD natively — you don't need Razorpay for this. Set it up under Settings &amp;gt; Payments &amp;gt; Manual payment methods &amp;gt; Cash on Delivery.&lt;/p&gt;

&lt;p&gt;For COD fraud prevention, use Razorpay's COD Intelligence feature (available on Growth/Scale plans) which scores orders for fraud risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: GST and Invoice Setup
&lt;/h2&gt;

&lt;p&gt;India requires GST-compliant invoices for all B2C transactions above ₹50,000 (B2B invoices for all amounts). Shopify's native invoicing is not GST-compliant.&lt;/p&gt;

&lt;p&gt;Options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Razorpay Tax Invoice&lt;/strong&gt; (built into Razorpay) — Generates GST-compliant invoices automatically. Enable in Razorpay Dashboard &amp;gt; Tax.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shopify apps like QuickBooks GST or Zoho Books integration&lt;/strong&gt; — More comprehensive, syncs with accounting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Liquid template&lt;/strong&gt; — If you want Shopify's native order confirmation to be GST-compliant.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For most stores, Razorpay's built-in tax invoice is sufficient.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Testing Checklist
&lt;/h2&gt;

&lt;p&gt;Before going live, test every payment flow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Card payment (domestic and international)&lt;/li&gt;
&lt;li&gt;[ ] UPI payment (scan QR + enter VPA)&lt;/li&gt;
&lt;li&gt;[ ] Netbanking&lt;/li&gt;
&lt;li&gt;[ ] Wallets (Paytm, PhonePe if enabled)&lt;/li&gt;
&lt;li&gt;[ ] EMI (if enabled)&lt;/li&gt;
&lt;li&gt;[ ] COD&lt;/li&gt;
&lt;li&gt;[ ] Refund flow (refund a test order and verify it processes)&lt;/li&gt;
&lt;li&gt;[ ] Webhook delivery (verify Shopify receives order confirmation from Razorpay)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common Issues and Fixes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Order stuck in "Pending Payment":&lt;/strong&gt; Usually a webhook issue. Verify your webhook URL in Razorpay Dashboard &amp;gt; Settings &amp;gt; Webhooks. The URL should be &lt;code&gt;https://yourstore.myshopify.com/webhook/razorpay&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Duplicate orders:&lt;/strong&gt; Happens when Razorpay sends multiple webhook events. Enable idempotency in Razorpay settings to prevent duplicate processing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPI timeout errors:&lt;/strong&gt; Default UPI timeout is 3 minutes. For higher-value orders, customers may need more time. Contact Razorpay support to extend timeout.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GST invoices not generating:&lt;/strong&gt; Ensure your business GST number is added in both Razorpay and Shopify settings.&lt;/p&gt;




&lt;p&gt;Need expert help? Innovatrix Infotech is a professional &lt;a href="https://www.innovatrixinfotech.com/services/shopify-development-agency-kolkata" rel="noopener noreferrer"&gt;Shopify development agency in Kolkata&lt;/a&gt; handling integrations 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/razorpay-shopify-integration-guide-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>razorpay</category>
      <category>shopify</category>
      <category>paymentgateway</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>Next.js vs WordPress: Which Should You Build On?</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Thu, 06 Aug 2026 04:30:01 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/nextjs-vs-wordpress-which-should-you-build-on-5d72</link>
      <guid>https://dev.to/emperorakashi20/nextjs-vs-wordpress-which-should-you-build-on-5d72</guid>
      <description>&lt;p&gt;Your developer says WordPress is "legacy" and you should use Next.js. Your marketing person says WordPress is fine. They're both half right. Here's the full picture.&lt;/p&gt;

&lt;p&gt;We build on both platforms — roughly 60% of our projects are WordPress, 40% are Next.js (or React-based). We don't have a horse in this race. We recommend whatever makes sense for the project. This post is an honest breakdown to help you decide.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is WordPress, Really?
&lt;/h2&gt;

&lt;p&gt;WordPress is a content management system (CMS) that powers about 43% of all websites on the internet. It started as a blogging platform in 2003 and evolved into a full website builder.&lt;/p&gt;

&lt;p&gt;In business terms: WordPress is a ready-made building that you customize. You pick a theme (the look), install plugins (the features), and add your content. You don't need to know how to code to manage it day-to-day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key characteristics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open-source and free (you pay for hosting, themes, and plugins)&lt;/li&gt;
&lt;li&gt;Massive plugin ecosystem (60,000+ plugins)&lt;/li&gt;
&lt;li&gt;Visual page builders available (Elementor, Divi, Gutenberg)&lt;/li&gt;
&lt;li&gt;Content editors can update text, images, and pages without developer help&lt;/li&gt;
&lt;li&gt;Widely understood — easy to find developers, designers, and agencies&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What Is Next.js, Really?
&lt;/h2&gt;

&lt;p&gt;Next.js is a React-based web framework built by Vercel. It's used to build fast, modern websites and web applications. Companies like Netflix, Nike, Notion, and TikTok use Next.js.&lt;/p&gt;

&lt;p&gt;In business terms: Next.js is a custom-built building from the ground up. Every feature is purpose-built. It's faster and more flexible, but you need an architect (developer) for almost everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key characteristics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built on React (the most popular JavaScript library)&lt;/li&gt;
&lt;li&gt;Server-side rendering (SSR) and static generation (SSG) for speed&lt;/li&gt;
&lt;li&gt;No built-in content editor — needs a separate CMS (Directus, Sanity, Contentful, etc.)&lt;/li&gt;
&lt;li&gt;Requires developers for most changes&lt;/li&gt;
&lt;li&gt;Deployed on platforms like Vercel, Netlify, or AWS&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Performance and Speed
&lt;/h2&gt;

&lt;p&gt;This is where the conversation usually starts, and where Next.js has a clear advantage.&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;WordPress&lt;/th&gt;
&lt;th&gt;Next.js&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Average page load (optimized)&lt;/td&gt;
&lt;td&gt;1.5–3 seconds&lt;/td&gt;
&lt;td&gt;0.5–1.5 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Largest Contentful Paint (LCP)&lt;/td&gt;
&lt;td&gt;2–4 seconds&lt;/td&gt;
&lt;td&gt;0.8–2 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time to Interactive (TTI)&lt;/td&gt;
&lt;td&gt;3–6 seconds&lt;/td&gt;
&lt;td&gt;1–3 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Core Web Vitals pass rate&lt;/td&gt;
&lt;td&gt;~33% of WordPress sites&lt;/td&gt;
&lt;td&gt;~70% of Next.js sites&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CDN/Edge deployment&lt;/td&gt;
&lt;td&gt;Requires setup (Cloudflare, etc.)&lt;/td&gt;
&lt;td&gt;Built into Vercel/Netlify&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Why the gap?&lt;/strong&gt; WordPress loads PHP on every request (unless heavily cached), pulls from a MySQL database, and typically carries the weight of multiple plugins. Next.js pre-renders pages at build time or on the server, serves them from edge CDNs, and ships minimal JavaScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The caveat:&lt;/strong&gt; A well-optimized WordPress site with proper caching (WP Rocket, Cloudflare, good hosting) can be fast. A poorly built Next.js site can be slow. Platform matters less than implementation. But Next.js makes fast the default; WordPress makes fast something you have to work for.&lt;/p&gt;




&lt;h2&gt;
  
  
  Content Editing: Who Updates the Website After Launch?
&lt;/h2&gt;

&lt;p&gt;This is the most important question most businesses skip.&lt;/p&gt;

&lt;p&gt;If your marketing team needs to update content weekly — blog posts, landing pages, product descriptions, banners — the editing experience matters more than raw performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  WordPress
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Built-in visual editor (Gutenberg block editor)&lt;/li&gt;
&lt;li&gt;Page builders like Elementor give non-technical users drag-and-drop control&lt;/li&gt;
&lt;li&gt;Media library for image management&lt;/li&gt;
&lt;li&gt;Plugins for SEO (Yoast/Rank Math), forms, e-commerce, and more&lt;/li&gt;
&lt;li&gt;Your marketing intern can update the homepage without calling a developer&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Next.js
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No built-in editor. You need a headless CMS (Directus, Sanity, Contentful, Strapi)&lt;/li&gt;
&lt;li&gt;Content editors work in the CMS dashboard, which may feel less intuitive than WordPress&lt;/li&gt;
&lt;li&gt;Page layout changes almost always require a developer&lt;/li&gt;
&lt;li&gt;More powerful for custom content structures, but steeper learning curve for non-technical users&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;"The best website platform is the one your team will actually use. We've seen businesses spend ₹10 lakhs on a Next.js site and then never update it because nobody on the team could figure out the CMS. That beautiful site becomes stale within 6 months."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Cost: Build and Maintain
&lt;/h2&gt;

&lt;p&gt;Let's talk real numbers. These are based on agency rates in India for a business website (not a basic template site, but a properly designed, functional business website).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cost Factor&lt;/th&gt;
&lt;th&gt;WordPress&lt;/th&gt;
&lt;th&gt;Next.js&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Design + Development&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;₹50,000 – ₹3,00,000&lt;/td&gt;
&lt;td&gt;₹1,50,000 – ₹8,00,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hosting (annual)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;₹3,000 – ₹30,000&lt;/td&gt;
&lt;td&gt;₹0 – ₹24,000 (Vercel free tier covers most)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CMS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Included (WordPress itself)&lt;/td&gt;
&lt;td&gt;₹0 – ₹50,000/year (depends on CMS choice)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Plugins/Integrations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;₹0 – ₹20,000/year (premium plugins)&lt;/td&gt;
&lt;td&gt;Usually custom-built (included in dev cost)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ongoing maintenance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;₹5,000 – ₹20,000/month&lt;/td&gt;
&lt;td&gt;₹3,000 – ₹15,000/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Content updates (DIY)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Easy — no developer needed&lt;/td&gt;
&lt;td&gt;Moderate — CMS-dependent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Content updates (developer)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;₹1,000 – ₹3,000 per change&lt;/td&gt;
&lt;td&gt;₹2,000 – ₹5,000 per change&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The real cost difference&lt;/strong&gt; isn't the build — it's the ongoing maintenance and updates. WordPress is cheaper to update because non-technical people can do it. Next.js requires developer involvement for anything beyond content text changes.&lt;/p&gt;




&lt;h2&gt;
  
  
  SEO Capabilities
&lt;/h2&gt;

&lt;p&gt;Both platforms can rank well on Google. The question is how much effort it takes.&lt;/p&gt;

&lt;h3&gt;
  
  
  WordPress SEO
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Plugins like Yoast SEO and Rank Math handle meta tags, sitemaps, schema markup, and content analysis out of the box&lt;/li&gt;
&lt;li&gt;Built-in blog with categories, tags, and RSS feeds&lt;/li&gt;
&lt;li&gt;URL structure is customizable&lt;/li&gt;
&lt;li&gt;Thousands of SEO tutorials and guides available&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk:&lt;/strong&gt; Plugin bloat slows the site, which hurts SEO. Many WordPress sites have 30+ plugins, each adding database queries and HTTP requests.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Next.js SEO
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Full control over meta tags, structured data, and rendering strategies&lt;/li&gt;
&lt;li&gt;Server-side rendering means search engines see fully rendered content (no JavaScript dependency)&lt;/li&gt;
&lt;li&gt;Built-in Image Optimization (next/image) for Core Web Vitals&lt;/li&gt;
&lt;li&gt;Dynamic sitemap generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk:&lt;/strong&gt; Requires a developer who understands SEO. React developers often don't think about meta tags, heading hierarchy, or structured data unless specifically asked.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bottom line:&lt;/strong&gt; WordPress makes basic SEO easy for everyone. Next.js makes advanced SEO possible for developers who know what they're doing. If you don't have an SEO-aware developer, WordPress with Rank Math will outperform a Next.js site where nobody configured the meta tags.&lt;/p&gt;




&lt;h2&gt;
  
  
  Developer Availability and Hiring
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Factor&lt;/th&gt;
&lt;th&gt;WordPress&lt;/th&gt;
&lt;th&gt;Next.js&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Global developer pool&lt;/td&gt;
&lt;td&gt;Massive (millions)&lt;/td&gt;
&lt;td&gt;Growing but smaller&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Indian freelancer cost&lt;/td&gt;
&lt;td&gt;₹500–₹2,000/hour&lt;/td&gt;
&lt;td&gt;₹1,000–₹4,000/hour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agency availability&lt;/td&gt;
&lt;td&gt;Nearly every agency&lt;/td&gt;
&lt;td&gt;Mid-to-senior agencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finding a replacement dev&lt;/td&gt;
&lt;td&gt;Easy&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code handoff complexity&lt;/td&gt;
&lt;td&gt;Low (standard structure)&lt;/td&gt;
&lt;td&gt;Higher (depends on architecture)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;WordPress developers are everywhere. If your current developer disappears, you can find a replacement within a week. Next.js developers are more specialized. If your developer leaves and didn't document the codebase, onboarding a new one takes time.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Next.js Wins
&lt;/h2&gt;

&lt;p&gt;Choose Next.js when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance is critical.&lt;/strong&gt; E-commerce stores, SaaS marketing sites, and any business where page speed directly impacts revenue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You need custom functionality.&lt;/strong&gt; Dashboards, calculators, interactive tools, complex filtering, user accounts — things that go beyond a typical "website."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You have developer resources.&lt;/strong&gt; Either in-house or a reliable agency on retainer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You're building a web application&lt;/strong&gt;, not just a website. If your site has user authentication, real-time data, or complex state management, Next.js is the right choice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You want long-term scalability.&lt;/strong&gt; Next.js sites don't slow down as you add content. WordPress sites often do.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brand experience matters.&lt;/strong&gt; If you want Apple-level scroll animations, micro-interactions, and a polished feel, Next.js gives you full control.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  When WordPress Wins
&lt;/h2&gt;

&lt;p&gt;Choose WordPress when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your team updates content frequently.&lt;/strong&gt; Blogs, news sites, magazines, and content-heavy businesses. WordPress's editor is still the best for non-technical content creators.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Budget is tight.&lt;/strong&gt; You need a professional site for under ₹1,50,000. WordPress gets you there. Next.js at that budget will feel half-finished.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You need to launch fast.&lt;/strong&gt; A WordPress site can go from zero to live in 2–4 weeks. A Next.js site typically takes 4–8 weeks minimum.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You don't have ongoing developer access.&lt;/strong&gt; If you can't afford a developer on retainer, WordPress lets you manage most things yourself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E-commerce with WooCommerce.&lt;/strong&gt; If you need an online store and Shopify isn't the right fit, WooCommerce on WordPress is mature and well-supported.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You need a simple blog or portfolio.&lt;/strong&gt; Don't over-engineer it. WordPress is perfectly fine for straightforward content sites.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Hybrid Option: Headless WordPress + Next.js
&lt;/h2&gt;

&lt;p&gt;There's a third path that combines the strengths of both: use WordPress as your content management system, but render the frontend with Next.js.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Your content team writes and manages content in WordPress (familiar interface)&lt;/li&gt;
&lt;li&gt;WordPress exposes content via its REST API or GraphQL (using WPGraphQL plugin)&lt;/li&gt;
&lt;li&gt;Next.js fetches that content and renders it as a fast, modern frontend&lt;/li&gt;
&lt;li&gt;Users see a Next.js site; editors see WordPress&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Pros:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Best editing experience (WordPress) + best performance (Next.js)&lt;/li&gt;
&lt;li&gt;Content team doesn't need to learn a new CMS&lt;/li&gt;
&lt;li&gt;Full frontend control for developers&lt;/li&gt;
&lt;li&gt;Better security (WordPress admin is not publicly accessible)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Most expensive option.&lt;/strong&gt; You're maintaining two systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complexity.&lt;/strong&gt; Debugging issues requires understanding both WordPress and Next.js.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preview is harder.&lt;/strong&gt; Previewing drafts requires extra setup to work between the two systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not always worth it.&lt;/strong&gt; For most small-to-medium business websites, the added complexity isn't justified.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Our recommendation:&lt;/strong&gt; Headless WordPress makes sense for content-heavy sites (media companies, large blogs, multi-author publications) where the editing experience is paramount but performance can't be compromised. For most business websites, pick one or the other.&lt;/p&gt;




&lt;h2&gt;
  
  
  Platform Decision Checklist
&lt;/h2&gt;

&lt;p&gt;Answer these questions honestly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Will non-technical team members update the website weekly? → &lt;strong&gt;Lean WordPress&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Is page speed a direct revenue driver (e-commerce, SaaS)? → &lt;strong&gt;Lean Next.js&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Is your budget under ₹1,50,000? → &lt;strong&gt;WordPress&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Do you need custom interactive features (calculators, dashboards, filtering)? → &lt;strong&gt;Next.js&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Do you have a developer or agency on retainer? → &lt;strong&gt;Either works&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Do you need to launch within 2–3 weeks? → &lt;strong&gt;WordPress&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Is your site primarily a blog or content hub? → &lt;strong&gt;WordPress&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Are you building a web app, not just a website? → &lt;strong&gt;Next.js&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Do you want full control over animations and user experience? → &lt;strong&gt;Next.js&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Will you realistically maintain this site for 3+ years? → &lt;strong&gt;Consider long-term costs above&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




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

&lt;h3&gt;
  
  
  Is WordPress dying?
&lt;/h3&gt;

&lt;p&gt;No. WordPress powers 43% of the web and that number is still growing. What's changing is that modern frameworks like Next.js are capturing a larger share of &lt;em&gt;new&lt;/em&gt; builds, especially for tech-savvy companies. WordPress isn't dying; it's just no longer the only serious option.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Next.js harder to learn than WordPress?
&lt;/h3&gt;

&lt;p&gt;For non-developers, yes — significantly. WordPress has a visual interface. Next.js requires coding knowledge (React, JavaScript/TypeScript). But this question usually misses the point: you probably won't be coding your site yourself. What matters is whether your &lt;em&gt;team&lt;/em&gt; can manage the site after launch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I migrate from WordPress to Next.js later?
&lt;/h3&gt;

&lt;p&gt;Yes, but it's essentially a rebuild. Your content can be exported and re-imported, but the frontend, design, and functionality need to be rebuilt from scratch. Budget for 70–80% of a new build cost. Plan the migration during a slow period.&lt;/p&gt;

&lt;h3&gt;
  
  
  What about Shopify vs WordPress for e-commerce?
&lt;/h3&gt;

&lt;p&gt;Different comparison entirely. If e-commerce is your primary business, Shopify is usually the better choice over both WordPress (WooCommerce) and Next.js. Shopify handles payments, inventory, shipping, and compliance out of the box. We've written a &lt;a href="https://dev.to/blog"&gt;separate comparison&lt;/a&gt; on this.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which is more secure?
&lt;/h3&gt;

&lt;p&gt;Next.js has a smaller attack surface because there's no admin panel exposed to the internet and no plugin ecosystem to exploit. WordPress is the most attacked CMS on the web — not because it's insecure, but because it's the biggest target. A properly maintained WordPress site with security plugins, strong passwords, and regular updates is secure. But "properly maintained" is the key phrase.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does Innovatrix Infotech recommend?
&lt;/h3&gt;

&lt;p&gt;It depends on the project. For our own website, we use Next.js with Directus as the headless CMS — because we have the dev team to maintain it and we wanted full control over performance and animations. For many of our clients, especially small businesses and content-driven sites, we recommend WordPress because it gives them independence after launch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I start with WordPress and add Next.js later?
&lt;/h3&gt;

&lt;p&gt;Yes — this is the headless WordPress approach described above. You keep WordPress for content management and add a Next.js frontend on top. It's more complex than starting fresh with Next.js, but it preserves your existing content workflow.&lt;/p&gt;




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

&lt;p&gt;There is no universally "better" platform. There's only the right platform for your specific situation, budget, team, and goals.&lt;/p&gt;

&lt;p&gt;If you're still unsure, here's the simplest decision framework:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;If you need a website&lt;/strong&gt; (content, services, portfolio, blog) → WordPress&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you need a web *experience&lt;/strong&gt;* (interactive, fast, custom, branded) → Next.js&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you need both and have the budget&lt;/strong&gt; → Headless WordPress + Next.js&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We build on both. Tell us what your website needs to do and we'll recommend the right stack — honestly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/contact"&gt;Tell Us About Your Project →&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Need expert help? Innovatrix Infotech offers professional &lt;a href="https://www.innovatrixinfotech.com/services/web-development" rel="noopener noreferrer"&gt;web development services&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/nextjs-vs-wordpress-business-website?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>nextjs</category>
      <category>wordpress</category>
      <category>webdev</category>
      <category>comparison</category>
    </item>
    <item>
      <title>Make.com Automation Recipes: 10 Workflows Every D2C Brand Should Run</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Wed, 05 Aug 2026 04:30:02 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/makecom-automation-recipes-10-workflows-every-d2c-brand-should-run-126</link>
      <guid>https://dev.to/emperorakashi20/makecom-automation-recipes-10-workflows-every-d2c-brand-should-run-126</guid>
      <description>&lt;p&gt;Make.com is genuinely excellent for D2C brands. The visual scenario builder is the best in the industry — better than n8n for clients who need to own and modify their automations without a developer present. The native Shopify, Gmail, Slack, and Google Workspace modules are polished and reliable.&lt;/p&gt;

&lt;p&gt;Where Make.com gets expensive: operations. Every module execution counts as an operation, and Make.com's pricing is per operation. A 10-module scenario that runs 100 times/day = 1,000 operations. At scale, this is where we evaluate switching to n8n (which charges per workflow execution, not per step). More on that below.&lt;/p&gt;

&lt;p&gt;For D2C brands processing up to 200-300 orders/day, Make.com is typically the right choice. Here are the 10 recipes we build and recommend.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 10 Recipes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Recipe 1: Abandoned Cart WhatsApp Recovery
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The scenario&lt;/strong&gt;: Shopify &lt;code&gt;checkout/abandoned&lt;/code&gt; webhook → Wait 60 minutes → Verify order not completed → Send WhatsApp via MSG91/Gupshup&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make.com modules used&lt;/strong&gt;: Webhook (trigger) → Sleep → Shopify: Search Orders → Router → HTTP: WhatsApp API&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operations per execution&lt;/strong&gt;: 5 operations&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business outcome&lt;/strong&gt;: For D2C brands, this is the single highest-ROI automation. WhatsApp recovery outperforms email recovery consistently. We deployed a version of this for Baby Forest India and it contributed to a &lt;strong&gt;22% reduction in cart abandonment&lt;/strong&gt; during their launch month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make.com vs n8n here&lt;/strong&gt;: Make.com works well for this. The Sleep module handles the 60-minute wait without the queue-mode setup that n8n requires for self-hosted instances. If you're non-technical, Make.com is the easier path.&lt;/p&gt;




&lt;h3&gt;
  
  
  Recipe 2: Order Confirmation + Upsell Sequence
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The scenario&lt;/strong&gt;: Shopify &lt;code&gt;orders/paid&lt;/code&gt; → Send branded WhatsApp/SMS confirmation → Wait 24 hours → Check repeat purchase history → Send personalised upsell for complementary product&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make.com modules used&lt;/strong&gt;: Shopify (trigger) → Router → HTTP: Messaging API → Sleep → Shopify: Get Customer Orders → Router → HTTP: Upsell message&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operations per execution&lt;/strong&gt;: 7 operations&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business outcome&lt;/strong&gt;: Most brands send the transactional confirmation and stop. The upsell branch — triggered only for customers with 0 previous orders (new buyers are most receptive) — has produced measurable lift in average order value. We've seen &lt;strong&gt;+15-20% repeat purchase rate&lt;/strong&gt; improvement in the 90 days following deployment for skincare and wellness brands where the product catalogue naturally lends itself to complementary recommendations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pro tip&lt;/strong&gt;: The Router module is key. One branch sends the upsell to new customers; another branch sends a loyalty acknowledgement to repeat buyers. Same trigger, different message, right person.&lt;/p&gt;




&lt;h3&gt;
  
  
  Recipe 3: Pre-Shipment Delay Alert
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The scenario&lt;/strong&gt;: Shopify order created → Wait 48 hours → Check if &lt;code&gt;fulfillment_status&lt;/code&gt; is still &lt;code&gt;unfulfilled&lt;/code&gt; → If yes, send customer a WhatsApp with estimated timeline + customer service link&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make.com modules used&lt;/strong&gt;: Shopify (trigger) → Sleep → Shopify: Get Order → Filter → HTTP: WhatsApp API&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operations per execution&lt;/strong&gt;: 5 operations&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business outcome&lt;/strong&gt;: This one is underrated. Most brands only communicate delays reactively, after the customer emails support asking "where's my order?" This automation sends a proactive message before the complaint arrives. For a fashion brand we work with, deploying this reduced &lt;strong&gt;"where's my order?" support tickets by 35%&lt;/strong&gt; within two months. The customer feels looked after; the support team handles fewer reactive queries.&lt;/p&gt;




&lt;h3&gt;
  
  
  Recipe 4: Fulfilment Notification + Tracking Link
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The scenario&lt;/strong&gt;: Shopify &lt;code&gt;fulfillments/create&lt;/code&gt; webhook → Extract carrier + tracking number → Send WhatsApp with tracking link and estimated delivery date&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make.com modules used&lt;/strong&gt;: Webhook → Shopify: Get Order → Tools: Set Variable (format tracking URL) → HTTP: WhatsApp API&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operations per execution&lt;/strong&gt;: 4 operations&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business outcome&lt;/strong&gt;: Transactional but important. Customers who receive proactive shipping updates are less likely to contact support. The tracking link should be deep-linked to the carrier's tracking page with the order number pre-filled, not just the carrier homepage. This is a detail most off-the-shelf tools miss — Make.com's Tools module lets you construct the exact URL format each carrier uses.&lt;/p&gt;




&lt;h3&gt;
  
  
  Recipe 5: Post-Purchase Review Request (3-Day Sequence)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The scenario&lt;/strong&gt;: Shopify &lt;code&gt;orders/fulfilled&lt;/code&gt; → Wait 3 days → Send WhatsApp review request with Google Review link → If no review in 5 days, send follow-up email with discount code&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make.com modules used&lt;/strong&gt;: Shopify (trigger) → Sleep (3 days) → HTTP: WhatsApp → Sleep (5 days) → Gmail: Send review follow-up&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operations per execution&lt;/strong&gt;: 5 operations&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business outcome&lt;/strong&gt;: For a Shopify wellness brand, this 3+5 day sequence tripled their review volume in 90 days — Google reviews went from 67 to 190+. The two-channel approach matters: WhatsApp for the initial ask (high open rate), email with an incentive for the follow-up (higher conversion for the segment that didn't respond to WhatsApp). Don't use both on the same day — the 5-day gap is deliberate.&lt;/p&gt;




&lt;h3&gt;
  
  
  Recipe 6: New Lead → CRM + AI Qualification + Slack Alert
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The scenario&lt;/strong&gt;: New form submission (Typeform/website contact form) → Create HubSpot contact → OpenAI: Score lead quality (1-5) → Router: Route by score → Slack alert for score 4-5&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make.com modules used&lt;/strong&gt;: Webhook → HubSpot: Create Contact → OpenAI: Chat (scoring prompt) → JSON: Parse score → Router → Slack: Send Message&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operations per execution&lt;/strong&gt;: 6 operations&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business outcome&lt;/strong&gt;: See our &lt;a href="https://dev.to/blog/15-ai-workflow-automations-small-businesses"&gt;AI lead qualification workflow&lt;/a&gt; for the full story. The key insight: routing hot leads (4-5) to Slack for immediate follow-up while cold leads (1-2) enter a nurture sequence improved &lt;strong&gt;sales conversion rate by 34%&lt;/strong&gt; on scored leads. The team stopped spending time on conversations that were unlikely to close.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make.com vs n8n here&lt;/strong&gt;: Make.com's OpenAI module is more limited than n8n's — no streaming, no function calling. For simple scoring prompts where you only need a single text output, it works. For agentic multi-tool behaviour, use n8n.&lt;/p&gt;




&lt;h3&gt;
  
  
  Recipe 7: Low Stock Alert + Supplier Reorder Email
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The scenario&lt;/strong&gt;: Scheduled trigger (every morning 8 AM) → Shopify: Get All Inventory Levels → Filter: Stock &amp;lt; threshold → Gmail: Send formatted reorder email to supplier with SKU list&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make.com modules used&lt;/strong&gt;: Scheduler (trigger) → Shopify: List Inventory Levels → Iterator → Filter → Array Aggregator → Gmail: Send&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operations per execution&lt;/strong&gt;: Variable — approximately 3-5 operations per SKU checked + 1 email. For a 100-SKU catalogue, ~400-500 operations/day. &lt;strong&gt;This is where Make.com gets expensive at scale.&lt;/strong&gt; For brands with 500+ SKUs running daily checks, switch to n8n.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business outcome&lt;/strong&gt;: A Kolkata home goods brand went from reactive stockout discovery ("sorry, out of stock" after a customer orders) to proactive same-day reorder decisions. Zero reactive stockouts in four months post-deployment.&lt;/p&gt;




&lt;h3&gt;
  
  
  Recipe 8: Refund Confirmation + Proactive Status Update
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The scenario&lt;/strong&gt;: Shopify &lt;code&gt;refunds/create&lt;/code&gt; webhook → Send WhatsApp confirmation with refund amount + timeline → Wait 5 days → Check if refund is still pending → If yes, send proactive update&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make.com modules used&lt;/strong&gt;: Webhook → HTTP: WhatsApp → Sleep → Shopify: Get Order → Filter (refund still pending?) → HTTP: WhatsApp follow-up&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operations per execution&lt;/strong&gt;: 6 operations&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business outcome&lt;/strong&gt;: For a high-return D2C brand (fashion, baby products), refund communication is a major support ticket driver. This automation cut &lt;strong&gt;"where's my refund?" tickets by 40%&lt;/strong&gt; for a brand processing 50+ returns/month. Proactive communication transforms frustrated customers into neutral or even loyal ones.&lt;/p&gt;




&lt;h3&gt;
  
  
  Recipe 9: Monthly Revenue Report Auto-Generation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The scenario&lt;/strong&gt;: Scheduled trigger (1st of month, 9 AM) → Shopify: Get previous month's orders → Tools: Aggregate by metric → Google Sheets: Populate report template → Gmail: Send PDF summary&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make.com modules used&lt;/strong&gt;: Scheduler → Shopify: List Orders → Iterator → Tools: Set Variables → Array Aggregator → Google Sheets: Update → Gmail: Send&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operations per execution&lt;/strong&gt;: Roughly 5 operations per order + 3 base operations. For a brand with 800 orders/month: ~4,003 operations once/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business outcome&lt;/strong&gt;: The report that used to take a founder 3 hours to compile manually arrives automatically before morning chai. Revenue by channel, top SKUs, AOV, new vs. returning split. No manual work, 100% consistent formatting every month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make.com cost check&lt;/strong&gt;: 4,000 operations once a month is negligible. This is one of the most cost-efficient scenarios on this list.&lt;/p&gt;




&lt;h3&gt;
  
  
  Recipe 10: Social Media Content Scheduler from Google Sheet
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The scenario&lt;/strong&gt;: Google Sheets: Watch for new rows (content calendar) → Router (platform) → Facebook/Instagram: Schedule post OR HTTP: Twitter/X API OR HTTP: LinkedIn API&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make.com modules used&lt;/strong&gt;: Google Sheets (trigger: new row) → Router → Facebook Pages: Create Post / Instagram for Business: Create Photo → HTTP (Twitter, LinkedIn)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operations per execution&lt;/strong&gt;: 3-4 operations per post&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business outcome&lt;/strong&gt;: The content calendar in Google Sheets becomes the single source of truth. Copy, image URL, platform, date/time — all in one sheet. Make.com polls the sheet every 15 minutes and publishes when the scheduled time arrives. No more logging into 4 platforms to schedule posts. A 5-person brand &lt;strong&gt;saved 6 hours/week&lt;/strong&gt; on social media management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our Pick&lt;/strong&gt;: This is one of the strongest Make.com use cases. The native Facebook and Instagram modules are significantly better than n8n's equivalents because Meta maintains official Make.com integrations. For social scheduling specifically, Make.com wins.&lt;/p&gt;




&lt;h2&gt;
  
  
  Make.com vs n8n: When to Use Which
&lt;/h2&gt;

&lt;p&gt;Based on our work with D2C brands across India and the Middle East, here's the honest breakdown:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Make.com when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your team will manage and modify automations without a developer&lt;/li&gt;
&lt;li&gt;You need polished native integrations with Meta, Google Workspace, HubSpot&lt;/li&gt;
&lt;li&gt;Order volume is moderate (under 300/day)&lt;/li&gt;
&lt;li&gt;You want visual scenario building that non-technical team members can read&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use n8n when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Order volume is high (300+/day) and per-operation costs become significant&lt;/li&gt;
&lt;li&gt;You need self-hosting for data sovereignty&lt;/li&gt;
&lt;li&gt;You need complex JavaScript logic in Code nodes&lt;/li&gt;
&lt;li&gt;You want agentic AI capabilities (n8n's AI Agent node is significantly more capable)&lt;/li&gt;
&lt;li&gt;You're building multi-step, complex workflows where debugging transparency matters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For many clients, we actually run both: Make.com for the customer-facing automations (social, messaging) where the native integrations are superior, and n8n for the high-frequency operational automations (order sync, inventory) where execution cost matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  What These Cost on Make.com
&lt;/h2&gt;

&lt;p&gt;Make.com's free tier includes 1,000 operations/month. For the 10 recipes above, a brand processing 100 orders/day will consume roughly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recipes 1-5 (order-triggered): ~25 operations per order × 100 orders = 2,500 operations/day = 75,000/month&lt;/li&gt;
&lt;li&gt;Recipes 6-10 (varied triggers): ~5,000-10,000 operations/month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total: ~80,000-85,000 operations/month&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Make.com's Core plan (10,000 operations) costs $10/month. Their Pro plan (50,000 operations) costs $16/month. For 85,000 operations, you're on the Teams plan (~$29/month) or purchasing additional operations.&lt;/p&gt;

&lt;p&gt;At 300+ orders/day, the math changes. At that volume, we recommend evaluating n8n self-hosted (€20-55/month regardless of operations).&lt;/p&gt;

&lt;p&gt;Want these built for your brand? Our &lt;a href="https://dev.to/services/ai-automation"&gt;AI automation service&lt;/a&gt; includes Make.com and n8n builds, with our &lt;a href="https://dev.to/services/managed-services"&gt;managed services&lt;/a&gt; covering ongoing maintenance.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Does Make.com work with Indian payment gateways like Razorpay and PayU?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Make.com doesn't have native Razorpay or PayU modules, but both support webhooks — use Make.com's Custom Webhook module to receive payment events. For Razorpay specifically: Webhook → Filter (payment.captured event) → your automation chain. Slightly more setup than Shopify's native module, but works reliably.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I handle WhatsApp template approvals for Indian brands?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For WhatsApp Business API in India, you need to use a registered BSP (Business Solution Provider) — MSG91, Gupshup, or Interakt are the most common for Indian D2C brands. All three have HTTP API endpoints that work cleanly with Make.com's HTTP module. Template approval through Meta takes 1-3 business days. Build your templates with placeholders before starting development so approval doesn't block your launch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens to a running Make.com scenario if I hit my operation limit?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Make.com pauses further scenario executions until the next billing cycle or until you upgrade. Incomplete executions are stored and can be resumed. This is a real operational risk for high-volume brands — monitor your operation consumption, especially in peak seasons (Diwali, year-end sales). Set up email alerts in Make.com settings for when you reach 80% of your limit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can Make.com scenarios be exported and moved to another account?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. Make.com scenarios export as JSON blueprints. You can import them into another account or team workspace. This is how we deliver automation builds to clients — we build in our development account, test, then export the blueprint for the client to import into their own Make.com account. Credentials (API keys, OAuth tokens) don't export and need to be reconnected in the destination account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How is Make.com different from Zapier for D2C use cases?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Make.com's scenario builder is far more powerful than Zapier for complex, multi-step D2C workflows. The Router, Iterator, and Array Aggregator modules don't have direct Zapier equivalents for many use cases. Make.com is also significantly cheaper at equivalent operation volumes. The trade-off: Make.com has a steeper learning curve than Zapier. For simple 2-step "if this, then that" automations, Zapier's ease of use wins. For everything on this list, Make.com is the better tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We already use n8n. Should we migrate to Make.com for these recipes?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Probably not. If your team is already comfortable with n8n, the operational cost savings at scale make n8n the better long-term choice. The Make.com vs n8n decision is primarily about: (1) whether your team can manage n8n's self-hosted complexity, and (2) whether the visual UX of Make.com is important for non-technical team members. If neither is a blocker, stay with n8n.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Rishabh Sethia&lt;/strong&gt; is the Founder &amp;amp; CEO of Innovatrix Infotech. Former Senior Software Engineer and Head of Engineering. DPIIT Recognised Startup. We build Make.com and n8n automations for D2C brands across India, Dubai, and Singapore via our &lt;a href="https://dev.to/services/ai-automation"&gt;AI automation service&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://innovatrixinfotech.com/blog/make-com-automation-recipes-d2c-brands?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>makecom</category>
      <category>d2cautomation</category>
      <category>ecommerceautomation</category>
      <category>shopify</category>
    </item>
    <item>
      <title>Shopify Hydrogen vs Liquid 2026: When Headless Actually Makes Sense</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Mon, 03 Aug 2026 09:30:01 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/shopify-hydrogen-vs-liquid-2026-when-headless-actually-makes-sense-3doc</link>
      <guid>https://dev.to/emperorakashi20/shopify-hydrogen-vs-liquid-2026-when-headless-actually-makes-sense-3doc</guid>
      <description>&lt;p&gt;There's a conversation that happens more often than it should. A founder reads a Medium post about headless commerce, watches a Shopify Unite talk, and comes to us saying: "We want Hydrogen." They've heard it's faster, more modern, more scalable. Sometimes they're right. More often, they're about to spend 3x more money for a marginal performance gain they could have achieved by cleaning up their Liquid theme.&lt;/p&gt;

&lt;p&gt;As a former Senior Software Engineer who has shipped production storefronts on both Liquid and Hydrogen, my take is direct: &lt;strong&gt;Liquid is the right choice for the vast majority of Shopify brands in 2026&lt;/strong&gt;. Hydrogen is a powerful tool for a specific profile of merchant. Confusing which one you are is an expensive mistake.&lt;/p&gt;

&lt;p&gt;This post breaks down both architectures — what they actually are, where each wins, and the exact inflection point where switching to headless stops being overkill and starts making engineering sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Liquid Actually Is (And Why It's Underrated)
&lt;/h2&gt;

&lt;p&gt;Liquid is Shopify's templating language. Your storefront lives on Shopify's servers, renders server-side on each request, and is delivered as HTML to the browser. Shopify handles hosting, CDN, SSL, uptime, and scaling automatically.&lt;/p&gt;

&lt;p&gt;Developers who dismiss Liquid as "old" are thinking about it wrong. Shopify has invested heavily in Liquid performance: the Online Store 2.0 architecture introduced section-everywhere, app blocks replaced legacy script injection, and Shopify's CDN is globally distributed across Cloudflare edge nodes. When you write clean Liquid — no render-blocking apps, compressed images, minimal third-party scripts — you can hit 90+ mobile PageSpeed scores consistently.&lt;/p&gt;

&lt;p&gt;We've done it. For &lt;a href="https://dev.to/blog/shopify-speed-optimization"&gt;FloraSoul India&lt;/a&gt;, we stripped out animation libraries, preloaded the LCP image, and implemented proper &lt;code&gt;srcset&lt;/code&gt; on product photos — all within Liquid — and lifted their mobile conversion rate by &lt;strong&gt;+41%&lt;/strong&gt; without touching the storefront architecture.&lt;/p&gt;

&lt;p&gt;Liquid's other underrated advantage: &lt;strong&gt;the entire Shopify app ecosystem works&lt;/strong&gt;. Every Shopify app — review platforms, upsell tools, loyalty programs, subscription billing — is built with Liquid theme extensions as the integration layer. This compatibility is worth more than most brands realise.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Hydrogen Actually Is
&lt;/h2&gt;

&lt;p&gt;Hydrogen is Shopify's React-based headless framework, built on top of Remix (now Shopify's recommended meta-framework). Your storefront runs as a JavaScript application — either on Shopify's own edge hosting platform called Oxygen, or on Vercel, Netlify, or your own infrastructure.&lt;/p&gt;

&lt;p&gt;Hydrogen fetches product, collection, and cart data from the Storefront API (GraphQL). The checkout is still Shopify-hosted — that's an important constraint to understand. You own the discovery and browsing experience. Shopify owns checkout.&lt;/p&gt;

&lt;p&gt;On Oxygen (Cloudflare Workers-based), Hydrogen storefronts can achieve very low TTFB globally — sub-100ms for cached responses is realistic. For high-traffic, globally distributed brands with complex rendering requirements, this is genuinely valuable.&lt;/p&gt;

&lt;p&gt;But there's a catch most agency blogs won't tell you: &lt;strong&gt;Shopify's own performance data shows Liquid storefronts pass Core Web Vitals at higher rates than most headless implementations&lt;/strong&gt;. The reason is simple — most teams underestimate how hard it is to optimise a React SPA for CWV. An optimised Liquid theme scores ~90 mobile. An optimised Hydrogen storefront scores 95-99. That 5-10 point delta is real, but it comes at 3-5x the build cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Head-to-Head: The Honest Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Factor&lt;/th&gt;
&lt;th&gt;Liquid&lt;/th&gt;
&lt;th&gt;Hydrogen&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Build time&lt;/td&gt;
&lt;td&gt;3–8 weeks&lt;/td&gt;
&lt;td&gt;12–20 weeks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Relative cost&lt;/td&gt;
&lt;td&gt;Base&lt;/td&gt;
&lt;td&gt;3–5x higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App compatibility&lt;/td&gt;
&lt;td&gt;~95%+ of Shopify apps&lt;/td&gt;
&lt;td&gt;~20–40% natively&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosting&lt;/td&gt;
&lt;td&gt;Shopify-managed&lt;/td&gt;
&lt;td&gt;Oxygen / Vercel / custom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mobile CWV (optimised)&lt;/td&gt;
&lt;td&gt;~90 score&lt;/td&gt;
&lt;td&gt;~95–99 score&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer ecosystem&lt;/td&gt;
&lt;td&gt;Liquid + JS&lt;/td&gt;
&lt;td&gt;React, Remix, full-stack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintenance overhead&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Medium–High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shopify OS updates&lt;/td&gt;
&lt;td&gt;Auto / semi-auto&lt;/td&gt;
&lt;td&gt;Manual migration required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ideal revenue range&lt;/td&gt;
&lt;td&gt;₹0 – ₹10Cr+&lt;/td&gt;
&lt;td&gt;₹10Cr+ (case-by-case)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When Liquid Is the Right Call
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The majority of D2C brands should be on Liquid.&lt;/strong&gt; Here's who that is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're under 100,000 monthly sessions&lt;/li&gt;
&lt;li&gt;Your product catalog is under 500 SKUs&lt;/li&gt;
&lt;li&gt;You rely on Shopify apps for reviews, subscriptions, bundles, or loyalty&lt;/li&gt;
&lt;li&gt;You're launching in the next 3 months and need to move fast&lt;/li&gt;
&lt;li&gt;Your team doesn't have dedicated React/Node engineers&lt;/li&gt;
&lt;li&gt;Your revenue is under ₹10 crore annually&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For Baby Forest India, we built and launched their complete Shopify store in under 3 weeks on Liquid. Launch-month revenue hit &lt;strong&gt;₹4.2 lakh&lt;/strong&gt;. Cart abandonment dropped &lt;strong&gt;22%&lt;/strong&gt; with WhatsApp and email automation layered on post-launch. We couldn't have done that on Hydrogen in the same timeframe.&lt;/p&gt;

&lt;p&gt;As an official &lt;a href="https://dev.to/services/shopify"&gt;Shopify Partner&lt;/a&gt;, we have direct access to Shopify's theme architecture guidelines and partner resources. Our position: a well-executed premium Liquid theme with custom sections and clean code will outperform a poorly-executed Hydrogen build on every metric that matters — performance, conversion, and time-to-market.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Hydrogen Actually Makes Sense
&lt;/h2&gt;

&lt;p&gt;There is a real use case for Hydrogen. You've crossed the inflection point when:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Scale demands it:&lt;/strong&gt; 100,000+ sessions/month, where Shopify's server-side rendering introduces perceptible latency and you need edge-rendered, personalised experiences at scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Catalog complexity demands it:&lt;/strong&gt; 500+ SKUs with complex filtering, faceted search, or real-time inventory across multiple warehouses. Hydrogen lets you build custom search layers (Algolia, Typesense) without fighting Shopify's native limitations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Multi-region, multi-language:&lt;/strong&gt; You're operating in 3+ markets with different currencies, languages, and fulfilment logic. Hydrogen gives you architectural control that the Liquid theme layer doesn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Custom UI requirements that apps can't satisfy:&lt;/strong&gt; You need a try-on tool, 3D product viewer, or interactive configurator that fundamentally conflicts with how Liquid renders. With Hydrogen, you own the rendering pipeline entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Your engineering team is React-native:&lt;/strong&gt; If your in-house developers live in React and TypeScript, Hydrogen gives them a familiar stack. Forcing React engineers to learn Liquid's constraints has its own cost.&lt;/p&gt;

&lt;p&gt;Critical caveat: before committing to Hydrogen for performance reasons alone, let us audit your current Liquid store first. Our &lt;a href="https://dev.to/blog/shopify-speed-optimization"&gt;Shopify speed optimisation work&lt;/a&gt; has consistently shown that most performance problems are solvable in Liquid — without the architectural complexity of going headless.&lt;/p&gt;

&lt;h2&gt;
  
  
  The App Compatibility Problem Nobody Mentions
&lt;/h2&gt;

&lt;p&gt;This is the one thing that bites Hydrogen adopters hardest in production. Most Shopify apps — Yotpo, Okendo, Rebuy, Recharge, and dozens of others — are built on the assumption that your storefront is Liquid. They inject snippets into your theme files, use Shopify's theme app extensions, and assume a certain DOM structure.&lt;/p&gt;

&lt;p&gt;With Hydrogen, roughly 20-40% of Shopify apps work natively. The rest require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom API integrations built from scratch&lt;/li&gt;
&lt;li&gt;Headless-compatible SDK versions (if the vendor has them)&lt;/li&gt;
&lt;li&gt;Complete rebuilds of functionality you currently get for free from apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before you choose Hydrogen, list every app you're currently running or plan to run. Check each vendor's headless compatibility. The sum of custom integration work required is often the difference between a Hydrogen build being viable and not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Development Cost Reality
&lt;/h2&gt;

&lt;p&gt;A quality Liquid theme build from us runs 3–8 weeks with our &lt;a href="https://dev.to/services/shopify"&gt;Shopify development service&lt;/a&gt;. A Hydrogen build for the same storefront scope runs 12–20 weeks minimum. The cost differential is 3–5x.&lt;/p&gt;

&lt;p&gt;That cost delta is rational if Hydrogen is genuinely solving a problem you have. It's irrational if you're doing it for brand positioning or because a competitor mentioned headless in their funding announcement.&lt;/p&gt;

&lt;p&gt;Also consider ongoing cost: when Shopify releases platform updates — new checkout features, Shop Pay integrations, new product metafield types — Liquid stores get these with minimal effort. Hydrogen stores require engineering work to adopt each update. The maintenance overhead compounds over time.&lt;/p&gt;

&lt;p&gt;For complex projects at this scale, our &lt;a href="https://dev.to/services/web-development"&gt;web development team&lt;/a&gt; works alongside Shopify engineers to architect the right solution from the start — whether that's Liquid, Hydrogen, or a hybrid approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our Verdict
&lt;/h2&gt;

&lt;p&gt;Hydrogen is not the future for every brand. It's the right architecture for a specific tier of merchant: high-traffic, catalog-complex, engineering-resourced, operating at scale.&lt;/p&gt;

&lt;p&gt;For 90% of D2C brands — especially those under ₹10Cr in annual revenue — Liquid is faster to market, cheaper to build, easier to maintain, and fully compatible with the apps your business depends on.&lt;/p&gt;

&lt;p&gt;When you're generating ₹50Cr+ annually and your performance data shows measurable conversion loss from storefront speed, that's when the Hydrogen conversation becomes a serious business decision rather than a technical preference.&lt;/p&gt;

&lt;p&gt;We're equally capable of building both. As a Shopify Partner, we'll tell you which one you actually need — not which one has a better pitch deck.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Is Shopify Hydrogen faster than Liquid?&lt;/strong&gt;&lt;br&gt;
An optimised Hydrogen storefront can score 5–10 points higher on Google PageSpeed than an optimised Liquid store. But an unoptimised Hydrogen build can perform worse than clean Liquid — the architecture doesn't guarantee performance, execution does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I migrate from Liquid to Hydrogen later?&lt;/strong&gt;&lt;br&gt;
Yes, but it's a full rebuild — not a migration. There's no automated path from Liquid to Hydrogen. If you build on Liquid now and later want Hydrogen, budget for a complete storefront rebuild at that stage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do all Shopify apps work with Hydrogen?&lt;/strong&gt;&lt;br&gt;
No. Only around 20–40% of Shopify apps natively support headless/Hydrogen. Many of the most popular apps — subscriptions, reviews, loyalty — require custom API integration work or headless-compatible SDK versions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Shopify Oxygen?&lt;/strong&gt;&lt;br&gt;
Oxygen is Shopify's edge hosting platform for Hydrogen storefronts. It runs on Cloudflare Workers infrastructure, providing globally distributed compute close to the user. Oxygen is included with Shopify plans at no additional hosting cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much does a Hydrogen build cost vs Liquid?&lt;/strong&gt;&lt;br&gt;
A Liquid build typically runs 3–8 weeks. A comparable Hydrogen build runs 12–20 weeks. The cost differential is approximately 3–5x. Total investment depends on catalog size, feature complexity, and app integrations required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is headless commerce right for my Shopify store?&lt;/strong&gt;&lt;br&gt;
Ask yourself: Are you doing 100K+ monthly sessions? Do you have 500+ SKUs requiring complex filtering? Are you operating in multiple countries with different languages and currencies? Do you have in-house React engineers? If you answered no to most of these, start with Liquid.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use Hydrogen with a regular Shopify plan?&lt;/strong&gt;&lt;br&gt;
You need at least a Shopify Advanced plan or Shopify Plus to get the most out of Oxygen hosting. Basic and Standard plans technically support Shopify's Storefront API, but without Oxygen, you'd need to host your Hydrogen storefront externally on Vercel or similar.&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-hydrogen-vs-liquid-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>hydrogen</category>
      <category>liquid</category>
      <category>headless</category>
    </item>
    <item>
      <title>No-Code vs Custom Development: Which One Should You Choose in 2026?</title>
      <dc:creator>Rishabh Sethia</dc:creator>
      <pubDate>Mon, 03 Aug 2026 04:30:01 +0000</pubDate>
      <link>https://dev.to/emperorakashi20/no-code-vs-custom-development-which-one-should-you-choose-in-2026-15bm</link>
      <guid>https://dev.to/emperorakashi20/no-code-vs-custom-development-which-one-should-you-choose-in-2026-15bm</guid>
      <description>&lt;p&gt;The no-code vs custom development debate is getting louder as tools like Webflow, Bubble, and Framer gain traction. Here's when each makes sense — and when the choice is obvious.&lt;/p&gt;

&lt;h2&gt;
  
  
  What No-Code Actually Means in 2026
&lt;/h2&gt;

&lt;p&gt;No-code platforms have evolved dramatically. You're no longer choosing between "drag-and-drop toy" and "proper development." The spectrum now looks like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Website builders&lt;/strong&gt; (Webflow, Framer, Wix): UI-only, no custom logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App builders&lt;/strong&gt; (Bubble, Glide, AppGyver): Full apps with database and logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automation platforms&lt;/strong&gt; (Make, n8n, Zapier): Workflow automation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend platforms&lt;/strong&gt; (Xano, Supabase with no-code UI): Database + API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The right comparison isn't "no-code vs custom code" — it's "which tool (no-code or custom) is right for this specific requirement?"&lt;/p&gt;

&lt;h2&gt;
  
  
  No-Code Wins When
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Speed matters more than flexibility.&lt;/strong&gt; A Webflow site can be live in 2 weeks. A custom Next.js build takes 6-10 weeks. If you're validating a concept or launching before a funding round, time-to-market can outweigh technical debt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your product fits the platform's model.&lt;/strong&gt; Bubble is excellent for marketplaces, internal tools, and MVPs with standard CRUD patterns. If your product maps to what Bubble does well, you might never need custom code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your team is non-technical.&lt;/strong&gt; No-code tools empower non-technical founders to build, iterate, and manage their own product. Removing developer dependency can dramatically accelerate iteration speed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Budget is constrained.&lt;/strong&gt; A Bubble MVP costs ₹3-8 lakh to build vs ₹15-30 lakh for a custom equivalent. The no-code version can be thrown away once you've validated and raised — but it got you there.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Performance is a core product requirement.&lt;/strong&gt; No-code platforms add abstraction layers that impact performance. For products where sub-100ms response times matter (trading platforms, real-time logistics), custom is the only option.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security requirements are strict.&lt;/strong&gt; Healthcare, fintech, and government applications need audit trails, specific encryption standards, and compliance features that no-code platforms simply can't provide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your logic is genuinely unique.&lt;/strong&gt; No-code platforms are built for standard patterns. Complex pricing algorithms, custom machine learning integration, or deeply specialized workflows eventually hit walls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You need full data ownership.&lt;/strong&gt; No-code data is in the platform's database. If your data sovereignty requirements or investor terms require you to own all infrastructure, custom development is necessary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You're building for scale.&lt;/strong&gt; Bubble has limits at high traffic. Webflow can't handle complex server-side rendering requirements. When you're planning for millions of users, architect for that from the start.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hybrid Approach (What Most Teams Should Do)
&lt;/h2&gt;

&lt;p&gt;Most successful products use both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Marketing site:&lt;/strong&gt; Webflow or Framer (non-technical team can manage content)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MVP/product:&lt;/strong&gt; Bubble or custom depending on complexity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internal tools:&lt;/strong&gt; Retool, Appsmith, or custom depending on data sensitivity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automations:&lt;/strong&gt; Make/n8n (no reason to custom-code routine integrations)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Core product logic:&lt;/strong&gt; Custom code where unique or performance-critical&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Building custom too early.&lt;/strong&gt; Most founders should be on Bubble longer than they are. The flexibility anxiety isn't worth the cost if you haven't validated PMF.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Staying on no-code too long.&lt;/strong&gt; Migrating from Bubble to custom at Series A is painful. Have a clear threshold: "When we hit X users or need Y feature, we'll migrate."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thinking no-code means no developer.&lt;/strong&gt; Complex Bubble apps need good Bubble developers. Webflow needs a Webflow developer for anything beyond templates. "No-code" just means no custom programming language, not no technical expertise.&lt;/p&gt;




&lt;p&gt;Need expert help? Innovatrix Infotech builds custom &lt;a href="https://www.innovatrixinfotech.com/services/web-development" rel="noopener noreferrer"&gt;web development solutions&lt;/a&gt; for businesses across India — from MVPs to production systems. &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/no-code-vs-custom-development-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>nocode</category>
      <category>customdevelopment</category>
      <category>development</category>
      <category>startup</category>
    </item>
    <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>
  </channel>
</rss>
