<?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: Me-Time Support</title>
    <description>The latest articles on DEV Community by Me-Time Support (@metime_support_e00703a3b).</description>
    <link>https://dev.to/metime_support_e00703a3b</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%2F3903695%2Fec1c9e6b-8d93-411f-a1d9-de528c14abd2.png</url>
      <title>DEV Community: Me-Time Support</title>
      <link>https://dev.to/metime_support_e00703a3b</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/metime_support_e00703a3b"/>
    <language>en</language>
    <item>
      <title>A Shopify 201 does not mean your title changed</title>
      <dc:creator>Me-Time Support</dc:creator>
      <pubDate>Fri, 28 Aug 2026 05:21:22 +0000</pubDate>
      <link>https://dev.to/metime_support_e00703a3b/a-shopify-201-does-not-mean-your-title-changed-3fb1</link>
      <guid>https://dev.to/metime_support_e00703a3b/a-shopify-201-does-not-mean-your-title-changed-3fb1</guid>
      <description>&lt;p&gt;Shopify stores can serve the same page at &lt;code&gt;/pages/foo&lt;/code&gt;, &lt;code&gt;/en/pages/foo&lt;/code&gt; and &lt;code&gt;/nl/pages/foo&lt;/code&gt;. If you have ever written a script that updates page titles across such a store, you have probably hit the bug I am about to describe. It cost me two weeks of believing work was done when it was not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;I had a script that rewrote SEO titles through the Admin REST API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;SHOP&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/admin/api/2024-01/pages/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;page_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/metafields.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Shopify-Access-Token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TOKEN&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;metafield&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;namespace&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;global&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title_tag&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;new_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;single_line_text_field&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every call returned &lt;code&gt;201&lt;/code&gt;. I ran it over a hundred pages, logged the successes, and moved on.&lt;/p&gt;

&lt;p&gt;Two weeks later I checked the live HTML. Roughly half the pages still showed their old titles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why: two layers, one wins silently
&lt;/h2&gt;

&lt;p&gt;The metafield write is real. It updates the &lt;strong&gt;primary locale&lt;/strong&gt;. But if a translation already exists for &lt;code&gt;meta_title&lt;/code&gt; on that resource, the translated value wins at render time on &lt;code&gt;/en/&lt;/code&gt; and &lt;code&gt;/nl/&lt;/code&gt; URLs.&lt;/p&gt;

&lt;p&gt;Nothing warns you. The API did exactly what you asked — you asked the wrong layer.&lt;/p&gt;

&lt;p&gt;Translations live in GraphQL, and the mutation requires a digest of the &lt;em&gt;source&lt;/em&gt; value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;translatableResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gid://shopify/Page/730209845580"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;translatableContent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;digest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Request &lt;code&gt;{ key digest }&lt;/code&gt; and &lt;strong&gt;not&lt;/strong&gt; &lt;code&gt;value&lt;/code&gt;. Asking for &lt;code&gt;value&lt;/code&gt; drags the whole &lt;code&gt;body_html&lt;/code&gt; down with it; batching six resources that way returned 62,000 characters for me.&lt;/p&gt;

&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;mutation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;translationsRegister&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gid://shopify/Page/730209845580"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;translations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"meta_title"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"…"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;translatableContentDigest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0853eaa6b9…c4ed0"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;userErrors&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read &lt;code&gt;userErrors&lt;/code&gt; every time. A stale digest returns HTTP 200 with the failure buried in the payload.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three traps around it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Translated handles.&lt;/strong&gt; &lt;code&gt;/en/pages/ginger-and-sleep-does-ginger-help-you-sleep-better&lt;/code&gt; may be the English translation of a French page whose handle is completely different. Looking it up by the URL slug returns nothing. The page tells you itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$EN_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'\n'&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'hreflang="fr" href="[^"]*"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;hreflang&lt;/code&gt; alternate points straight at the source. Take its handle, look that up, done. I spent an hour grepping handles by keyword before noticing this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Redirects.&lt;/strong&gt; Old URLs 301 to the new localized handle. Without &lt;code&gt;curl -L&lt;/code&gt; you get an empty body and conclude the page is broken. It is not — and I reported a "broken page" count that was pure artefact before I caught it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CDN caching.&lt;/strong&gt; A successful write can still serve the old title for minutes. Append &lt;code&gt;?v=$(date +%s%N)&lt;/code&gt; when verifying, or you will "fix" something twice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule I now apply everywhere
&lt;/h2&gt;

&lt;p&gt;A &lt;code&gt;200&lt;/code&gt; means &lt;em&gt;stored&lt;/em&gt;, not &lt;em&gt;rendered&lt;/em&gt;. Any write into a CMS with a translation, theme, or app override layer needs a render-level check — fetch the live page and assert the value is actually there.&lt;/p&gt;

&lt;p&gt;Cheap version, and it catches everything above:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="s2"&gt;"Mozilla/5.0"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$URL&lt;/span&gt;&lt;span class="s2"&gt;?v=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%s%N&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'\n'&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;title&amp;gt;[^&amp;lt;]*'&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$EXPECTED&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"STALE: &lt;/span&gt;&lt;span class="nv"&gt;$URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I now treat an unverified write as an unfinished one. It turns a silent half-failure into a one-line assertion.&lt;/p&gt;




