Google's real-visitor data for misprint.com is mostly good: loading (LCP 1.9s) and responsiveness (INP 179 ms) pass. The one failure is layout shift, CLS 0.14 against a 0.1 limit, and PageSpeed names the element that moves: the main navigation. On a phone, the homepage also downloads 4.6 MB in 243 requests, 3.3 MB of it JavaScript. Stripe's payment code alone is 1,169 KB in 25 requests, loaded before anyone has chosen a card, and about 1 MB of JavaScript goes unused. For a marketplace that sells speed ("Robinhood for Pokemon cards", a deals feed refreshed every five minutes), a nav that slides under a thumb as the page settles means mis-taps on the deals people came for.
First action
Open PageSpeed's layout-shift diagnostic for the homepage and give the main navigation, and anything rendered above it, a fixed height in the server HTML.
How to measure it
CLS p75 (Chrome real-user data)
- Now
- –
- Target
- Under 0.1, so all three Core Web Vitals pass
- By
- 28 days after release
Steps
Find the shift
Reproduce the nav shift on a throttled phone profile; note what loads late above or inside the nav (banner, credit notice, account state, fonts).
CTO 2 hours
Reserve the space
Fixed min-height for the nav and any banner slot in the first HTML; render signed-in and signed-out states at the same height; preload the nav font.
Software Engineer (Full Stack & Mobile) 1 day
Move Stripe
Load Stripe.js only on checkout, subscription and payout pages, not site-wide.
Software Engineer (Full Stack & Mobile) 1 day
Delay the tags
Fire ad and analytics tags after first interaction or idle, and remove any tool that duplicates another.
CTO 1 day
One redirect
Send www and http straight to https://misprint.com/ in one hop.
CTO 1 hour
Re-test
Run PageSpeed on the homepage, a card page and the deals feed; compare weight, requests and CLS.
CTO 1 hour
Watch real data
Track 28-day field CLS in Search Console and tap-through on the deals feed in PostHog.
CEO 4 weeks
Why it works
Two fixes, then a re-test. First, reserve the navigation's space: give the nav bar, and anything injected above it (a sale banner, credit notice or app prompt), a fixed height in the first server-rendered HTML, so it never pushes content down after load. Second, load Stripe.js only on pages that take payment or set up payouts (checkout, subscription, seller onboarding) instead of the homepage, and load marketing tags after the first interaction. Then make the www-to-apex redirect a single hop. Re-run PageSpeed, then watch the 28-day real-visitor CLS fall below 0.1. The upside: all three Core Web Vitals pass for real visitors, the homepage and deals feed get lighter on mobile, and taps land where users meant them to.
Layout shift is the only metric holding the site back, and it comes from one named element, so the fix is narrow and measurable. Payment code is only needed when someone pays, so moving it costs nothing in conversion and removes the largest single block of third-party weight.
Ready to use
ChecklistHomepage speed fix list
[ ] Nav and banner slot have a fixed height in server HTML [ ] Signed-in and signed-out nav are the same height [ ] Nav font preloaded, font-display set [ ] Stripe.js only on checkout, subscription and payout pages [ ] Ad and analytics tags fire after first interaction [ ] Duplicate tools removed [ ] www and http reach https://misprint.com/ in one redirect [ ] PageSpeed re-run: homepage, card page, deals feed [ ] Field CLS under 0.1 after 28 days
Risks and how to handle them
Checkout breaks if Stripe loads too late
Load it on entry to checkout and subscription pages and test a live order end to end.
Delayed tags under-count ad conversions
Keep purchase events server-side or fire them on the confirmation page, which still loads the tags.
Evidence
- Google PageSpeedHomepage, mobile test (November 10, 2026): performance 40/100 (desktop 58). Real Chrome visitors pass loading (LCP 1.9s) and responsiveness (INP 179 ms) but fail Core Web Vitals on layout shift: CLS 0.14 against Google's 0.1 limit, and the element that shifts is the main navigation. The page downloads 4.6 MB in 243 requests, 3.3 MB of it JavaScript; Stripe's code alone is 1,169 KB in 25 requests; about 1,005 KB of JavaScript is unused (about 0.9s) and multiple redirects cost about 0.75s.Source
- Google PageSpeedHomepage third-party code (mobile test): Stripe 1,169 KB, Google Tag Manager 312 KB, Facebook 284 KB (250 ms of blocking), Klaviyo 181 KB in 23 requests, Help Scout 170 KB, plus Microsoft Clarity, Reddit, Bing Ads, Google Ads and Google Analytics tags: 15 third parties and 2.2 MB in all.Source
- Your websiteSubscription and credit (as indexed): an annual plan billed at $95.88; Misprint Credit never expires and cannot be cashed out; subscribers earn credit on orders over $35 at a rate that rises with tenure; event pages such as a Pokémon 30th Anniversary sale (10% back, 15% for subscribers), Labor Day (7% for everyone, 11-13% for members) and a "Dark + Ghost Takeover"; members-only daily deals that unlock at 3PM ET; a below-market deals feed refreshed every 5 minutes.Source
- Y CombinatorMisprint (Winter 2025 batch, founded 2025, team of 4, New York): "building Robinhood for Pokemon cards", an all-in-one marketplace for the collectibles world's biggest pain point, "opaque pricing"; sales data on 200K+ unique cards; sellers "list 10+ cards with a single photo, over 20x faster than competitors"; the CEO runs the YouTube channel Eva's Binder.Source