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.
A one-click audit for any Shopify store.
ShopGrade audits any public Shopify storefront from your browser and turns what it finds into a graded, prioritised report that an agency can hand straight to a client.
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 is done, the findings are scattered and the client still asks the only question that matters: what should we fix first?
Before
With ShopGrade
Keeping what the page shows separate from measurements and AI-written suggestions, so merchants know what is fact.
How it works
From installing it to the result you are after.







Under the hood
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.
Performance 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.
A 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.
Keeps 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.
Gate 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.
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 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.
Only the payment provider’s webhook can grant or take away a paid plan or report credits.
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.
// 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,
});
}
});
// …Decisions
Each decision lists the reason for it and what it gave up.
Why
Anyone can audit any store without installing anything on it.
Trade-off
A public page can’t see orders, traffic or real conversion data.
Why
So you can tell what was seen on the page from what is interpretation.
Trade-off
Automated checks can point to a problem, but can’t prove what fixing it is worth.
Screens
Features
Speed, findability, trust, mobile, conversion and technical foundation, each scored on its own.
Every fix comes with the evidence, the target and the next concrete step.
Read from the live page and robots.txt, each with the measured value and what to change.
Conversion and trust signals a first-time visitor meets before entering card details.
Your logo, brand colour and call to action on the report, the PDF and the client slides.
On paid plans: Lighthouse lab data, field data when available, and an AI read of the homepage and a product page.
Your data
ShopGrade stays dormant until you consent. It never reads form values, passwords or private messages. Audits run in your browser and their data stays there by default. ShopGrade 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.
No. ShopGrade reads the public storefront only. There is no app to install, no store login and no admin access, and it never writes anything to the store.
Your first report is free. Paid plans add the optional AI review, with Lighthouse lab data, field data when it is available, and an AI read of the homepage and a product page.
Yes. Your logo, brand colour and call to action appear on the shareable report, the PDF export and the client presentation deck.
Nothing until you consent. It stays dormant until you open a public Shopify store and confirm the audit, and it never reads form values, passwords or private messages.
ShopGrade is built for Shopify storefronts. On other sites it stays dormant.
Milestones
An audit for public Shopify storefronts, as a Chrome extension.
The extension, its report and dashboard, on an Appwrite backend; shopgrade.in followed three days later.
An overall grade with a plain-language verdict, scores for speed, trust, mobile, conversion and search, and a to-do list sorted by impact.
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.
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.
The current Chrome Web Store release, with new store screenshots from the light build.
The popup and the card on the storefront move to a new light design, and every surface now agrees on what each plan includes.
Agencies can turn any audit into a presentation deck with their own branding, ready for a client meeting.
Open any Shopify store, click once, and see what is slowing it down and where it is losing shoppers.
What began in May as a fix for a real annoyance, checking one Shopify store with five different tools, moves into its own project.
Related reading
For businesses
Websites, Shopify stores, Chrome extensions and Android apps, designed and engineered with the same care as my own products.
Booking new projects
I read every message myself and reply within a day or two with honest next steps.
Your message is on its way. I’ll reply to within a day or two.