&lt;p&gt;The store is &lt;a href="https://inti-drink.com" rel="noopener noreferrer"&gt;INTI&lt;/a&gt;, a Belgian organic ginger elixir with content in three locales, which is exactly how I walked into all of this.&lt;/p&gt;

&lt;p&gt;Has your platform bitten you with a similar silent override? I would like to know which layer won.&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>api</category>
      <category>graphql</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Find keyword cannibalisation with the Search Console API in 20 lines</title>
      <dc:creator>Me-Time Support</dc:creator>
      <pubDate>Thu, 27 Aug 2026 23:21:08 +0000</pubDate>
      <link>https://dev.to/metime_support_e00703a3b/find-keyword-cannibalisation-with-the-search-console-api-in-20-lines-3j2e</link>
      <guid>https://dev.to/metime_support_e00703a3b/find-keyword-cannibalisation-with-the-search-console-api-in-20-lines-3j2e</guid>
      <description>&lt;p&gt;If you run a content site with more than a few hundred pages, some of your pages are competing against each other in Google. You probably suspect it. Here is how to prove it with the Search Console API and about twenty lines of Python.&lt;/p&gt;

&lt;p&gt;I ran this on a site with ~5,000 URLs and 23,000 ranking queries. It found 175 queries where three or more of my own pages were splitting the same search. One topic had &lt;strong&gt;thirty pages&lt;/strong&gt; fighting over six queries, none of them ranking above position 11.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trick: query the two-dimension breakdown
&lt;/h2&gt;

&lt;p&gt;Most people pull Search Console data one dimension at a time — queries, or pages. The useful view is both at once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.oauth2&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;service_account&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;googleapiclient.discovery&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;

&lt;span class="n"&gt;creds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;service_account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Credentials&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_service_account_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;service-account.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;scopes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.googleapis.com/auth/webmasters.readonly&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;svc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;searchconsole&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;credentials&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;creds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;svc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;searchanalytics&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;siteUrl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;startDate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-05-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;endDate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-07-30&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dimensions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;page&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;   &lt;span class="c1"&gt;# &amp;lt;- both
&lt;/span&gt;            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rowLimit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;startRow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rows&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
    &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;batch&lt;/span&gt;
    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;25000&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;25000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note the pagination. &lt;code&gt;rowLimit&lt;/code&gt; maxes out at 25,000 per call and the two-dimension breakdown blows past that fast — my 90-day pull returned 46,813 pairs. Without the loop you silently get a truncated picture and draw the wrong conclusions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Grouping
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;defaultdict&lt;/span&gt;

&lt;span class="n"&gt;by_query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defaultdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;keys&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;by_query&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;impressions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;position&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;

&lt;span class="n"&gt;problems&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hits&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;by_query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;impressions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;hits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;impressions&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="n"&gt;best&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;hits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;problems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;impressions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hits&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;best&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;problems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The filter that matters most
&lt;/h2&gt;

&lt;p&gt;My first version flagged everything with 3+ pages and produced a list I could not act on. The top entry had &lt;strong&gt;29 pages&lt;/strong&gt; on one query — and its best position was &lt;strong&gt;2.0&lt;/strong&gt;. That is not a problem. That is a brand SERP with sitelinks, working exactly as intended.&lt;/p&gt;

&lt;p&gt;Cannibalisation only hurts when nobody wins:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;problems&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;problems&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;   &lt;span class="c1"&gt;# p[2] = best position
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That single line cut my list from 175 entries to 5 real ones. Everything else was either a brand query or a topic where one page was already ranking fine and the others were harmless long-tail noise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sitelinks are the trap here.&lt;/strong&gt; On a brand query, Google reports an impression for every sitelink URL in the block, but the click only lands on the main result. So you see six URLs at position 1.4 with 0% CTR and conclude you have a catastrophic CTR problem. You do not. You have one result and five sitelinks. Check whether the homepage in the same query is picking up the clicks before you "fix" anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fixing it without deleting pages
&lt;/h2&gt;

&lt;p&gt;The textbook answer is consolidate-and-redirect. That is often the right call, but it is also destructive and hard to reverse across dozens of URLs.&lt;/p&gt;

&lt;p&gt;The cheaper first move is to stop the pages competing:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pick the page that already ranks best on the head term. It has the links and the history; do not fight it.&lt;/li&gt;
&lt;li&gt;Give it the exact-match title for that query.&lt;/li&gt;
&lt;li&gt;Retitle every satellite to a &lt;strong&gt;distinct sub-intent&lt;/strong&gt; — a different question, not a variation of the same one.&lt;/li&gt;
&lt;li&gt;Add a link from each satellite to the primary, with a stable HTML marker so the operation stays idempotent:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;MARKER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;!--canonical-hint-liver--&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;MARKER&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;body_html&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;body_html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MARKER&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;link_block&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;body_html&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The marker matters more than it looks. It lets you re-run the script safely, which you will, because you will get the intent assignment wrong on the first pass.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would do differently
&lt;/h2&gt;

