How Magic Square Fixed Core Web Vitals in 14 Days and Lifted Organic Traffic
Web3 app discovery platform with LCP at 2.8s and INP at 380ms (both red). Wallet SDK eager-loaded on every page. IPFS images uncached. The fix was tactical, surgical and fast.
Client context
Magic Square is a Web3 app store and discovery platform. Users browse curated dApps across DeFi, NFT, gaming and infrastructure categories, with security ratings, audit info and direct connect-and-use flows for each listed app. The team had built genuine product differentiation around the security review process: every listed app had been audited, insurance-backed and rated.
The site was a Next.js application with about 800 indexable pages: category pages, individual app listings, security review pages, blog content and the help center. The product surface was solid. The engineering team was strong. The site loaded slowly enough that none of that mattered for SEO.
Magic Square came to us specifically about Core Web Vitals because they'd been monitoring their PageSpeed Insights scores and watching them stay red despite multiple optimization attempts. Lighthouse audits had been run, fixes had been deployed and the field data (CrUX) kept showing INP around 380ms and LCP around 2.8s on mobile. Both red. Both well into territory where Google's algorithm was actively demoting.
The team had also been wondering why their AI engine citation rate was lower than they'd expect for a curation-and-review platform. The kind of site AI engines should love (structured data about apps, security ratings, comparisons) was getting cited at maybe a third of the rate similar sites were achieving.
The problem
The CWV problem broke down into three primary contributors.
First, the wallet SDK situation. Magic Square uses RainbowKit and wagmi to power the connect-and-use flows on each app listing. The SDK was being initialized on every page mount including marketing pages, category pages, blog posts, the help center. About 250KB of JavaScript loading on every page even when the user had no intent to connect a wallet. This was costing 200-300ms of TBT (Total Blocking Time) which translated directly to INP scores.
Second, the IPFS image issue. Many of the apps listed on Magic Square use IPFS-hosted artwork for their logos, banners and screenshot galleries. The site was rendering these via direct IPFS gateway URLs. Public IPFS gateways are unreliable for SEO crawlers and slow for end users. Image LCP was getting hammered by IPFS gateway latency; og:image was failing to render in social previews about 40% of the time.
Third, the homepage ticker. Magic Square's homepage shows a live-updating ticker with featured apps, security alerts and category highlights. The ticker was loading and initializing immediately on page mount with about 80KB of JavaScript and a WebSocket connection. None of this was visible above the fold. None of it was needed for first paint. But it was blocking the main thread during the critical INP window.
On the schema side, Magic Square was emitting generic Article schema across all listing pages. Apps like Aave should have been Product or FinancialProduct. NFT marketplaces like OpenSea should have been Service. DeFi positions and yield products should have been FinancialProduct with specific properties. Generic Article was wrong for all of them.
The audit
Two-week audit. The CWV findings were the clear top priority because they were Google ranking factors, not just AI engine signals.
We confirmed the wallet SDK was the largest single contributor to TBT and INP. Bundle analyzer showed the SDK and its dependencies accounting for about 60% of the initial JavaScript payload on marketing pages. The fix was straightforward: lazy-load the SDK behind a user action trigger.
The IPFS issue was diagnosed via a Performance trace on real listing pages. Image fetches from public IPFS gateways were taking 5-8 seconds in the worst cases. CDN caching with origin-pull from a reliable pinning service (Pinata) was the right pattern.
The ticker issue was the smallest CWV contributor but still material. Deferring its initialization until after first paint, plus moving the WebSocket connection to a setTimeout-deferred bootstrap, would clear the remaining TBT.
The schema issue was a separate work stream. Mapping each app type to the correct schema (Product for NFT items, FinancialProduct for DeFi positions, Service for marketplaces, Cryptocurrency for token launches) would enable both rich result eligibility and AI engine citation lifts. Stacking FAQPage with Speakable on top would amplify the AEO impact.
We sequenced the work CWV-first, schema-second. The CWV fixes were ranking-critical and could ship in days. The schema work needed more design (which schema for which app type) and would benefit from a faster site as the foundation.
FREE WEB3 AUDIT
Get the same audit type for your site.
Run the same Crawlux audit on your crypto domain. Free first audit, full PDF report.
Free first audit · No signup · 60 seconds · Full PDF report
The work
Lazy-load RainbowKit and wagmi
Refactored the wallet provider into a wrapper component that listens for the connect button click before loading the SDK. Used Next.js dynamic imports with ssr:false. The connect buttons across the site got tagged with a data-connect-wallet attribute that the wrapper component listens for.
On marketing pages and content pages, the SDK now never loads on initial mount. On the actual app interaction pages where users intend to connect, the SDK still loads eagerly because the user is there to interact.
This single change moved INP from around 380ms to under 200ms on the affected pages. Total Blocking Time dropped substantially. The pattern is now standard across new pages the Magic Square team builds.
Cache IPFS images to Cloudflare R2
Built an upload pipeline that fetches each IPFS-hosted asset on first reference, resizes to multiple sizes (1200x630 for OG, 800x600 for listing thumbnails, 400x300 for grid previews), uploads to Cloudflare R2 with aggressive cache headers and updates the page's reference to point to the CDN URL.
The IPFS hash stays in the underlying data (for permanence and verification). The CDN URL is what gets emitted to crawlers and end users.
LCP improved substantially within days as the cache populated. og:image rendering reliability went from about 60% (the old IPFS gateway rate) to effectively 100%. Twitter, LinkedIn and Reddit previews all started rendering correctly across the site.
Defer ticker JS
Moved the ticker initialization out of the main bundle and into a setTimeout-deferred load that fires after first paint. The WebSocket connection establishes after the page is fully interactive. Above-the-fold content renders unimpaired by ticker logic.
Smaller change than the wallet SDK fix but it eliminated the residual TBT that was preventing INP from cleanly landing under 200ms. With this in place, mobile INP scores stabilized in the green range.
Schema split by content type
Mapped the app listing inventory by category. Built per-template schema with the correct types: Product for NFT marketplaces and items, FinancialProduct for DeFi positions and lending protocols, Service for utilities and infrastructure, Cryptocurrency for token launches. Stacked FAQPage with Speakable on every listing page. Speakable cssSelectors pointed at the security rating block, the FAQ entries and the audit summary.
Built the /security/ section as a dedicated content hub with its own FAQPage schema explaining the audit process, insurance coverage and security ratings methodology. This gave AI engines a structured destination for "is X app safe" queries.
Results
The CWV work shipped in 14 days from kickoff. Within that window, both INP and LCP moved from red to green at the 75th percentile in PageSpeed Insights field data.
Organic traffic lifted by approximately 60% in the 60 days following CWV deployment. The lift was concentrated on long-tail queries (specific app names plus modifiers) which had been particularly impacted by the slow page experience.
AI Overview citations increased substantially after the schema work shipped. ChatGPT and Perplexity both started citing Magic Square on app discovery and security queries where they had previously cited only the underlying apps directly.
The /security/ section drove an outsized share of conversion lift. Conversion rate (defined as the user clicking through to actually use a listed app) on security-content pages came in 23% above the site average. Users who landed on a security review page were pre-qualified and converted better.
5 tactical lessons you can apply
Wallet SDK lazy-loading is the highest-ROI Web3 CWV fix
RainbowKit, Web3Modal and wagmi each cost 200-500KB of initial JS. Eager-loading them on marketing pages where users have no intent to connect wastes the entire performance budget. Lazy-load behind a click trigger and recover 200-300ms of TBT instantly.
Cache IPFS images aggressively. Always.
Public IPFS gateways routinely take 5-8 seconds to serve images. Twitter, LinkedIn and Google's crawler all timeout before that. Dual-host: IPFS hash for permanence (referenced in contracts and metadata), CDN URL for serving (in og:image, src attributes, schema). Cloudflare R2 free tier covers most projects.
Schema split by content type beats blanket Article
An app store has multiple content types in one taxonomy. NFT marketplaces are Service. DeFi positions are FinancialProduct. Token launches are Cryptocurrency. Splitting schema by app category enables rich result eligibility per type. Blanket Article on everything wastes the eligibility entirely.
CWV time-to-impact is the fastest in SEO
CWV is unique in that lab data improves immediately and field data (CrUX) updates within 28 days. Most SEO work has a 60-90 day measurement window. CWV fixes show their work within four weeks. Use this when prioritizing engagement plans for clients who need early wins.
Build content destinations before deploying schema that points to them
We launched FAQPage schema with cssSelectors pointing at sections of /security/ that weren't fully populated. Worked but messy. Better sequence: build the destination, populate it, then deploy schema that signals AI engines to extract from it.
AB's takeaway
Magic Square was the cleanest engagement of the four because the problems were tactical and the fixes were well-understood. The lazy-load wallet SDK pattern, the IPFS CDN caching pattern and the schema split pattern are all things we've since codified into Crawlux audit modules.
The time-to-impact was the standout. Most SEO work has a 60-90 day measurement window. The CWV work showed lab data improvement immediately and field data improvement within the 28-day CrUX window. The team could see the change in their own measurements within two weeks.
The schema work followed a longer timeline (60-90 days for ranking impact) but the AEO citation lift showed up within three weeks. AI engines re-crawl frequently. Schema improvements show up in citation rates much faster than they show up in Google rankings.
What we'd do differently
One thing.
We'd have built the /security/ content hub before the schema work rather than alongside it. The schema work assumed a destination existed for the security FAQ entries. The destination got built in parallel with the schema. This was workable but it meant the schema went live with some FAQ entries pointing at sections of the security hub that weren't fully populated yet. Sequencing the hub first would have meant cleaner schema launches and a more polished initial experience.
Beyond that, the engagement ran clean. The technical fixes were textbook applications of patterns that work. The team executed quickly. The results were measurable.
We had been chasing CWV improvements for a year with no real progress. TG3 fixed it in two weeks. The schema work shipped on top and the citation rate change in AI engines has been a real channel for us.
Run a free Crawlux audit on your site
The audit identifies which schema, technical and AEO issues are blocking your rankings. Same diagnostic framework we used at Magic Square.
Run free audit →Related playbooks
Pillar guides
RUN YOUR OWN AUDIT
See what Crawlux finds on your site.
These results came from the same audit you can run for free on your own domain. 60-second turnaround.
Free first audit · No signup · 60 seconds · Full PDF report
