Technical Audit — April 22, 2026

AJStore.com — Site Health: POOR

Core Web Vitals assessment failed across all measured metrics. Mobile performance score is 26/100 and desktop is 31/100. The site is actively losing revenue due to performance-driven abandonment, particularly on mobile devices which represent the dominant traffic segment for Saudi eCommerce.

Platform: Magento PWA Studio Stack: React · Apollo GraphQL · Node.js Payments: Tabby · Tamara · Braintree 218 HTTP Requests · 38 MB (Mobile)
26
Mobile Score
Mobile LCP (CrUX P75)
4.9s
Good: <2.5s
Mobile INP (CrUX P75)
321ms
Good: <200ms
Mobile CLS (CrUX P75)
0.57
Good: <0.1
Total Page Weight (Mobile)
38 MB
Good: <1.6 MB
Top 5 Critical Issues Affecting Performance & Revenue
1
Catastrophic Image Payload — 33 MB Potential Savings on Mobile
Product images (1200×1200px) are served to thumbnails displayed at 150–263px. Banner images (3865×1907px) are served to containers at 613px wide. No WebP/AVIF conversion. No cache headers on backend.ajstore.com images. Single images such as dsc_243.png weigh 3,646 KiB. PageSpeed reports 33,060 KiB in image savings for mobile alone.
33,060 KiB savings detected
CRITICAL
Drives LCP to 4.9s — direct conversion loss
2
Render-Blocking JS Bundles — 11.7 Seconds Blocked on Mobile
client.b3c2fc1.js (278.6 KiB) blocks render for 6,810ms. vendors.4fb37fd.js (104.6 KiB) blocks for 4,190ms. runtime.7e4cc5b.js adds 700ms. Tamara widget (813 KiB) blocks for 10,210ms as render-blocking resource. Total first-party + Tamara render block: ~21.9 seconds on mobile, ~1.72 seconds on desktop.
11,700ms blocked (1st party)
CRITICAL
FCP=11.2s, LCP=31.5s on mobile Lighthouse
3
CLS Score 0.57 (Mobile CrUX) — Layout Instability at Scale
CrUX P75 CLS is 0.57 on mobile — 5.7× above the 0.1 threshold. Root cause: 15 banner and product images missing explicit width/height attributes, causing layout reflow on load. Footer element contributes a 0.096 shift score in the Lighthouse lab test. The viewport is locked with user-scalable=0 and maximum-scale=1, compounding the UX impact.
CLS = 0.57 (CrUX P75)
CRITICAL
Content shifts mid-scroll → high abandon rate
4
Main Thread Overloaded — 8.4–11.2 Seconds Occupied
Total main-thread work: 8.4s (mobile), 11.2s (desktop). Script evaluation alone consumes 5.7s (mobile) and 7.8s (desktop). 20 long tasks found; client.b3c2fc1.js alone causes tasks of 441ms, 355ms, 286ms. Google reCAPTCHA (gTpTIWhbK/recaptcha__en.js) contributes 598–1,152ms to main-thread work. The DOM contains 4,751–5,459 elements with a depth of 22–26 levels.
20 long tasks · 8.4s main-thread
CRITICAL
INP = 321ms → users experience lag on every tap
5
No Cache Policy on Backend Images — 35 MB Uncached Assets
All product and banner images from backend.ajstore.com have Cache TTL: None. PageSpeed reports 34,999 KiB in cacheable savings on mobile and 13,145 KiB on desktop. Static site assets (logo, payment icons) have only 37–55 minute TTLs rather than the recommended 1-year for fingerprinted assets. The Tamara widget (813 KiB) has only a 30-minute cache lifetime.
35 MB with no cache headers
HIGH
Every repeat visit re-downloads full payload
Lighthouse Performance Scores
Mobile26 / 100
Desktop31 / 100
Accessibility66 / 100
Best Practices65 / 100
SEO92 / 100
GTmetrix Structure76 / 100
CrUX Real-User Data (P75 · Mar 22–Apr 18 2026)
Performance Analysis
Data sources: PageSpeed Insights (Apr 22, 2026 · 08:30 GMT+3), GTmetrix (Apr 21, 2026 · Lighthouse 12.6.1 · Seattle), CrUX API (28-day P75)
Core Web Vitals — CrUX P75 (Real Users) vs Lighthouse Lab
Largest Contentful Paint (LCP)
📱 Mobile
4.9s
CrUX P75
🖥 Desktop
3.9s
CrUX P75
Good: <2.5s · Needs Improvement: 2.5–4s · Poor: >4s
FAIL Lighthouse: Mobile 31.5s / Desktop 4.6s
Interaction to Next Paint (INP)
📱 Mobile
321ms
CrUX P75
🖥 Desktop
151ms
CrUX P75
Good: <200ms · Needs Improvement: 200–500ms · Poor: >500ms
NEEDS IMPROVEMENT
Cumulative Layout Shift (CLS)
📱 Mobile
0.57
CrUX P75
🖥 Desktop
0.23
CrUX P75
Good: <0.1 · Needs Improvement: 0.1–0.25 · Poor: >0.25
FAIL (5.7× threshold)
Mobile vs Desktop — Lighthouse Metrics
Main-Thread Work Breakdown (Mobile — 8.4s)
Full Metric Detail
Metric Mobile (CrUX P75) Desktop (CrUX P75) Mobile (Lighthouse Lab) Desktop (Lighthouse Lab) Good Threshold Status
LCP 4.9s 3.9s 31.5s 4.6s <2.5s FAIL
INP 321ms 151ms TBT proxy: 1.79s TBT proxy: 3.47s <200ms NEEDS IMPROVEMENT
CLS 0.57 0.23 0.096 0.047 <0.1 FAIL
FCP 2.8s 1.9s 11.2s 2.0s <1.8s NEEDS IMPROVEMENT
TTFB 721ms 600ms 443ms 443ms <800ms PASS
Speed Index CrUX N/A 11.4s 4.5s <3.4s FAIL
Time to Interactive CrUX N/A GTmetrix: 8.8s N/A <3.8s FAIL
Fully Loaded CrUX N/A GTmetrix: 15.9s <3s FAIL
Total Requests 218 requests <50 FAIL
Total Page Weight (Mobile) 38,012 KiB uncompressed · 10.6 MB transferred (GTmetrix) <1.6 MB FAIL
LCP Breakdown (Mobile Lighthouse)