&lt;p&gt;I would have run this detector &lt;strong&gt;before&lt;/strong&gt; writing 200 more pages on topics I already covered. The impressions were never the constraint — the site had plenty. The constraint was that the pages were dividing the signal instead of concentrating it.&lt;/p&gt;

&lt;p&gt;If you are about to commission another batch of articles, run the query-times-page breakdown first. It takes ten minutes and it will probably tell you to write fewer, better pages.&lt;/p&gt;




&lt;p&gt;The site behind this is &lt;a href="https://inti-drink.com" rel="noopener noreferrer"&gt;INTI&lt;/a&gt;, a Belgian organic ginger elixir with a very over-enthusiastic content history. The consolidated topic cluster from the example is &lt;a href="https://inti-drink.com/blogs/news/gingembre-foie-detox-nash-protection-hepatique" rel="noopener noreferrer"&gt;ginger and the liver&lt;/a&gt;, if you want to see the pattern in production.&lt;/p&gt;

&lt;p&gt;What is the worst cannibalisation you have found on your own site? I am curious whether thirty pages on one topic is a record or merely average.&lt;/p&gt;

</description>
      <category>python</category>
      <category>seo</category>
      <category>api</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Your Shopify SEO metafields silently don't apply to /en/ URLs</title>
      <dc:creator>Me-Time Support</dc:creator>
      <pubDate>Mon, 24 Aug 2026 19:00:42 +0000</pubDate>
      <link>https://dev.to/metime_support_e00703a3b/your-shopify-seo-metafields-silently-dont-apply-to-en-urls-45jn</link>
      <guid>https://dev.to/metime_support_e00703a3b/your-shopify-seo-metafields-silently-dont-apply-to-en-urls-45jn</guid>
      <description>&lt;p&gt;If you run a multilingual Shopify store and you have ever fixed a page title through the Admin API, only to watch Google keep showing the old one, this post is for you.&lt;/p&gt;

&lt;p&gt;I hit this on a store with roughly 2,000 content URLs across French, English and Dutch. I rewrote the SEO titles of 112 pages through the REST API, verified every write returned &lt;code&gt;200&lt;/code&gt;, and moved on. Two weeks later I checked the live HTML. &lt;strong&gt;51 of them had never changed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is what was going on, and how to detect it in one line.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trap: locale translations outrank metafields
&lt;/h2&gt;

&lt;p&gt;On Shopify, a page's SEO title lives in a metafield:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;global&lt;/span&gt;
&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;       &lt;span class="s"&gt;title_tag&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Writing it through REST is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;SHOP&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/admin/api/2024-01/pages/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;page_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/metafields.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Shopify-Access-Token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TOKEN&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;metafield&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;namespace&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;global&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title_tag&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;My new title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;single_line_text_field&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That write succeeds. It updates the &lt;strong&gt;primary locale&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But if your store serves &lt;code&gt;/en/&lt;/code&gt; or &lt;code&gt;/nl/&lt;/code&gt; URLs and a translation already exists for &lt;code&gt;meta_title&lt;/code&gt; on that resource, the translated value wins at render time. Your metafield write is real, stored, and completely invisible on the URL that actually ranks.&lt;/p&gt;

&lt;p&gt;Worse, it fails silently. No error, no warning. The API is doing exactly what you asked; you just asked the wrong layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detecting it in one line
&lt;/h2&gt;

&lt;p&gt;Give every title you write a stable suffix. I use &lt;code&gt;| Brand&lt;/code&gt;. Then the audit is trivial:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="s2"&gt;"Mozilla/5.0"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'\n'&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;title&amp;gt;[^&amp;lt;]*'&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s1"&gt;'| Brand'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"STALE: &lt;/span&gt;&lt;span class="nv"&gt;$URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two details that cost me time:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;-L&lt;/code&gt;.&lt;/strong&gt; Old URLs frequently 301 to a localized handle (&lt;code&gt;/en/pages/gingembre-sommeil&lt;/code&gt; → &lt;code&gt;/en/pages/ginger-and-sleep&lt;/code&gt;). Without &lt;code&gt;-L&lt;/code&gt; you get an empty body and conclude the page is broken. It isn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cache-bust.&lt;/strong&gt; Append &lt;code&gt;?v=$(date +%s%N)&lt;/code&gt;. The Shopify CDN will happily serve you a stale title for minutes after a successful write, which makes you doubt a fix that already worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: translationsRegister
&lt;/h2&gt;

&lt;p&gt;Translations are GraphQL-only. Read the digest first — it is a hash of the &lt;em&gt;source&lt;/em&gt; value and the mutation is rejected without a matching one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;translatableResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gid://shopify/Page/730209845580"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;translatableContent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;digest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Request &lt;code&gt;{ key digest }&lt;/code&gt; and &lt;strong&gt;not&lt;/strong&gt; &lt;code&gt;value&lt;/code&gt;. Asking for &lt;code&gt;value&lt;/code&gt; pulls the entire &lt;code&gt;body_html&lt;/code&gt; down with it; batching six resources that way returned 62,000 characters and blew my response budget.&lt;/p&gt;

