<?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: Ankit Prajapati</title>
    <description>The latest articles on DEV Community by Ankit Prajapati (@ankitprajapatiseo).</description>
    <link>https://dev.to/ankitprajapatiseo</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%2F4205363%2Fd1cfcde5-869d-4dc5-a881-d7cd9915701b.png</url>
      <title>DEV Community: Ankit Prajapati</title>
      <link>https://dev.to/ankitprajapatiseo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ankitprajapatiseo"/>
    <language>en</language>
    <item>
      <title>Can a crawler see your product data without JavaScript? A 10-minute check for Shopify stores</title>
      <dc:creator>Ankit Prajapati</dc:creator>
      <pubDate>Sat, 31 Oct 2026 13:38:17 +0000</pubDate>
      <link>https://dev.to/ankitprajapatiseo/can-a-crawler-see-your-product-data-without-javascript-a-10-minute-check-for-shopify-stores-a55</link>
      <guid>https://dev.to/ankitprajapatiseo/can-a-crawler-see-your-product-data-without-javascript-a-10-minute-check-for-shopify-stores-a55</guid>
      <description>&lt;p&gt;When I audit eCommerce stores, one of the first things I do is look at a product page the way a crawler that doesn't run JavaScript sees it. It takes about ten minutes, and it often explains why a store with great reviews shows no stars anywhere in search or AI answers.&lt;/p&gt;

&lt;p&gt;Why this matters: Google recommends Product markup in the initial HTML, and Merchant Center says the markup can't be generated by JavaScript after the page loads. A 2024 study by Vercel and MERJ also found that the major AI crawlers they measured, including OpenAI's, did not render JavaScript. So whatever your server returns in the first response is all those bots get.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Fetch the raw HTML
&lt;/h3&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;"https://your-store.com/products/your-product"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; pdp.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Pull out every JSON-LD block
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 - &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;PY&lt;/span&gt;&lt;span class="sh"&gt;'
import json, re
html = open("pdp.html", encoding="utf-8").read()
blocks = re.findall(r'&amp;lt;script[^&amp;gt;]*application/ld&lt;/span&gt;&lt;span class="se"&gt;\+&lt;/span&gt;&lt;span class="sh"&gt;json[^&amp;gt;]*&amp;gt;(.*?)&amp;lt;/script&amp;gt;', html, re.S)
print(f"{len(blocks)} JSON-LD block(s) found")
for b in blocks:
    try:
        data = json.loads(b)
    except json.JSONDecodeError:
        print("Invalid JSON-LD block"); continue
    items = data if isinstance(data, list) else [data]
    for item in items:
        if item.get("@type") in ("Product", "ProductGroup"):
            offers = item.get("offers", {})
            offers = offers[0] if isinstance(offers, list) else offers
            print("name:        ", item.get("name"))
            print("gtin:        ", item.get("gtin") or item.get("gtin13") or item.get("gtin12"))
            print("sku:         ", item.get("sku"))
            print("brand:       ", (item.get("brand") or {}).get("name"))
            print("price:       ", offers.get("price"), offers.get("priceCurrency"))
            print("availability:", offers.get("availability"))
            print("rating:      ", item.get("aggregateRating"))
&lt;/span&gt;&lt;span class="no"&gt;PY
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Read the output like an auditor
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;0 blocks, or no Product type:&lt;/strong&gt; your Product data is either missing or injected by JavaScript. On Shopify, render it in Liquid inside the theme instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gtin is None:&lt;/strong&gt; very common. Put real GS1 barcodes in Shopify's Barcode field for each variant. Don't invent values.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;price looks like "₹1,299/-":&lt;/strong&gt; it should be a plain number like &lt;code&gt;1299.00&lt;/code&gt;, with &lt;code&gt;priceCurrency&lt;/code&gt; set separately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;availability is always InStock:&lt;/strong&gt; check a sold-out variant. Many themes hard-code it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;rating is None but the page shows stars:&lt;/strong&gt; your review app loads stars client-side. Look for a server-side or theme-level schema setting in the app.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 4: Compare with what the shopper sees
&lt;/h3&gt;