The LCP element is a banner image: SnaptecBanner/banner_image_mobile177….jpg

Time to First Byte
10ms
Target: <600ms
Resource Load Delay
2,050ms
Target: <200ms
Resource Load Duration
180ms
Target: <200ms
Element Render Delay
160ms
Target: <200ms

Root cause of 2,050ms load delay: render-blocking JavaScript (client.b3c2fc1.js, vendors.4fb37fd.js, Tamara widget) must complete before the browser can discover and request the LCP image. The image itself downloads in 180ms once requested — the delay is entirely caused by JS blocking.

Technical Issues
All findings directly supported by PageSpeed Insights, GTmetrix, and CrUX data collected April 21–22, 2026.
Image Optimization Issues
!
Oversized Product Images — 1200×1200px Served to 150–263px Thumbnails
All product card images (1200×1200px source) are displayed at 150px (mobile) and 240px (desktop) thumbnails. PageSpeed identifies 30+ images wasting 200–3,600 KiB each. Example: dsc_243.png is 3,646 KiB served to a 263×263px slot. Potential savings per image: 3,471 KiB.
Est. savings: 33,060 KiB
Critical
!
Banner Images Not Responsive — Up to 3865×1907px Source
banner_image1733225176.jpg is 3865×1907px (642 KiB) served to a container displayed at 637×314px on desktop. Multiple SnaptecBanner images are 1918×971px served to 637px-wide containers. No responsive srcset breakpoints implemented for banner images.
625 KiB wasted per banner
Critical
!
No WebP/AVIF Conversion — Legacy JPEG/PNG Formats
All product and banner images are served as JPEG or PNG. PageSpeed reports potential savings of 5.69 MB from next-gen format conversion. WebP typically achieves 25–35% size reduction vs JPEG at equivalent quality; AVIF achieves 50%+. The Magento backend has imgix-style auto query parameters (?auto=webp) present on URLs but output format is not actually converted.
5,690 KiB potential savings
Critical
!
No Image Caching — backend.ajstore.com Serves with Cache-Control: None
Every product image and banner from backend.ajstore.com has Cache TTL: None. This forces full re-download on every page visit and every browser session. PageSpeed reports 34,999 KiB in cacheable savings on mobile. Banner images also have no cache headers despite being static promotional assets.
35 MB uncached per visit
Critical
!
15 Images Missing Explicit Width/Height — CLS Contributor
Banner images served with classes="[object Object]" and no width/height attributes. This prevents browser from reserving space before images load, causing reflow and contributing to the 0.57 CLS score on mobile. GTmetrix flags "15 images found" for this issue.
15 affected images
High
!
2.33 MB in Offscreen/Deferred Images Not Lazy-Loaded
GTmetrix reports 2.33 MB in potential savings from deferring offscreen images. Several below-fold product images are loaded at page start. Product images do have loading="lazy" attributes per PageSpeed HTML snippets, but some above-fold images appear to be loading unnecessarily.
2,330 KiB potential savings
Medium-High
JavaScript Issues
!
Tamara Widget Render-Blocks for 10.2 Seconds (Mobile)
cdn.tamara.co/widget/product-widget.min.js (813 KiB) is a render-blocking resource taking 10,210ms to download on mobile. This is a BNPL widget (Buy Now Pay Later) — it should be deferred or loaded asynchronously. It contains 768 KiB of unused JavaScript. Main-thread time: 84ms (mobile), 98ms (desktop). Cache TTL is only 30 minutes.
813 KiB · 10,210ms block
Critical
!
client.b3c2fc1.js — 2,776ms CPU Evaluation on Mobile
The main application bundle (278.6 KiB transferred) takes 2,776ms total CPU time with 2,435ms in script evaluation. It generates 20+ long tasks: one task at 32,980ms start time runs for 441ms, another at 11,169ms runs for 355ms. This single file is the primary contributor to TBT. Unused JS savings: 116.5 KiB.
2,776ms CPU · 441ms worst task
Critical
!
1,617–1,727 KiB Unused JavaScript Loaded on Page Init
Total unused JS identified: 1,617 KiB (mobile) / 1,727 KiB (desktop). Key sources: Tamara widget 768 KiB unused of 811 KiB (94% waste), Google reCAPTCHA 355.6 KiB unused of 723 KiB (49% waste), Google Tag Manager 113.5 KiB unused of 324 KiB (35% waste), TikTok 62.5 KiB unused of 120 KiB (52% waste).
1,617 KiB unused JS
Critical
!
Google reCAPTCHA Loaded on Homepage — 1,152ms Main-Thread Time
recaptcha__en.js (725 KiB) is loaded on the homepage contributing 1,152ms main-thread time (desktop) / 948ms (mobile). reCAPTCHA is only needed on forms (checkout, login, registration). Loading it on the homepage is incorrect and wastes resources. 5 separate long tasks from this script are recorded in the task timeline.
1,152ms main-thread wasted
High
!
52 Critical Request Chains — Blocks FCP and LCP
GTmetrix identifies 52 critical request chains. These chain dependencies mean resource B cannot start downloading until resource A completes, serially delaying the critical rendering path. 4 Google Fonts CSS requests (Barlow, Almarai, Noto Sans Arabic, Manrope) are loaded synchronously in the critical path, adding 3,000ms on mobile.
52 chains found
Medium-High
!
Legacy JavaScript Polyfills Shipped to Modern Browsers
Babel transforms for classes, regenerator, and spread are being shipped to modern browsers in fbevents.js (12.5 KiB wasted) and TikTok's analytics script (9.8 KiB wasted). First-party client.b3c2fc1.js also includes babel/plugin-transform-classes, babel/plugin-transform-regenerator, and babel/plugin-transform-spread (2.4 KiB identified). Total potential savings: 25–26 KiB.
26 KiB legacy polyfills
Medium
CSS, Fonts & Rendering Issues
!
57 KiB Unused CSS — reCAPTCHA Stylesheet Dominates
Total unused CSS: 57 KiB. Google CDN's recaptcha styles__ltr.css contributes 39.8 KiB wasted of 41.5 KiB (96% waste). The site's own global tokens CSS (24.8 KiB) wastes 17.1–17.4 KiB. Additionally, slick-theme.min.css and slick.min.css from Cloudflare CDN load as render-blocking resources (750ms each on mobile).
57 KiB unused CSS
Medium
!
31 Web Fonts Loaded — No font-display Strategy
GTmetrix identifies 31 web fonts loading simultaneously. Google Fonts (Barlow, Almarai, Noto Sans Arabic, Manrope, Space Grotesk, and more) add 197 KiB to the total payload. The site's own sallaicons.ttf (268 KiB) is loaded without font-display: swap, causing FOIT. PageSpeed flags this with 60ms FCP impact. No preload hints are applied to critical fonts.
31 fonts · 268 KiB TTF
Medium
!
CSS Not Minified — 5.74 KiB Potential Savings
The global Venia CSS tokens file (24.8 KiB) is not minified, with 5.74 KiB in potential savings. This suggests the production build may not be running the full optimization pipeline for CSS. The file content begins with readable comments ("/* global tokens */ :root {") confirming an unminified production asset.
5.74 KiB unminified CSS
Medium
!
user-scalable=no Set in Viewport Meta — Accessibility Violation
The page includes <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0">. This disables pinch-to-zoom for users with low vision, violating WCAG 1.4.4 (Level AA). This also prevents mobile users from zooming into product images, damaging conversion for detail-oriented shoppers.
Confirmed in PageSpeed HTML
Medium
DOM Complexity & Third-Party Script Impact
!
DOM Size: 5,459 Elements · Depth 26 (Desktop) / 4,751 · Depth 22 (Mobile)
GTmetrix flags "5,382 elements" on desktop; PageSpeed reports 5,459 (desktop) and 4,751 (mobile). Recommended maximum: 1,400 elements. The largest child count in a single parent is 54–63 children in product sliders (div.slick-track with 8476px width). This increases style recalculation time and contributes to layout reflow cost during scroll.
5,459 DOM elements
Medium-High
!
Third-Party Scripts Blocking Main Thread for 553ms+
Key third-party blocking times (mobile): Google CDN (reCAPTCHA) 948ms, Google Tag Manager 460ms (2 containers: GTM-M7J8LW2, GTM-K4H46JXV), Facebook 182ms, TikTok 133ms, Snapchat 326ms, Clarity 116ms. GTmetrix reports 68 resources without CDN. The Tabby widget (checkout.tabby.ai, 64 KiB) loads synchronously as a render-blocking resource for 3,760ms on mobile.
553ms+ 3rd-party main-thread
High
!
Tabby Widget (64 KiB) Render-Blocks for 3,760ms on Mobile
checkout.tabby.ai/tabby-promo.js (64.3 KiB) is listed as a render-blocking resource taking 3,760ms on mobile. It has 36.6 KiB of unused JavaScript and only a 1-hour cache lifetime. Like Tamara, this BNPL widget should only be visible/active on product pages, not on the homepage's initial render.
3,760ms render block
High
!
cdn.tabby.ai Fonts Blocked (17+ Font Files Returning 0 Bytes)
The GTmetrix waterfall shows 17 requests to cdn.tabby.ai for font files (RadialBold, Radial-Black, IBMPlexSans variants) all returning status "(blocked)" with 0 bytes. This indicates the Tabby widget is attempting to load its own fonts from cdn.tabby.ai but CORS or CSP is blocking these requests. These blocked requests contribute to request chain delays.
17 blocked font requests
Medium
UX & Accessibility Issues (Supporting Evidence from Audit)
!
Multiple Buttons Without Accessible Names (Slider Navigation)
productBlock-preSlider-2Go and productBlock-nextSlider-10q buttons, tabProductBlock-prevButton, columnBanner-preSlider buttons — all lack aria-label or visible text. These appear across multiple product blocks. Screen reader users cannot navigate the carousels.
Confirmed in PageSpeed HTML
Medium
!
Banner Links Have No Discernible Name
Column banner links (columnBanner-bannerImageLink-2KE) and slider links to /men/yashmagh.html, /men/ghuta.html, /men/thobe/formal-thobe.html etc. contain only image children with no alt text or link text. These navigation links are invisible to screen readers. Confirmed across 15+ instances on both desktop and mobile.
15+ affected banner links
Medium
!
aria-hidden=true Containers with Focusable Children (Slick Slider)
div.slick-slide elements with aria-hidden="true" contain focusable anchor tags. Screen reader users will navigate to hidden content. This is a known Slick Slider accessibility issue that requires custom aria management.
Confirmed in PageSpeed HTML
Medium
Third-Party Script Transfer Size (Mobile)
Prioritized Action Plan
Every action is traceable to a specific audit finding. Expected impact is based on measured savings data from PageSpeed Insights and GTmetrix.
High Impact — Address Immediately
# Problem Evidence Fix Expected Impact
H1 Tamara & Tabby widgets render-blocking
Tamara: 813 KiB, 10,210ms block (mobile). Tabby: 64 KiB, 3,760ms block.
PageSpeed: render-blocking resources audit, 11,700ms + 3,760ms savings Defer both scripts with async/defer or dynamic import. Inject widget after DOMContentLoaded only on pages where BNPL is applicable. Use Intersection Observer to load Tabby only when cart/product widget enters viewport. LCP improvement: ~2–3s. FCP improvement: ~1.5s. TBT reduction: ~200–300ms.
H2 Product images massively oversized
1200×1200px source → 150–263px display. 33,060 KiB identified waste on mobile.
PageSpeed: improve image delivery, 33,060 KiB est. savings (mobile) Configure Magento's image resize tool or imgix to generate thumbnails at correct dimensions (320×320 max for product cards). Enable WebP output for all product images. Set srcset for 150w, 240w, 320w breakpoints. Verify ?auto=webp is actually converting output. Page weight reduction: ~25–30 MB on mobile. LCP improvement: 1.5–2s from reduced download time.
H3 No cache headers on backend.ajstore.com images
Cache-Control: None on all product/banner images. 34,999 KiB cacheable savings.
PageSpeed: use efficient cache lifetimes, 34,999 KiB (mobile), 13,145 KiB (desktop) Set Cache-Control: public, max-age=31536000, immutable for fingerprinted product images. Set Cache-Control: public, max-age=86400 for banner images. Serve images from a CDN (Cloudflare or AWS CloudFront). Also fix 37-minute TTL on logo, payment icons — these should be 1 year. Repeat visit load time reduction: 20–35 MB eliminated. TTFB improvement for repeat users: ~400ms+.
H4 Banner images oversized, no responsive srcset
3865×1907px source banner to 637px display. 625+ KiB wasted per banner.
PageSpeed: improve image delivery, 625 KiB per banner × multiple banners Create responsive banner variants: mobile (613px), tablet (960px), desktop (1280px). Implement <picture> with srcset and media queries. Convert to WebP format. Target <100 KiB per banner at display size. Reduce banner payload by ~80%. LCP element (a banner image) load time reduction: estimated 1–2s.
H5 client.b3c2fc1.js — oversized bundle, long tasks
278 KiB · 2,776ms CPU · 20 long tasks · 116 KiB unused.
PageSpeed: reduce JS execution time, 7.8s (desktop) / 5.8s (mobile) Implement React.lazy() for route-level code splitting. Use dynamic imports for below-fold product sections. Tree-shake unused exports. Analyze bundle with webpack-bundle-analyzer. Remove Babel polyfills for ES6+ features not needed by modern browsers (update browserslist config). TBT reduction: estimated 500–800ms. INP improvement: expected to reach <200ms target.
H6 Mobile CLS 0.57 from missing image dimensions
15 images without width/height. Footer shifts 0.096. Viewport locks user-scalable=0.
CrUX: CLS 0.57. PageSpeed: 15 images without explicit width/height. Viewport meta confirmed. Add explicit width and height to all <img> tags. Fix banner image components to pass integer dimensions, not "[object Object]". Remove user-scalable=0 and maximum-scale=1 from viewport meta. Reserve space for dynamically injected content (payment widgets, banners). CLS target: <0.1. Estimated improvement: 0.57 → <0.1 upon fixing all image dimensions and viewport.
Medium Impact — Address Within 30 Days
# Problem Evidence Fix Expected Impact
M1 reCAPTCHA loaded on homepage
725 KiB · 1,152ms main-thread on desktop · homepage never needs CAPTCHA.
PageSpeed: 3rd party audit — Google CDN 770 KiB, 656ms main thread (desktop) Remove reCAPTCHA from global script injection. Load conditionally on pages with forms (checkout, login, register, contact). Use reCAPTCHA v3 with lazy loading via grecaptcha.execute() called only on form interaction. Main-thread reduction: ~1,152ms (desktop). TBT improvement: ~200–400ms.
M2 4 Google Fonts families in critical render path
Barlow, Almarai, Noto Sans Arabic, Manrope — 4 × 750ms each on mobile.
PageSpeed: render-blocking resources — Google Fonts 3,000ms (mobile) Preload critical fonts only (likely Almarai for Arabic content). Convert to self-hosted fonts with font-display: swap. Remove non-critical font families or load with JavaScript after DOMContentLoaded. Consolidate to ≤2 font families. FCP improvement: ~750ms–1.5s from removing font render blocking.
M3 DOM size 5,459 elements
3.9× over recommended 1,400. Slick slider has 54–63 children per container.
PageSpeed/GTmetrix: DOM size 5,382–5,459 elements, depth 22–26 Virtualize product carousel lists (only render visible items). Audit Slick slider implementation — remove offscreen slides from DOM. Lazy-render below-fold product blocks. Audit Magento PWA CMS component tree for redundant wrapper divs. Style recalculation time reduction. INP improvement. Memory usage reduction (currently 630 MB per GTmetrix).
M4 Two GTM containers firing on every page
GTM-M7J8LW2 (active Apr 2026) + GTM-K4H46JXV (active to Aug 2025, still firing). Combined 500 KiB, 639ms main thread.
PageSpeed: Google Tag Manager 500 KiB, 639ms main thread (desktop) Audit GTM-K4H46JXV — BuiltWith shows it was last detected Aug 2025. Verify if it is still needed. Consolidate all tags into one container. Audit remaining tags: TikTok, Snapchat, Facebook, Twitter, Clarity can share one container. Remove or defer marketing pixels until user scroll/interaction (consent + performance). ~200–300ms main-thread savings from removing redundant container.
M5 57 KiB unused CSS (incl. reCAPTCHA stylesheet)
styles__ltr.css: 39.8 KiB wasted of 41.5 KiB. Global tokens: 17 KiB wasted.
PageSpeed: reduce unused CSS, 57 KiB est. savings Remove reCAPTCHA CSS from homepage — it will be eliminated when reCAPTCHA is removed (M1). Use PurgeCSS to remove unused rules from the Venia global tokens file. Split global CSS into critical (inline in <head>) and non-critical (load async). FCP improvement from reduced critical CSS. Network savings: ~57 KiB.
M6 sallaicons.ttf (268 KiB) without font-display strategy
Icon font served as TTF. No WOFF2 conversion. No font-display:swap.
PageSpeed: font-display audit — sallaicons.ttf, 60ms FCP savings Convert sallaicons.ttf to WOFF2 (typically 30–40% smaller). Add font-display: swap to prevent FOIT. Consider replacing icon font with inline SVG for above-fold icons, which eliminates network dependency entirely. FCP improvement: ~60ms. Page weight: ~100 KiB saved after WOFF2 conversion.
Lower Impact — Address Within 60 Days
#ProblemFixExpected Impact
L1 Minify CSS — 5.74 KiB savings Ensure production build pipeline runs CSS minifier (cssnano). Confirm the Venia theme global CSS is processed by the build's PostCSS pipeline. 5.74 KiB reduction. Confirms correct production build.
L2 Preconnect to backend.ajstore.com origin Only preconnect to backend.ajstore.com is present. Add <link rel="preconnect"> for cdn.tamara.co, checkout.tabby.ai, fonts.googleapis.com to eliminate DNS+TCP+TLS setup time on first requests. 201ms FCP/LCP savings per GTmetrix audit.
L3 cdn.tabby.ai fonts returning blocked/0 bytes Investigate CSP policy blocking cdn.tabby.ai font requests. Either add cdn.tabby.ai to font-src CSP directive or coordinate with Tabby to self-host fonts. Eliminates 17 failed network requests from waterfall.
L4 Accessibility: button names, link names, aria-hidden Add aria-label="Previous" / aria-label="Next" to all slider navigation buttons. Add aria-label to all banner link elements. Implement Slick slider accessible aria management (aria-current, aria-live). Remove user-scalable=0 from viewport (also fixes WCAG 1.4.4). Accessibility score improvement. Reduces legal risk. No performance impact.
L5 Missing CDN for 68 resources GTmetrix reports 68 resources served without CDN. Serve all static assets (JS bundles, fonts, icons) through Cloudflare CDN or similar. Backend.ajstore.com product images should be served through a CDN edge with cache headers enabled. Estimated latency improvement for non-Saudi origin requests. Reduced TTFB on repeat visits.
⚡ Quick Wins — High Impact / Low Effort
🖼
Add width/height to all <img> tags
One-line fix per image component. Eliminates layout shift from unsized images. CLS improvement from 0.57 → potentially <0.2 immediately.
~2 hours dev
🚫
Remove user-scalable=0 from viewport meta
Single line change in HTML template. Fixes WCAG 1.4.4 violation. Restores pinch-to-zoom for users. No visual impact.
~30 min dev
Add async/defer to Tamara and Tabby scripts
Change script tag from synchronous to async. Removes 13,970ms of render-blocking on mobile. Biggest single performance win with minimal code change risk.
~1 hour dev
🗄️
Set Cache-Control headers on backend.ajstore.com
Server/CDN configuration change. No code changes. Saves 35 MB per repeat visit. Largest single caching opportunity in the audit.
~2 hours ops
🔤
Add font-display: swap to sallaicons.ttf + Google Fonts
CSS change only. Eliminates FOIT (invisible text flash) and reduces FCP by ~60ms. Add &display=swap to all Google Fonts URL parameters.
~1 hour dev
🔴
Remove reCAPTCHA from homepage
Conditional script loading change. Saves 725 KiB and 1,152ms main-thread on desktop. The homepage has no form that requires bot protection.
~2 hours dev
Technology Profile
Source: BuiltWith Detailed Technology Profile (April 22, 2026) + PageSpeed/GTmetrix waterfall analysis
Active Technology Stack
eCommerce Platform
Magento PWA Studio Apollo GraphQL Express.js
Payments
Tabby (BNPL) Tamara (BNPL) Braintree CardinalCommerce Mada
Analytics & Tracking
Hotjar Google Analytics 4 GTM (2 containers) New Relic (inactive since Sep 2025)
Marketing Pixels
Facebook Pixel TikTok Pixel Snapchat Pixel Twitter/X Pixel Microsoft Clarity
CDN
Cloudflare JS (CDN JS) GStatic (Google) backend.ajstore.com (no CDN detected)
Authentication & Security
Google Identity Platform reCAPTCHA v3
Third-Party Script Load Comparison (Desktop)