&lt;p&gt;Then write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;mutation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;translationsRegister&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gid://shopify/Page/730209845580"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;translations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"meta_title"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Does Ginger Help With Sleep? What the Studies Say"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;translatableContentDigest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0853eaa6b9...c4ed0"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;userErrors&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Always read &lt;code&gt;userErrors&lt;/code&gt;. A stale digest returns &lt;code&gt;200&lt;/code&gt; with the error buried in the payload.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: resolving a translated handle to its source
&lt;/h2&gt;

&lt;p&gt;Localized handles break every lookup, because &lt;code&gt;/en/pages/ginger-and-sleep-does-ginger-help-you-sleep-better&lt;/code&gt; does not exist as a handle in the default locale. You cannot query it by name.&lt;/p&gt;

&lt;p&gt;I wasted an hour grepping handles by keyword before noticing the page tells you itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$EN_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'\n'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'hreflang="fr" href="[^"]*"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;hreflang&lt;/code&gt; alternate points straight at the source URL. Take its handle, look that up through REST, and you have your resource ID. Reliable, and about forty times faster than guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two things worth internalising
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A &lt;code&gt;200&lt;/code&gt; means "stored", not "rendered".&lt;/strong&gt; Any write to a CMS with a translation layer needs a render-level check, not just a status code. I now treat an unverified write as an unfinished one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Silent overrides are the expensive bugs.&lt;/strong&gt; Nothing in the REST response hints that another layer will win. If your platform has locale, theme or app-level overrides, find out which one has priority &lt;em&gt;before&lt;/em&gt; you run a batch job across a thousand records.&lt;/p&gt;




&lt;p&gt;The store behind this write-up is &lt;a href="https://inti-drink.com" rel="noopener noreferrer"&gt;INTI&lt;/a&gt;, an organic ginger, turmeric and lemon elixir made in Belgium — a genuinely multilingual Shopify catalogue, which is precisely how I ran into all of this. If you want to see the pattern in the wild, the page from the mutation above is &lt;a href="https://inti-drink.com/en/pages/ginger-and-sleep-does-ginger-help-you-sleep-better" rel="noopener noreferrer"&gt;ginger and sleep&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Have you hit a silent override like this on another platform? I would like to hear which layer won.&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>seo</category>
      <category>api</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Ginger for Blood Circulation: NO-Dependent Vasodilation Explained</title>
      <dc:creator>Me-Time Support</dc:creator>
      <pubDate>Fri, 29 May 2026 12:46:47 +0000</pubDate>
      <link>https://dev.to/metime_support_e00703a3b/ginger-for-blood-circulation-no-dependent-vasodilation-explained-alg</link>
      <guid>https://dev.to/metime_support_e00703a3b/ginger-for-blood-circulation-no-dependent-vasodilation-explained-alg</guid>
      <description>&lt;p&gt;Cold hands? Heavy legs? Poor circulation? Ginger improves blood flow through three distinct mechanisms.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Nitric Oxide Production
&lt;/h2&gt;

&lt;p&gt;6-gingerol stimulates endothelial NO (nitric oxide) production → vascular smooth muscle relaxation → vasodilation → improved blood flow. Same mechanism as beet juice, but with additional anti-inflammatory benefits.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Anti-Platelet Aggregation
&lt;/h2&gt;

&lt;p&gt;Ginger inhibits thromboxane synthase → reduced platelet aggregation → thinner blood → better microcirculation. Similar to low-dose aspirin, but milder.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Peripheral Thermogenesis
&lt;/h2&gt;

&lt;p&gt;TRPV1 activation → warming sensation → peripheral vasodilation → more blood to hands, feet, extremities. The warming effect isn't just a feeling — it's real increased peripheral blood flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sugar Damages Blood Vessels
&lt;/h2&gt;

&lt;p&gt;Excess sugar → AGEs (Advanced Glycation End-products) → protein glycation in vessel walls → arterial stiffness → worse circulation. A ginger shot with 33g sugar damages the vessels while ginger tries to dilate them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://inti-drink.com/pages/gingembre-circulation-sanguine-jambes-lourdes-varices" rel="noopener noreferrer"&gt;INTI&lt;/a&gt; — 1.1g sugar. Plus turmeric (independent endothelial vasodilator) + black pepper.&lt;/p&gt;

&lt;p&gt;⚠️ If on anticoagulants, consult your doctor — ginger has mild anti-platelet effects.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Warm hands, light legs, better flow.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>health</category>
      <category>science</category>
      <category>beginners</category>
      <category>wellness</category>
    </item>
    <item>
      <title>Ginger for Sore Throat: 3 Mechanisms in 15 Minutes</title>
      <dc:creator>Me-Time Support</dc:creator>
      <pubDate>Fri, 29 May 2026 12:46:41 +0000</pubDate>
      <link>https://dev.to/metime_support_e00703a3b/ginger-for-sore-throat-3-mechanisms-in-15-minutes-15nh</link>
      <guid>https://dev.to/metime_support_e00703a3b/ginger-for-sore-throat-3-mechanisms-in-15-minutes-15nh</guid>
      <description>&lt;p&gt;A sore throat is inflammation + infection + pain. Ginger hits all three simultaneously, with noticeable relief in 15-20 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mechanism 1: Anti-Inflammatory
