V3 Spreadsheet Checklist · Internal Use

MAG Lifestyle Development — Audit Checklist V3

www.mag.global · 28 August 2026 · vl-web-audit v2.1 · 36 checks across 6 categories

Fail
Warning
OK
Missing
#CategoryCheck ItemStatusFinding / EvidenceScreenshotRecommendationOwnerPriorityEffort
A — SEO / On-Page
1SEOhreflang tags
EN/AR alternates + x-default
FailBilingual EN/AR site; zero hreflang link tags in source
📷Add Screenshot
Add hreflang="en", hreflang="ar-ae", x-default to all page templatesDeveloper/SEOP1Small
2SEOCanonical tag
Present on all pages
FailNo <link rel="canonical"> detected on homepage or any page
📷Add Screenshot
Add canonical to every page template in Concrete5DeveloperP1Small
3SEOStructured data
Organization + listing schema
FailNo JSON-LD schema detected; no Organization or RealEstateListing markup
📷Add Screenshot
Add Organization schema to homepage; RealEstateListing to project pagesDeveloper/SEOP1Medium
4SEOTwitter description HTML
No malformed attributes
Failcontent="...art of living well>" — unclosed quote in meta attribute
📷Add Screenshot
Fix closing quote in CMS Twitter meta fieldDeveloperP1Quick Win
5SEOrobots.txt
CMS paths blocked
OKComprehensive Disallow rules for /concrete/, /config/, /models/ etc.
📷Add Screenshot
Add Sitemap: directiveDevOpsP2Quick Win
6SEOSitemap in robots.txt
Sitemap: directive present
Failsitemap.xml exists at /sitemap.xml but no Sitemap: directive in robots.txt
📷Add Screenshot
Add: Sitemap: https://mag.global/sitemap.xmlDevOpsP2Quick Win
7SEOSitemap content
All pages covered
OK164 URLs — projects, news, AR versions all covered
📷Add Screenshot
Monitor in GSCSEO
8SEOMeta description length
Under 160 chars
Warning205 chars — will be truncated in Google SERPs
📷Add Screenshot
Trim to 150–160 chars in CMS meta settingsSEO/ContentP2Quick Win
9SEOOG tags
Present with og:locale
WarningOG tags present but no og:locale tag
📷Add Screenshot
Add og:locale="en_AE" to English pagesDeveloper/SEOP2Quick Win
10SEOTwitter card type
summary_large_image
OKtwitter:card="summary_large_image" present
📷Add Screenshot
No action — fix description bug (row 4)
B — Security
11SecurityCMS version
Current, supported release
FailConcrete5 5.6.3.5b1 (~2014) — end-of-life with multiple known CVEs
📷Add Screenshot
Migrate to Concrete CMS 9.x on staging; deploy post-testingDeveloperP0Large
12SecurityHTTPS enforced
HTTP 301 to HTTPS
OKHTTP returns 301 to HTTPS — enforced correctly
📷Add Screenshot
No action needed
13SecurityHSTS with preload
max-age, includeSubDomains, preload
OKStrict-Transport-Security: max-age=581536000; includeSubDomains; preload — excellent
📷Add Screenshot
No action — strongest possible configuration
14SecurityX-Frame-Options
SAMEORIGIN
OKx-frame-options: SAMEORIGIN — clickjacking protection active
📷Add Screenshot
No action needed
15SecurityX-Content-Type-Options
nosniff
OKx-content-type-options: nosniff — MIME sniffing blocked
📷Add Screenshot
No action needed
16SecurityContent-Security-Policy
CSP header present
FailNo CSP header — XSS unmitigated at header level
📷Add Screenshot
Add CSP in report-only mode via nginx config; harden progressivelyDevOpsP1Small
17SecuritySession cookie flags
Secure + SameSite=Lax
FailCONCRETE5 cookie: HttpOnly only — missing Secure and SameSite flags
📷Add Screenshot
Add Secure; SameSite=Lax in Concrete5 session configurationDeveloperP1Small
18Securityx-powered-by header
Platform not disclosed
Failx-powered-by: PleskLin — hosting platform disclosed
📷Add Screenshot
Suppress via nginx: more_clear_headers 'X-Powered-By'DevOpsP1Quick Win
19SecurityX-XSS-Protection
Deprecated — remove
Warningx-xss-protection: 1; mode=block — deprecated in modern browsers
📷Add Screenshot
Remove once CSP is implementedDevOpsP3Quick Win
C — Privacy / Legal
20PrivacyCookie consent banner
GDPR compliant
FailNo consent banner detected. CONCRETE5 session cookie set on first load without consent.
📷Add Screenshot
Implement CookieYes or OneTrust with Google Consent Mode v2DeveloperP0Medium
21PrivacyGoogle Consent Mode v2
Configured with EU defaults
FailNot implemented — no consent mode configuration detected
📷Add Screenshot
Implement with all categories denied by default for EU regionsDeveloperP0Medium
22PrivacyPrivacy Policy page
Linked from footer
OKPrivacy policy linked at /privacy-policy/ from footer
📷Add Screenshot
No action needed
23PrivacyTerms page
Linked from footer
OKTerms linked at /terms/ from footer
📷Add Screenshot
No action needed
D — Accessibility
24Access.user-scalable=no
WCAG 1.4.4 Level AA
FailViewport meta: user-scalable=no — prevents pinch-to-zoom for low vision users
📷Add Screenshot
Remove user-scalable=no from viewport meta tagDeveloperP1Quick Win
25Access.HTML lang attribute
Standard lang="en"
Warninglang="en-us" — non-standard; screen readers may misinterpret
📷Add Screenshot
Change to lang="en" in CMS page settingsDeveloperP2Quick Win
26Access.Skip navigation link
WCAG 2.1 SC 2.4.1
MissingNot detected in source — not confirmed
📷Add Screenshot
Add visually-hidden skip link as first focusable element in headerDeveloperP1Small
27Access.Full WCAG 2.2 AA audit
Colour contrast, keyboard, SR
MissingNo external accessibility audit performed — compliance unknown
📷Add Screenshot
Commission WCAG 2.2 AA audit with axe DevTools and screen reader testingDeveloper/DesignerP1Medium
E — Performance
28Perf.HSTS with preload
Strong HSTS config
OKmax-age=581536000; includeSubDomains; preload — excellent configuration
📷Add Screenshot
No action needed — maintain preload registration
29Perf.CDN deployed
Edge caching active
Failserver: nginx — no CDN headers detected; all requests hit Plesk origin
📷Add Screenshot
Add Cloudflare CDN in front of nginx originDevOpsP1Medium
30Perf.Cache-Control headers
Modern max-age values
Failexpires: Thu, 19 Nov 1981 08:52:00 GMT — 45-year-old expiry; pragma: no-cache
📷Add Screenshot
Configure modern Cache-Control headers via nginx or CloudflareDevOpsP1Small
31Perf.reCAPTCHA on forms
Spam protection active
OKGoogle reCAPTCHA API loaded on all pages — form spam protection active
📷Add Screenshot
No action needed
32Perf.Language switch performance
No full-page reload
FailLanguage switch uses /tools/locale?_lcl=ar_AE — triggers full-page reload
📷Add Screenshot
Consider persistent cookie or AJAX locale switchingDeveloperP3Medium
F — Technology / CI/CD
33TechCMS platform version
Supported, current release
FailConcrete5 5.6.3.5b1 — end-of-life (~2014); current is Concrete CMS 9.x
📷Add Screenshot
Plan migration to Concrete CMS 9.x — begin immediately on stagingDeveloperP0Large
34CodeIE conditional comments
Removed from templates
Fail<!--[if lte IE 8]> and <!--[if IE 9]> conditionals still in page source
📷Add Screenshot
Remove IE conditional comments from theme templatesDeveloperP2Small
35CodeCMS internals in JS
Minimise exposed variables
FailCCM_DISPATCHER_FILENAME, CCM_BASE_URL, CCM_SITE, CCM_TOOLS_PATH in every page
📷Add Screenshot
Move to server-side config where possible; minimise client-side exposureDeveloperP2Small
36TechStaging environment
Separate from production
MissingNo staging environment identified — required for safe CMS upgrade
📷Add Screenshot
Set up staging server for CMS 9.x migration testingDevOpsP2Medium