&lt;p&gt;Open the page in a browser and compare the visible price with the JSON-LD price, then with the same item in Merchant Center. If the three don't match, Google can disapprove the product, and repeated mismatches can put the account at risk.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Repeat for a variant URL
&lt;/h3&gt;

&lt;p&gt;Load &lt;code&gt;?variant=&amp;lt;id&amp;gt;&lt;/code&gt; and run the script again. Price, SKU and GTIN should change with the variant. If they don't, your markup is describing one product with several prices.&lt;/p&gt;

&lt;p&gt;I wrote up the full product page checklist, covering reviews, descriptions, images and feeds as well as the markup, for D2C store owners here: &lt;a href="https://consultantankit.com/blog/product-page-seo-checklist/" rel="noopener noreferrer"&gt;Product Page SEO for Google and AI Shopping&lt;/a&gt;. This post is the developer half of it.&lt;/p&gt;

&lt;p&gt;If you run this on your own store, I'd like to hear which check fails most often.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>shopify</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Measuring AI Search Visibility Like a Developer: GA4 Segments, Prompt Suites and Tracker APIs</title>
      <dc:creator>Ankit Prajapati</dc:creator>
      <pubDate>Sat, 24 Oct 2026 19:25:58 +0000</pubDate>
      <link>https://dev.to/ankitprajapatiseo/measuring-ai-search-visibility-like-a-developer-ga4-segments-prompt-suites-and-tracker-apis-3lhd</link>
      <guid>https://dev.to/ankitprajapatiseo/measuring-ai-search-visibility-like-a-developer-ga4-segments-prompt-suites-and-tracker-apis-3lhd</guid>
      <description>&lt;p&gt;If you build or maintain sites for clients, sooner or later someone asks: "Are we showing up in ChatGPT?" Here's a lightweight, data-first way to answer that, plus what to look for if you want the numbers in your own dashboards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Segment AI referral traffic in GA4
&lt;/h2&gt;

&lt;p&gt;AI trackers report mentions, but they don't report visits. Visits live in GA4. Create a custom segment or exploration that filters session source on AI assistant referrers such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chat.openai.com
perplexity.ai
gemini.google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save it as "AI referral traffic" and watch the trend month over month. It's free, and it gives you the outcome metric that sits alongside any mention data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Build a prompt set like a test suite
&lt;/h2&gt;

&lt;p&gt;Treat prompts like test cases. Write 15 to 25 conversational prompts in three groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Direct comparison&lt;/strong&gt;: "X vs Y for small teams"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Category recommendation&lt;/strong&gt;: "best X for agencies"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Problem-based&lt;/strong&gt;: "how do I fix X"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run them against ChatGPT, Gemini, Perplexity and Google AI Overviews or AI Mode. AI output varies between runs, so a single run is noisy. Repeat on a schedule and compare rates, not one-off results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: If you buy a tracker, check the data path first
&lt;/h2&gt;

&lt;p&gt;For developers, export and API matter more than the dashboard. From the tools I compared:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Need&lt;/th&gt;
&lt;th&gt;Options&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Full API + CSV/JSON export&lt;/td&gt;
&lt;td&gt;Profound (Enterprise)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API + CSV at a low price&lt;/td&gt;
&lt;td&gt;LLMrefs ($79/month, 500 prompts)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API on a lightweight tool&lt;/td&gt;
&lt;td&gt;AmIOnAI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSV only&lt;/td&gt;
&lt;td&gt;Semrush (10 CSV exports a day)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Also ask how the tool collects data, whether through live APIs or simulated browser sessions, because that affects how closely it matches what real users see.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Validate before trusting
&lt;/h2&gt;

&lt;p&gt;Run 5 to 10 prompts manually, then run the same prompts in two trial tools. If a tool disagrees with your manual results on most prompts, don't pipe its data anywhere.&lt;/p&gt;

&lt;p&gt;I've written up the full comparison, including engine coverage and prompt limits for each tool, in &lt;a href="https://consultantankit.com/blog/top-llm-visibility-trackers/" rel="noopener noreferrer"&gt;my guide to AI visibility trackers with API and export options&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written by Ankit Prajapati, SEO &amp;amp; GEO consultant.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seoanalyticswebdevai</category>
    </item>
  </channel>
</rss>