&lt;/h2&gt;

&lt;p&gt;COX-2 inhibition + NF-κB suppression → reduced prostaglandins and cytokines in the pharyngeal mucosa → less swelling, less redness, less pain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mechanism 2: Antimicrobial
&lt;/h2&gt;

&lt;p&gt;6-gingerol has documented activity against:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Streptococcus pyogenes&lt;/strong&gt; (bacterial tonsillitis)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Staphylococcus aureus&lt;/strong&gt; (ENT infections)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rhinovirus&lt;/strong&gt; (common cold)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Candida albicans&lt;/strong&gt; (oral thrush)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mechanism 3: Local Anesthetic
&lt;/h2&gt;

&lt;p&gt;Gingerol activates then desensitizes TRPV1 nociceptors on contact → warming sensation followed by pain reduction. This is why ginger "warms" the throat and provides immediate relief.&lt;/p&gt;

&lt;h2&gt;
  
  
  Protocol
&lt;/h2&gt;

&lt;p&gt;Hold an undiluted &lt;a href="https://inti-drink.com/pages/gingembre-mal-de-gorge-pharyngite-remede-naturel" rel="noopener noreferrer"&gt;INTI&lt;/a&gt; shot in your mouth for 5 seconds → direct contact with pharyngeal mucosa → all 3 mechanisms activate simultaneously. The turmeric adds independent anti-inflammatory + antimicrobial action.&lt;/p&gt;

&lt;p&gt;1.1g sugar — no fermentation, no feeding Candida.&lt;/p&gt;

&lt;p&gt;⚠️ See a doctor if sore throat persists &amp;gt;3 days or comes with high fever.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The best medicine sometimes just needs 5 seconds of contact.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>health</category>
      <category>science</category>
      <category>beginners</category>
      <category>wellness</category>
    </item>
    <item>
      <title>Ginger for Anxiety: How 6-Gingerol Modulates the HPA Axis</title>
      <dc:creator>Me-Time Support</dc:creator>
      <pubDate>Fri, 29 May 2026 12:40:45 +0000</pubDate>
      <link>https://dev.to/metime_support_e00703a3b/ginger-for-anxiety-how-6-gingerol-modulates-the-hpa-axis-1449</link>
      <guid>https://dev.to/metime_support_e00703a3b/ginger-for-anxiety-how-6-gingerol-modulates-the-hpa-axis-1449</guid>
      <description>&lt;p&gt;Chronic stress keeps cortisol elevated → anxiety, weight gain, immune suppression, insomnia. Ginger acts as an adaptogen, normalizing excessive cortisol without suppressing normal stress response.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Anti-Anxiety Mechanisms
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. HPA Axis Modulation
&lt;/h3&gt;

&lt;p&gt;6-gingerol normalizes hypothalamic-pituitary-adrenal response → reduced ACTH → less cortisol from adrenals. Adaptogenic: doesn't suppress cortisol, normalizes excess.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. GABAergic Effect
&lt;/h3&gt;

&lt;p&gt;Ginger potentiates GABA (main inhibitory neurotransmitter) → calming effect without sedation. Same pathway as benzodiazepines, but at physiological dose — no dependence.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Neuroinflammation Reduction
&lt;/h3&gt;

&lt;p&gt;Chronic stress activates NF-κB in the brain → neuroinflammation → anxiety. Ginger breaks this cycle: NF-κB ↓ → less amygdala reactivity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sugar CAUSES Anxiety
&lt;/h2&gt;

&lt;p&gt;Sugar → glycemic spike → reactive hypoglycemia → adrenergic response (adrenaline + cortisol) → anxiety symptoms. A 33g sugar ginger shot feeds the stress-sugar-stress cycle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://inti-drink.com/pages/gingembre-anxiete-stress-cortisol-adaptogene" rel="noopener noreferrer"&gt;INTI&lt;/a&gt; — ginger + curcumin (↑ serotonin + BDNF) with 1.1g sugar. Anti-anxiety without anxiety-causing sugar.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Your calming drink shouldn't spike your cortisol.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>health</category>
      <category>science</category>
      <category>beginners</category>
      <category>wellness</category>
    </item>
    <item>
      <title>Ginger as a Prebiotic: Selective Growth of Lactobacillus &amp; Bifidobacterium</title>
      <dc:creator>Me-Time Support</dc:creator>
      <pubDate>Fri, 29 May 2026 12:40:38 +0000</pubDate>
      <link>https://dev.to/metime_support_e00703a3b/ginger-as-a-prebiotic-selective-growth-of-lactobacillus-bifidobacterium-ca4</link>
      <guid>https://dev.to/metime_support_e00703a3b/ginger-as-a-prebiotic-selective-growth-of-lactobacillus-bifidobacterium-ca4</guid>
      <description>&lt;p&gt;Wang et al. (2019) showed ginger selectively promotes beneficial gut bacteria while inhibiting pathogens. That's the definition of a prebiotic.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Ginger Does to Your Gut
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Promotes:&lt;/strong&gt; Lactobacillus, Bifidobacterium → short-chain fatty acids (butyrate) → stronger gut barrier, better immunity, less inflammation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inhibits:&lt;/strong&gt; Clostridium perfringens, E. coli enterotoxigenic → less gas, less bloating, less intestinal inflammation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repairs:&lt;/strong&gt; NF-κB suppression + Nrf2 activation at the mucosal level → tighter junctions → less bacterial toxin (LPS) leaking into blood → less systemic inflammation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Turmeric Amplifier
&lt;/h2&gt;