Waterfall Summary (GTmetrix — Seattle)
Total Requests218
Total Page Size (Transferred)10.6 MB
Total Uncompressed17.8 MB
JS (Transferred)3.01 MB
Images (Transferred)6.97 MB
CPU Usage45.1%
Memory Usage630 MB
Fully Loaded Time15.9s
Onload Time5.9s
Historical Technology Changes (Notable)
  • Oct 2022 — Migrated from Martjack (enterprise hosted eCommerce) to Magento PWA Studio. Apollo GraphQL introduced.
  • Nov 2022 — Hotjar, GTM-M7J8LW2 activated. Current active tracking container.
  • Jul 2024 — TikTok, Facebook, Twitter, and Snapchat conversion pixels added (via GTM-K4H46JXV). Multiple marketing pixels added simultaneously — likely contributing to current 3rd-party bloat.
  • Aug 2024 — Google GA4 property ID G-VDCFN6SS6Q added. Google Analytics Enhanced Ecommerce (UA) deprecated Jun 2022.
  • Sep 2025 — New Relic APM monitoring stopped. No APM solution currently confirmed active.
  • Mar 2025 — GTM-K4H46JXV last BuiltWith detection (Aug 2025). Still appearing in PageSpeed waterfall as of Apr 2026 — may be stale container firing.