What does a deep Meta Ads (Facebook/Instagram) audit of an online store by UPLIFY look like?
A real (anonymized) senior audit of a Meta (Facebook/Instagram) ad account by UPLIFY: INTERIM status, measurement gate, 16 findings, action plan. Prepared by the AI operator Nestor AI; a manager approves it.
Comprehensive audit of an online store website.
A real audit of a real UPLIFY client — fully anonymized. The niche, brands, domain and all IDs are masked; the entire methodology, journey structure and factual observations are preserved unchanged. An independent senior audit of UX / SEO / CRO / visibility, where every finding is reproducible: query → page → artifact → metric. Note the BROWSER-ONLY status — that is honesty, not a shortcoming: we do not pass off a risk estimate as proven revenue loss.
The audit in 90 seconds.
- Forced registration kills the cart: there is no guest checkout — to place an order you must create an account + confirm email. This is a standalone revenue-risk item (Baymard: ~70% cart abandonment).
- Shipping cost is hidden until the checkout step: Nova Poshta / Ukrposhta appear only after the city is entered — a classic "surprise cost" drop-off.
- Faceted navigation clutters the index: filter combinations (?color=&price=) are indexed without canonical/noindex → thousands of duplicates eat crawl budget.
- Product JSON-LD is missing on the PDP → it lowers eligibility for rich snippets and machine extraction of price / availability / brand for Google and AI; full Shopping-readiness can only be confirmed by the feed in GMC (T2). Visibility 45/100.
- INP on filters and add-to-cart >200 ms on mobile — interaction lag on the hottest actions.
- Enable guest checkout — offer an account AFTER the purchase.
- Close faceted URLs off from indexing (canonical + robots).
- Add Product/Offer JSON-LD with price+availability on the PDP.
- Conversion: remove checkout friction — the biggest T1 lever.
- Visibility: a clean index + schema → Google/AI understand the products.
- Speed: INP under the 200 ms threshold on mobile.
- No GA4 access → the real cart-abandonment % is not proven, only friction-risk.
- No GSC → we estimate indexing via site: + SerpApi, not a coverage report.
- No GMC/admin → feed↔admin parity is not verified (that is T2).
- All journey templates covered: Home / Search / Category / PDP / Cart / Checkout / Login / Returns + 12 stratified PDPs + 12 search queries.
- Lighthouse median ×3 per template · 3 competitors + 1 marketplace (Rozetka/Prom).
- Independent validation: PASS (gpt-5.2). Performance conclusions are honestly flagged as risk, not proven loss.
Can you trust this audit?
Honesty question #1: we have no access to GA4 / GSC / GMC / admin. So every conclusion about checkout and revenue is friction + visibility risk (directional), not a proven loss of money. We audit what is observable from the public site + a live browser + SerpApi. While access is closed, the report honestly carries the T1 (browser-only) scope.
| Check | State | What it means |
|---|---|---|
| Public site + journey | OBSERVED | All templates walked in a live browser — UX/checkout/search reproduced |
| Structure & schema (rendered DOM) | OBSERVED | JSON-LD, canonical, robots, sitemap checked in the rendered DOM (not curl) |
| Real cart-abandonment % (GA4) | NO ACCESS | We see the friction but not its price in UAH → friction-risk, not proven loss (T2) |
| Index coverage (GSC) | PROXY | Only site: + SerpApi — a rough estimate, not Google's coverage report |
| Feed ↔ admin parity (GMC) | BLOCKER | Without Merchant Center / admin item-level disapprovals we cannot reconcile — that is T2 |
The store's state at a glance.
Main conclusion (directional): the store has a healthy foundation (HTTPS, responsive, a working catalog), but it systematically leaks in two places: friction on the path to purchase and product invisibility to Google and AI. The biggest levers are guest checkout, shipping transparency and Product schema; all three are cheap to implement and critical in impact. The Horoshop platform imposes constraints (some fixes have to be flagged as "requires customization").
Forced registration
P0There is no guest checkout — placing an order requires an account + email confirmation. Forced registration is one of the strongest sources of cart friction. A standalone revenue-risk item (Baymard ~70% abandonment).
Hidden shipping
P1The Nova Poshta / Ukrposhta cost appears only after the city is entered at the checkout step — a "surprise cost". No payment methods are visible before commit.
Invisibility in Google/AI
P1Product JSON-LD is missing, the faceted index is bloated, the categories are thin — this lowers eligibility for rich snippets and the machine extraction of price/availability/brand for Google and AI. Full Shopping-readiness can only be confirmed by the feed in GMC (T2). Visibility 45/100.
Six layers where the store leaks.
The 55/100 composite is a rubric score (T1, browser-only) — a weighted average of six layers at T1 weights (Journey 25 · Visibility 25 · Mobile 15 · Trust&Compliance 15 · Search&Merch 10 · Measurement 10). Below is each layer's score, followed by its key findings + metrics.
- No guest checkout — forced registration + email confirmation before payment (JCK-09).
- Shipping/payment hidden until the checkout step — a "surprise cost" on Nova Poshta (JCK-05, JCK-06).
- Checkout asks for superfluous fields; on a phone error it wipes the input (JCK-10, JCK-13).
- Out-of-stock PDP — a dead 200 with no "notify me"/alternatives (SRCH-12).
- Checkout fields: 9 (baseline ≤3; 7+ → −25-50%).
- Steps to a visible shipping cost: 4.
- Sticky add-to-cart on mobile: none.
- Promo field: present, but with no live recalculation.
- INP >200 ms on filters and add-to-cart — lag on the hottest actions (MOB-03).
- CLS from banners/slider on the home page — layout jumps on load (MOB-02).
- Images without WebP/AVIF, partial lazy-load (MOB-09).
- Filter tap-targets <44 px and crowded (MOB-07).
- Mobile LCP: 3.4 s (threshold 2.5 s).
- CLS: 0.21 (threshold 0.1).
- INP (filter): ~260 ms (threshold 200).
- Lab, not CrUX — directional, since the site is too small for field data.
- Zero-results — a dead end: "nothing found" with no suggestions/popular items (SRCH-03).
- Search doesn't handle transliteration or keyboard layout (iphone/айфон) (SRCH-02).
- Out-of-stock items are not hidden in results (SRCH-12).
- Breadcrumbs exist visually, but without BreadcrumbList schema (SRCH-11).
- Queries out of 12 with relevant results: 7.
- Zero-result scenarios: 3 dead ends.
- Clicks to a key category: 2-3 (ok).
- Facets: AJAX, no reload (a plus).
- Product JSON-LD missing on the PDP — Google/AI don't see price/availability/brand (VIS-10).
- Faceted index bloated: ?-combinations without canonical/noindex (SRCH-08, VIS-05).
- Thin categories — a bare grid with no unique intro (SRCH-09, VIS-17).
- AI bots partially blocked in robots (GPTBot/ClaudeBot/PerplexityBot) (VIS-AI-01).
- Brand absent from Google KG / Wikidata (VIS-AI-06).
- PDPs with valid Product schema: 0 of 12.
- Duplicate title/desc: yes (facets + pagination).
- AI Overview for brand+category: absent.
- HTTPS/certificate: ok (VIS-09 pass).
- PDP reviews without photos or dates — weak authenticity signals (TRU-04).
- Returns/warranty — only in the footer, not on the PDP/cart (TRU-03, JCK-19).
- Cookie banner is present, but opt-in is pre-selected (TRU-07).
- Privacy/Terms, contacts, About — present (TRU-01, TRU-02, TRU-09 pass).
- Trust pages reachable: yes.
- Reviews with photos: 0%.
- Checkout keyboard navigation: partial (TRU-13).
- WHOIS/domain: stable, no anomalies (TRU-12).
- GA4/GTM tag loads, the dataLayer is populated (MEA-01, MEA-02 pass).
- begin_checkout doesn't fire when checkout starts — a hole in the funnel (MEA-05).
- Meta Pixel is present; add_to_cart duplicates (twice) (MEA-08, MEA-09).
- Consent Mode v2 doesn't gate tags before consent (MEA-07).
- We see that an event fires in the browser — not that the data is correct in GA4.
- view_item / purchase — present in the network.
- Revenue reconciliation GA4↔admin — that is T2.
- PII in event querystrings: none detected (MEA-10 pass).
23 findings — each with evidence.
Each finding = layer + observation (query → page → artifact) + severity. Below is the full table with a severity filter. Roadmap buckets (§7): P0/P1 → Fix this week/month · P2 → Test/validate · P3 → Backlog.
| # | Layer | Finding (observation) | Sev. |
|---|---|---|---|
| JCK-09 | Journey | No guest checkout — placing an order requires creating an account + email confirmation before payment. | P0 |
| JCK-05 | Journey | The shipping cost (Nova Poshta/Ukrposhta) is hidden until the city is entered at the checkout step — a "surprise cost". | P1 |
| JCK-06 | Journey | Payment methods (card/LiqPay/mono/COD) are not shown as icons before committing to checkout. | P1 |
| JCK-13 | Journey | On a phone error the form wipes the input; the error copy is generic ("invalid field"), not fixable. | P1 |
| JCK-10 | Journey | Checkout asks for 9 fields, some non-essential (baseline ≤3 fields). External checkout research links superfluous fields to noticeably lower completion; this store's specific drop was NOT measured here (T1). | P2 |
| JCK-19 | Journey | Returns/warranty are unreachable from the cart/checkout — only in the footer (regret-aversion). | P2 |
| VIS-10 | Visibility | Product JSON-LD is missing on all 12 checked PDPs — it lowers eligibility for product rich snippets and machine extraction (price/availability/brand) for Google and AI; full Shopping-readiness can only be confirmed by the feed in GMC — T2. | P1 |
| SRCH-08 | Visibility | Faceted URLs (?color=&price=) are indexed without canonical/noindex/disallow — index-bloat risk (faceted URLs without canonical/noindex/disallow); the scale can only be confirmed in GSC — T2. | P1 |
| VIS-05 | Visibility | Canonical is not self-referencing on pagination/facets — duplicate title/description in the results. | P1 |
| SRCH-09 | Visibility | Category pages are thin — a bare grid with no unique intro copy/merchandising. | P2 |
| VIS-11 | Visibility | BreadcrumbList + Organization/WebSite schema are missing (rendered-DOM check). | P2 |
| VIS-AI-06 | Visibility | The brand is absent from Google Knowledge Graph / Wikidata — AI cannot verify the entity. | P2 |
| VIS-AI-01 | Visibility | AI bots (GPTBot/ClaudeBot/PerplexityBot) are partially blocked in robots.txt — a silent killer of AI citeability. | P3 |
| MOB-03 | Mobile | INP >200 ms on applying filters and add-to-cart (median ~260 ms, mobile browser session, median of 3 runs) — lag on hot actions. | P1 |
| MOB-02 | Mobile | CLS 0.21 (mobile lab, median of 3 runs) from the banner/slider on the home page — the layout jumps on load (threshold 0.1). | P2 |
| MOB-09 | Mobile | Images without WebP/AVIF, partial lazy-load, no responsive srcset — mobile LCP 3.4 s (lab; not field CrUX). | P2 |
| MOB-07 | Mobile | Filter checkbox tap-targets <44 px and crowded on mobile. | P3 |
| SRCH-03 | Search | Zero-results — a dead end: "nothing found" with no suggestions/popular items/correction. | P2 |
| SRCH-02 | Search | Internal search doesn't handle transliteration or keyboard layout (iphone/айфон, layout typos). | P2 |
| SRCH-12 | Search | Out-of-stock items are not hidden/demoted in results and categories. | P3 |
| MEA-05 | Measurement | begin_checkout doesn't fire when checkout starts (network/dataLayer) — a hole in the event funnel. | P1 |
| MEA-09 | Measurement | add_to_cart duplicates (fires twice) — two containers/a double tag; risk of double-counting. | P2 |
| TRU-04 | Trust | PDP reviews without photos or dates — weak authenticity signals. | P2 |
Cause-tag: JCK-05 (hidden shipping) + SRCH-08 (facets) = platform-template (typical Horoshop behavior — the fix is flagged "requires customization"); VIS-10 (no Product schema), JCK-09 (no guest checkout) = merchant-specific (store decisions/settings); MEA-09 (double add_to_cart) = third-party (pixel and GTM conflict).
Where hot demand can't find the product.
| Search query (of 12) | Type | Result | Verdict |
|---|---|---|---|
| exact product name | exact | relevant | STRONG ok |
| brand (in Cyrillic) | brand | relevant | ok |
| iphone (in Latin) | translit | 0 results | DROP-OFF no transliteration |
| keyboard-layout typo | layout | 0 results | DROP-OFF dead end |
| category query | category | relevant | ok |
| typo / misspelling | typo | 0 results | DROP-OFF no correction |
| Visibility check | State | Details |
|---|---|---|
| Product JSON-LD on the PDP | FAIL | 0 of 12 PDPs — no price/availability/brand for Google Shopping and AI |
| Faceted indexing | FAIL | ?-combinations are indexed; no canonical/noindex → bloat |
| Thin categories | PARTIAL | A bare grid with no intro copy on most |
| robots / sitemap | PASS | sitemap.xml present, key pages not disallowed |
| HTTPS / basic canonical | PASS | HTTPS valid; PDP canonical is self-ref |
| AI bots + llms.txt | FAIL | GPTBot/ClaudeBot partially disallowed; /llms.txt 404 |
Pattern: the site serves a user who already knows the exact name well, but it loses "near-matches" (transliteration, keyboard layout, typo) — and is invisible to machines (Google Shopping, AI Overviews) due to missing structured data. These are two different leaks of the same demand.
Where the drop-off actually is.
Without GA4 we don't have real step-to-step % — so we show the observed friction at each step (what makes the transition harder) and explicitly flag where the risk is greatest. This is a directional map, not a measured funnel.
| Journey step | Observed friction | Risk rating |
|---|---|---|
| PDP → add to cart | Works; mini-cart confirmation is present, but there is no sticky button on mobile. | LOW |
| Cart → review | Editing quantity/removing with live recalculation — ok | LOW |
| Cart → start checkout | Forced registration + email confirmation; no guest | TOP RISK |
| Checkout → shipping details | The Nova Poshta cost appears here for the first time — a "surprise cost" | HIGH |
| Shipping → payment | Payment methods are shown only here; 9 fields; input wiped on error | MEDIUM |
The two biggest friction points are forced registration (entry into checkout) and hidden shipping (the details step). Both hit at the moment of highest purchase intent. The begin_checkout event doesn't fire here (MEA-05) — so even in T2 this part of the funnel will be blind until the tracking is fixed.
Three findings turnkey.
The §4 methodology format: Problem → Evidence → Recommendation → Acceptance criteria. Ready to hand to a developer. Platform constraints are flagged.
1 · Guest checkout
JCK-09 · P0 · checkout · merchant2 · Faceted navigation: canonical/robots
SRCH-08 · P1 · category · platform3 · Product schema on the PDP
VIS-10 · P0 · PDP · merchantRemove friction first, then visibility.
Four buckets by rubric priority (severity × scope × confidence × effort). No "+X% conversion" promises — only directional mechanics and benchmark bands.
Fix this week (P0/P1)
Enable guest checkout (JCK-09); show the shipping cost + payment methods before commit (JCK-05/06); add Product JSON-LD on the PDP (VIS-10); fix begin_checkout (MEA-05). The biggest T1 lever — checkout friction + baseline visibility.
Fix this month
Close faceted indexing with canonical+robots (SRCH-08, VIS-05); reduce checkout fields and preserve input on error (JCK-10/13); bring filter INP under 200 ms (MOB-03); remove the banner CLS (MOB-02); remove the duplicate add_to_cart (MEA-09).
Test & validate (P2)
A unique intro on thin categories (SRCH-09); zero-results with suggestions + transliteration/layout (SRCH-03/02); reviews with photos and dates (TRU-04); returns/warranty on the PDP and near the CTA (JCK-19). Validate on a sample of templates.
Backlog (P3) + T2 upsell
Open AI bots in robots (VIS-AI-01); hide out-of-stock in results (SRCH-12); filter tap-targets (MOB-07). Next: grant GA4/GSC/GMC access → T2 will prove the real revenue-leakage and feed-parity.
Monitoring 24/7 — without a request.
An audit is a snapshot. After that, the store lives under our platform's daily watch: the system checks the site's key layers on its own and surfaces failures to the manager before they eat into sales.
Checkout and friction
Guest checkout disappeared · forced registration came back · shipping/payment got hidden until commit · form fields grew · begin_checkout stopped firing.
Visibility and schema
Product JSON-LD disappeared from the PDP · facets are back in the index · canonical broke · llms.txt/robots blocked the AI bots · the brand dropped out of AI Overviews.
Speed and measurement
INP/CLS went over the threshold after a theme release · add_to_cart started duplicating · Consent Mode stopped gating · the GA4 tag went silent on a key template.
Coverage + validation.
| What | Coverage (sampling rule) |
|---|---|
| Journey templates | all: Home · Search · Category · PDP · Cart · Checkout · Login/Register · Returns/Shipping/Payment |
| Product pages (PDP) | 12 stratified: 4 bestsellers · 4 regular in-stock · 2 promo · 2 variant-heavy/out-of-stock |
| Internal search | 12 fixed queries: exact · partial · SKU · brand · category · uk · ru · translit · layout · typo · zero-result · attribute |
| Speed | Lighthouse median ×3 per template (Home/Category/PDP/Cart/Checkout) — lab, not CrUX |
| Competitors | 3 direct + 1 marketplace benchmark (Rozetka/Prom) |
| Findings classification | journey (6) · visibility (7) · mobile (4) · search (3) · measurement (2) · trust (1) = 23, across 6 layers |
| Store Health (T1, browser-only · rubric) | 55/100 = Journey 50 · Mobile 55 · Search 60 · Visibility 45 · Trust 70 · Measurement 65 (T1 weights) |
Independent validation (a second AI model, gpt-5.2): PASS with remarks — coverage 88 · depth 82 · rigor 80 · client-safety 90. Performance and revenue conclusions remain directional (friction + visibility risk) until GA4/GSC/GMC access is granted — and this is flagged on every relevant finding, not in fine print. JSON-LD was checked in the rendered DOM (web_fetch strips <script>); site: is only an indexing probe, not a score in itself.
How this audit was made.
The report was prepared by Nestor AI — our AI operator in UPLIFY OS: senior-level analysis using our own ecommerce website audit methodology, with independent validation. Note the T1 (browser-only) scope: without GA4/GSC/GMC access we deliberately do not pass off a risk estimate as proven revenue loss — every finding is honestly flagged as friction + visibility risk, and that is the honesty trust is built on. Every proposed change is confirmed by a manager — nothing is applied automatically, every change is reversible and logged.