&lt;p&gt;Curcumin independently increases microbiome diversity and reduces gut inflammation. &lt;a href="https://inti-drink.com/pages/gingembre-microbiote-intestinal-prebiotique-bacteries" rel="noopener noreferrer"&gt;INTI&lt;/a&gt; combines both with black pepper (2000% absorption).&lt;/p&gt;

&lt;h2&gt;
  
  
  Sugar: The Anti-Prebiotic
&lt;/h2&gt;

&lt;p&gt;Excess sugar feeds gas-producing bacteria (Clostridium, Klebsiella) at the expense of Lactobacillus. A ginger shot with 33g sugar/100ml worsens the dysbiosis it claims to fix.&lt;/p&gt;

&lt;p&gt;INTI: 1.1g sugar. The prebiotic effect works when you stop feeding the pathogens.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Your gut supplement shouldn't feed the problem.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>health</category>
      <category>science</category>
      <category>beginners</category>
      <category>wellness</category>
    </item>
    <item>
      <title>Ginger for IBS: 3 Mechanisms That Actually Help</title>
      <dc:creator>Me-Time Support</dc:creator>
      <pubDate>Fri, 29 May 2026 10:44:19 +0000</pubDate>
      <link>https://dev.to/metime_support_e00703a3b/ginger-for-ibs-3-mechanisms-that-actually-help-2k97</link>
      <guid>https://dev.to/metime_support_e00703a3b/ginger-for-ibs-3-mechanisms-that-actually-help-2k97</guid>
      <description>&lt;p&gt;IBS (Irritable Bowel Syndrome) affects 10-15% of the population. Ginger addresses three core mechanisms simultaneously — something most IBS medications don't do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mechanism 1: Motility Normalization
&lt;/h2&gt;

&lt;p&gt;Ginger is both prokinetic (speeds up slow transit) AND antispasmodic (calms excessive spasms). It modulates 5-HT₃/5-HT₄ receptors — the same targets as alosetron, an IBS drug.&lt;/p&gt;

&lt;p&gt;Gastric emptying +25% (Wu 2008) means food moves through at the right pace, reducing both constipation-dominant AND diarrhea-dominant IBS symptoms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mechanism 2: Mucosal Anti-Inflammation
&lt;/h2&gt;

&lt;p&gt;NF-κB suppression → reduced mast cell activation → less histamine and serotonin in the gut wall → reduced visceral hypersensitivity (the "amplified pain" of IBS).&lt;/p&gt;

&lt;h2&gt;
  
  
  Mechanism 3: Microbiome Modulation
&lt;/h2&gt;

&lt;p&gt;Wang 2019: ginger promotes Lactobacillus and Bifidobacterium while reducing gas-producing Clostridium perfringens. A more balanced microbiome = less gas, less bloating.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Sugar Trap for IBS
&lt;/h2&gt;

&lt;p&gt;Sugar is a known IBS trigger. It ferments in the colon, feeds gas-producing bacteria, and spikes insulin (disrupting motility). A ginger shot with 33g sugar/100ml is essentially a liquid FODMAP.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://inti-drink.com/pages/gingembre-intestin-irritable-sii-ibs-soulagement" rel="noopener noreferrer"&gt;INTI&lt;/a&gt; — 1.1g sugar. Prokinetic + anti-inflammatory + prebiotic. Without the fermentation fuel.&lt;/p&gt;

&lt;p&gt;⚠️ IBS requires medical diagnosis (Rome IV criteria). See a gastroenterologist.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Your gut health supplement shouldn't upset your gut.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>health</category>
      <category>science</category>
      <category>beginners</category>
      <category>wellness</category>
    </item>
    <item>
      <title>Why Your 'Healthy' Ginger Shot Has 3 More Sugar Than Coca-Cola</title>
      <dc:creator>Me-Time Support</dc:creator>
      <pubDate>Fri, 29 May 2026 10:44:13 +0000</pubDate>
      <link>https://dev.to/metime_support_e00703a3b/why-your-healthy-ginger-shot-has-3x-more-sugar-than-coca-cola-5dmd</link>
      <guid>https://dev.to/metime_support_e00703a3b/why-your-healthy-ginger-shot-has-3x-more-sugar-than-coca-cola-5dmd</guid>
      <description>&lt;p&gt;A popular ginger concentrate brand contains &lt;strong&gt;34g sugar per 100ml&lt;/strong&gt;. Coca-Cola contains 10.6g/100ml. That's a 3.2× ratio. These are the numbers from their own nutrition labels.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "It's a Concentrate" Defense
