Yuvaraj Vodiboina
All work
(01)Case studyChrome extension + website

ShopGrade

An audit for any Shopify storefront. It turns what it finds on a public store into a prioritized list of fixes, with no admin access needed.

Platform
Chrome extension + website
When
May to Sep 2026
Role
Sole developer
Version
4.9.1, 13 Oct 2026
Price
First report free
Status
Live
(01)

How it works

4 steps
  1. 01

    Add it to Chrome

    It stays dormant until you open a public Shopify store and confirm the audit.

    Open larger: Audit any Shopify store in one click
  2. 02

    Open any Shopify storefront

    No app to install, no store login and no admin access. It reads the public page and never writes.

    Open larger: A graded score, and the read behind it
  3. 03

    Get a graded audit

    An overall score and verdict, six health scores, crawl and SEO checks, and the evidence behind every finding.

    Open larger: Sorted into what to fix first
  4. 04

    Share, export or pitch

    Send a secure live link, export a PDF, or build a client deck in your own branding.

    Open larger: Rescan, compare, then share or export
(02)

The problem

Auditing a Shopify store usually means jumping between five tools: PageSpeed for speed, an SEO crawler, a spreadsheet for trust signals, screenshots for the client, and a doc to explain it all. By the time it’s done, the findings are scattered, and the client still asks the only question that matters: what should we fix first?

(03)

What I built

A Manifest V3 Chrome extension that audits any public Shopify storefront, plus a product website. The report covers performance, mobile usability, trust, buying friction and SEO. Every finding shows its evidence and a suggested next step, so merchants and agencies can decide what to fix first.

Behind it is a backend of my own: it decides who can generate what, writes the optional AI review, and serves the reports people share.

Hard partKeeping what the page shows separate from measurements and AI-written suggestions, so merchants know what is fact.

(04)

What it does

  1. 01

    A weighted score, in plain words

    Speed, findability, trust, mobile, conversion and technical foundation, each scored on its own, with a verdict.

  2. 02

    A roadmap sorted by impact

    Every fix comes with the evidence, the target and the next concrete step.

  3. 03

    Ten crawl and SEO checks

    Read from the live page and robots.txt, each with the measured value and what to change.

  4. 04

    What a shopper really sees

    The conversion and trust signals a first-time visitor meets before entering card details.

  5. 05

    White-label reports and decks

    An agency’s logo, colour and call to action on the report, the PDF and the client slides.

  6. 06

    An optional AI review

    On paid plans: Lighthouse lab data, field data when there is some, and an AI read of the homepage and a product page.

(05)

Under the hood

  1. 01Page scriptPerformance observers and store signals, in the page’s own world

    To see what a store loads, the performance observers have to run in the page’s own JavaScript world. Nothing else of the extension does.

  2. 02Content scriptA bridge, in its isolated world

    Everything else stays in the extension’s isolated content script. It passes the page’s signals on, and the two worlds only talk through messages.

  3. 03Service workerKeeps each tab’s audit, and scores it

    It keeps each tab’s audit in session storage and scores it as the page loads, flushing new readings about every 300 ms, so the popup’s score moves live.

  4. 04Backend functionsGate every report, and serve the shared ones

    One function checks the plan, credits, a verified email and the free-trial limits before any report. Only the payment provider’s webhook grants a plan, and shared reports are rendered at report.shopgrade.in and last 15 days.

  • Two worlds in one page

    To see what a store loads, the performance observers have to run in the page’s own JavaScript world. Everything else stays in the extension’s isolated content script, and the two only talk through messages.

  • The server decides what costs money

    The extension can’t be trusted with plans, quotas or credits, so a single function gates every report. It checks the plan, credits, a verified email and the free-trial limits.

  • One place grants a plan

    Only the payment provider’s webhook can grant or take away a paid plan or report credits.

  • Shared reports that expire

    Reports people share are rendered on the server at report.shopgrade.in. A link lasts 15 days, and its owner can delete it at any time.

(06)

In the code

A credit is spent all at once, or not at all

One transaction spends the credit, grants the report’s AI and CRO units and settles the claim. A crash or a race can’t take a credit without giving what it paid for, and if the last credit has already gone, nothing changes.

functions/start-generation/src/main.js, lines 1129 to 1162, cut short