&lt;/h2&gt;

&lt;p&gt;Even diluted as recommended (20ml in 200ml water), one glass = 6.8g sugar = 1.7 sugar cubes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for Health Benefits
&lt;/h2&gt;

&lt;p&gt;Sugar systematically undermines every ginger benefit:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ginger Benefit&lt;/th&gt;
&lt;th&gt;Sugar's Counter-Effect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Anti-inflammatory (NF-κB ↓)&lt;/td&gt;
&lt;td&gt;Pro-inflammatory (NF-κB ↑)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Immune boost (NK cells ↑)&lt;/td&gt;
&lt;td&gt;Immune suppression (NK cells ↓ for 5h)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weight loss (thermogenesis)&lt;/td&gt;
&lt;td&gt;Weight gain (insulin → fat storage)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anti-aging (Nrf2 ↑)&lt;/td&gt;
&lt;td&gt;Aging (AGEs production)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gut health (probiotic)&lt;/td&gt;
&lt;td&gt;Gut damage (fermentation → gas)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Alternative
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://inti-drink.com/pages/best-ginger-shot-europe-low-sugar-organic-comparison" rel="noopener noreferrer"&gt;INTI&lt;/a&gt; — 1.1g sugar per 100ml. Organic ginger + turmeric + black pepper (2000% better curcumin absorption). Made in Belgium.&lt;/p&gt;

&lt;p&gt;When the sugar in your health drink undermines the health ingredient, you're paying for a paradox.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Always read the nutrition label. Especially on "health" products.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>health</category>
      <category>science</category>
      <category>beginners</category>
      <category>wellness</category>
    </item>
    <item>
      <title>Ginger for Energy Without Caffeine: The AMPK Mechanism</title>
      <dc:creator>Me-Time Support</dc:creator>
      <pubDate>Fri, 29 May 2026 10:39:24 +0000</pubDate>
      <link>https://dev.to/metime_support_e00703a3b/ginger-for-energy-without-caffeine-the-ampk-mechanism-32bc</link>
      <guid>https://dev.to/metime_support_e00703a3b/ginger-for-energy-without-caffeine-the-ampk-mechanism-32bc</guid>
      <description>&lt;p&gt;Tired of the caffeine crash cycle? Ginger boosts cellular energy through a completely different mechanism — one that doesn't create dependence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why You're Tired (The Real Reasons)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mitochondrial dysfunction&lt;/strong&gt; — fewer ATP-producing organelles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Oxidative stress&lt;/strong&gt; — ROS damage mitochondrial membranes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chronic inflammation&lt;/strong&gt; — NF-κB → "sickness behavior" → fatigue&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Insulin resistance&lt;/strong&gt; — glucose poorly utilized despite high blood levels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sugar crash cycle&lt;/strong&gt; — spike → insulin → hypoglycemia → fatigue&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ginger's 3 Energy Pathways
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. AMPK Activation → More Mitochondria
&lt;/h3&gt;

&lt;p&gt;6-gingerol activates AMPK → mitochondrial biogenesis → more "power plants" per cell → more ATP → more energy. This is a structural improvement, not a temporary stimulant.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Nrf2 → Protected Mitochondria
&lt;/h3&gt;

&lt;p&gt;Glutathione + SOD → ROS neutralized → existing mitochondria last longer and work better.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Thermogenesis → Metabolic Activation
&lt;/h3&gt;

&lt;p&gt;TRPV1 activation → warming sensation + metabolic upshift. Similar "wake-up" to coffee, but without caffeine, without nervous stimulation, without crash.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sugar: The Fake Energy
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Duration&lt;/th&gt;
&lt;th&gt;Crash?&lt;/th&gt;
&lt;th&gt;Dependency?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Caffeine&lt;/td&gt;
&lt;td&gt;3-5h&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;Sugar shot&lt;/td&gt;
&lt;td&gt;30 min&lt;/td&gt;
&lt;td&gt;Hard crash&lt;/td&gt;
&lt;td&gt;Glycemic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://inti-drink.com/pages/gingembre-energie-fatigue-chronique-vitalite" rel="noopener noreferrer"&gt;INTI&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Stable (AMPK)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;1.1g sugar. No caffeine. The energy comes from better mitochondria, not borrowed stimulation.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Real energy is cellular. Everything else is a loan with interest.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>health</category>
      <category>science</category>
      <category>beginners</category>
      <category>wellness</category>
    </item>
    <item>
      <title>Ginger for DOMS: -25% Muscle Soreness (Black 2010, Journal of Pain)</title>
      <dc:creator>Me-Time Support</dc:creator>
      <pubDate>Fri, 29 May 2026 10:39:18 +0000</pubDate>
      <link>https://dev.to/metime_support_e00703a3b/ginger-for-doms-25-muscle-soreness-black-2010-journal-of-pain-2c8k</link>
      <guid>https://dev.to/metime_support_e00703a3b/ginger-for-doms-25-muscle-soreness-black-2010-journal-of-pain-2c8k</guid>
      <description>&lt;p&gt;Black et al. (2010, Journal of Pain, 74 subjects) demonstrated that 2g daily ginger supplementation reduces DOMS (Delayed Onset Muscle Soreness) by 25% after eccentric exercise.&lt;/p&gt;

&lt;h2&gt;
  
  
  The DOMS Cascade
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Myofibrillar micro-tears → sarcomere Z-line damage&lt;/li&gt;
&lt;li&gt;Neutrophil infiltration → local inflammatory response&lt;/li&gt;
&lt;li&gt;PGE2 production → nociceptor sensitization&lt;/li&gt;
&lt;li&gt;Muscle edema → nerve ending compression&lt;/li&gt;
&lt;li&gt;Oxidative stress → membrane damage&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How Ginger Breaks the Cascade
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;COX-2 inhibition&lt;/strong&gt; → reduced PGE2 → less nociceptor sensitization → 25% less pain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nrf2 activation&lt;/strong&gt; → glutathione + SOD at the muscular level → ROS neutralized → less membrane damage → faster recovery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NF-κB suppression&lt;/strong&gt; → controlled inflammation (enough for repair, not enough for excessive pain).&lt;/p&gt;

&lt;h2&gt;
  
  
  The Turmeric Amplifier
&lt;/h2&gt;

&lt;p&gt;Curcumin (Nicol 2015) independently reduces DOMS and preserves post-exercise muscle strength. Black pepper increases curcumin absorption by 2000%.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://inti-drink.com/pages/gingembre-courbatures-recuperation-musculaire-sport" rel="noopener noreferrer"&gt;INTI&lt;/a&gt; combines all three — ginger + turmeric + black pepper — in one shot with 1.1g sugar. No insulin spike to inhibit growth hormone during the recovery window.&lt;/p&gt;

&lt;h2&gt;
  
  
  Protocol
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pre-workout: 1 shot 30 min before (preventive)&lt;/li&gt;
&lt;li&gt;Post-workout: 1 shot within 2h (recovery window)&lt;/li&gt;
&lt;li&gt;Rest days: 1 shot morning (maintain Nrf2)&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Your recovery drink shouldn't need recovery from its own sugar.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>health</category>
      <category>fitness</category>
      <category>beginners</category>
      <category>wellness</category>
    </item>
    <item>
      <title>Ginger for Bloating: Gastric Emptying +25% in 20 Minutes</title>
      <dc:creator>Me-Time Support</dc:creator>
      <pubDate>Fri, 29 May 2026 10:33:09 +0000</pubDate>
      <link>https://dev.to/metime_support_e00703a3b/ginger-for-bloating-gastric-emptying-25-in-20-minutes-17bg</link>
      <guid>https://dev.to/metime_support_e00703a3b/ginger-for-bloating-gastric-emptying-25-in-20-minutes-17bg</guid>
      <description>&lt;p&gt;Two RCTs (Wu 2008, Hu 2011) show 1.2g ginger accelerates gastric emptying by 25% and significantly reduces post-meal bloating. The mechanism: serotonin receptor stimulation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why You're Bloated
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Slow gastric emptying&lt;/strong&gt; → food sits too long → fermentation → gas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gut dysbiosis&lt;/strong&gt; → excess gas-producing bacteria&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visceral hypersensitivity&lt;/strong&gt; → amplified perception of distension&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Excess sugar&lt;/strong&gt; → colonic fermentation of fructose/sucrose&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How Ginger Fixes It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Prokinetic Effect (+25% Gastric Emptying)
&lt;/h3&gt;

&lt;p&gt;6-gingerol stimulates 5-HT₃/5-HT₄ receptors in the myenteric plexus → more frequent, coordinated peristaltic contractions → food leaves the stomach 25% faster.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Carminative (Anti-Gas)
&lt;/h3&gt;

&lt;p&gt;Gingerols relax the lower esophageal sphincter in a controlled way → trapped gas released → reduced intra-abdominal pressure within 15-20 minutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Microbiome Modulation
&lt;/h3&gt;

&lt;p&gt;Preclinical (Wang 2019): ginger promotes Lactobacillus and Bifidobacterium while inhibiting gas-producing Clostridium perfringens.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Sugar Trap
&lt;/h2&gt;

&lt;p&gt;A "digestive" shot with 33g sugar/100ml causes exactly what you're trying to fix. Sugar ferments in the colon → CO₂, H₂, CH₄ → the very gases causing your bloating.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://inti-drink.com/pages/gingembre-ballonnements-ventre-plat-digestion" rel="noopener noreferrer"&gt;INTI&lt;/a&gt; — 1.1g sugar. Prokinetic ginger without the fermentation fuel.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Your "digestive aid" shouldn't need digesting.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>health</category>
      <category>science</category>
      <category>beginners</category>
      <category>wellness</category>
    </item>
  </channel>
</rss>