start-generation/src/main.js
// Spends one purchased credit. Declared as a closure so both the "plan
// exhausted" and "lost the last slot to a race" paths reuse it. Paid plans
// keep their white-label; free/credit-only reports are watermarked.
async function spendCreditAndReply() {
  // Fast ATOMIC path: spend the credit, grant the per-kind AI + CRO units,
  // and finalize the claim in ONE transaction. Either all four land or none
  // do, so a process killed mid-spend can never consume a credit without its
  // entitlements or leave a half-provisioned pack. The atomic decrement
  // floors at 0, so if a concurrent spend already drained the last credit the
  // whole transaction fails - and since it rolled back cleanly, we simply
  // fall through to the sequential path, which re-runs the atomic decrement
  // and correctly tells "no credit left" apart from a real spend.
  {
    const claimNote = JSON.stringify({ fp: fingerprint, tier, wm: !paid, uc: true });
    const spend = await runTx(async (txId) => {
      await db.decrementDocumentAttribute({
        databaseId: DB, collectionId: PROFILES, documentId: meterId,
        attribute: 'creditsBalance', value: 1, min: 0, transactionId: txId,
      });
      await db.incrementDocumentAttribute({
        databaseId: DB, collectionId: PROFILES, documentId: meterId,
        attribute: 'creditAiBalance', value: 1, transactionId: txId,
      });
      await db.incrementDocumentAttribute({
        databaseId: DB, collectionId: PROFILES, documentId: meterId,
        attribute: 'creditCroBalance', value: 1, transactionId: txId,
      });
      if (ownedClaim) {
        await db.updateDocument({
          databaseId: DB, collectionId: USAGE, documentId: ownedClaim.$id,
          data: { used: 1, updatedAt: Date.now(), note: claimNote }, transactionId: txId,
        });
      }
    });
        // …
(07)

Decisions

  1. 01

    Start from the public storefront, not a Shopify admin app

    Anyone can audit any store without installing anything on it.

    Trade-offA public page can’t see orders, traffic or real conversion data.

  2. 02

    Keep observations, measurements and AI-written findings visibly separate

    So you can tell what was seen on the page from what is interpretation.

    Trade-offAutomated checks can point to a problem, but can’t prove what fixing it is worth.

(08)

Timeline

  1. Work begins

    An audit for public Shopify storefronts, as a Chrome extension.

  2. Its own repository

    The extension, its report and dashboard, on an Appwrite backend; shopgrade.in followed three days later.

  3. Live on the Chrome Web Store

    An overall grade with a plain-language verdict, scores for speed, trust, mobile, conversion and search, and a to-do list sorted by impact.

  4. 4.7

    Agencies can turn any audit into a client deck with their own logo, colours and name, and reports stay private until you open a share link.

  5. 4.9

    The popup, the card it shows on a storefront, the site and the dashboard move from dark to light, and every page now agrees on what each plan includes.

  6. 4.9.1

    The current Chrome Web Store release, with new store screenshots from the light build.

(09)

Built with

TypeScriptReactViteManifest V3Appwrite FunctionsPaddlePageSpeed Insights

Your dataIt stays dormant until you agree to an audit, and never reads form values, passwords or private messages. Audits run in your browser and their data stays there by default. ShopGrade’s servers check your account and report quota, and only receive audit data when you share a report or turn on AI review, monitoring or the agency workspace.

(10)

Every screen

8 from the store listing and shopgrade.in
  1. Open larger: Audit any Shopify store in one click

    01Audit any Shopify store in one click

  2. Open larger: A graded score, and the read behind it

    02A graded score, and the read behind it

  3. Open larger: What shoppers see, and what to change

    03What shoppers see, and what to change

  4. Open larger: Sorted into what to fix first

    04Sorted into what to fix first

  5. Open larger: Rescan, compare, then share or export

    05Rescan, compare, then share or export

  6. Open larger: Client deck: the verdict slide

    06Client deck: the verdict slide

  7. Open larger: Client deck: a priority fix with evidence

    07Client deck: a priority fix with evidence

  8. Open larger: Client deck: what the audit captured

    08Client deck: what the audit captured

Next02 of 16Android SecureVault
An encrypted vault behind a calculator that really works. Type your code and press equals, and a separate vault password or your fingerprint opens it.Read the case study