
Next.js 16 production-ready checklist: 25 points before you deploy
25 concrete checks a Next.js 16 project must pass before go-live, covering security, performance, SEO, accessibility and monitoring in one list.
Ten concrete technical optimisations that measurably lift webshop conversion: performance, UX, trust signals, checkout flow and A/B-testable elements.

Optimisation sprint
Lighthouse, Hotjar session recordings and analytics review to surface the top 5 friction points.
Mobile LCP under 2s, sticky add-to-cart, guest checkout and trimmed forms — one to two weeks of work.
PostHog or GrowthBook feature flags. Aim for 1,000+ conversions per variant over two to three weeks.
Ship the winning variant. Typical outcome: 30-60% relative CR uplift over a four-to-six-week cycle.
Conversion rate (CR) is one of the most rewarding areas in e-commerce — lifting a 1.5% baseline to 2.5% is not science fiction, and it translates into a 60-70% revenue uplift. Many online stores in the Hungarian market run at a 1-2% CR, while the international benchmark for B2C sits at 2-3%.
This article covers 10 concrete technical optimisations that measurably move the needle. Each one has been measured and tested on live projects in a Hungarian market context. The figures reflect Q1 2026 state-of-the-art benchmarks and draw on Baymard, GFK and Árukereső data for the Hungarian market.
Before diving into optimisation, it's worth clarifying the benchmarks. What counts as a "good" CR depends heavily on industry and product:
| Industry | Global average CR | Hungarian average CR |
|---|---|---|
| Fashion (B2C) | 2.7% | 1.5-2.0% |
| Electronics | 1.8% | 1.0-1.5% |
| Home & Garden | 2.4% | 1.5-2.5% |
| Food & Beverage | 4.0% | 2.5-3.5% |
| Cosmetics | 3.5% | 2.0-3.0% |
| B2B (industrial) | 0.8% | 0.5-1.0% |
In the Hungarian market, CR is often 30-40% lower than the global average — mainly due to lower trust levels and fewer payment options. Optimising this area tends to be the most rewarding.
Mobile Largest Contentful Paint (LCP) is the #1 conversion predictor. Every 0.5s reduction correlates with a 5-10% CR increase (Google research, Web.dev case studies).
<link rel="preload"> on the critical fontpriority prop on next/imageimport Image from 'next/image';
// Hero product image — above the fold, priority
<Image
src="/products/hero.webp"
alt="..."
width={1200}
height={1200}
priority
sizes="(max-width: 768px) 100vw, 600px"
placeholder="blur"
/>
// Below-the-fold images — lazy by default
<Image
src="/products/gallery-1.webp"
alt="..."
width={600}
height={600}
loading="lazy"
sizes="(max-width: 768px) 50vw, 300px"
/>
Lighthouse mobile score of 90+, LCP under 2s, INP under 200ms, CLS under 0.05.
The Google Search Console "Core Web Vitals" report shows real user data. Lighthouse and PageSpeed Insights are synthetic benchmarks — actual Google ranking and CR impact are calculated from Search Console data.
npx unlighthouse --site https://example.com
Tip: A "90+ Lighthouse" score doesn't guarantee good real-world performance — a page can still be slow on a poor mobile network. Field data (Search Console / Web Vitals) is the metric that matters.
Users decide within the first 3 seconds whether they'll stay. Above the fold (mobile viewport ~640px):
Don't place the reviews section, related products or an email sign-up above the fold — those belong below it.
| Variant | Mobile CR |
|---|---|
| Above the fold: image + name + price + CTA | 2.4% |
| Above the fold: image + reviews + name + price | 1.8% |
| Above the fold: image + name only (CTA further down) | 1.2% |
The "visible CTA" variant performs 2x better than the "CTA after scroll" one.
Building trust matters especially in the Hungarian market. For new online stores, this can account for a 30-50% CR difference.
| Element | Location |
|---|---|
| SSL + payment icons | Footer + checkout (both) |
| Return badge | Product page, near the CTA |
| Customer reviews | Product page, below the fold |
| Phone + address | Footer, contact page |
| Certifications | Footer + about page |
Hungarian B2C shoppers are still strongly trust-driven:
Don't force users to register. A "Checkout as guest" button on checkout adds +15-25% CR.
Variant A (require login): CR 1.2%
Variant B (guest checkout default): CR 1.5%
Variant C (guest first, login optional): CR 1.65%
// Checkout step 1
<div className="space-y-4">
<h2>Hogyan szeretnéd folytatni?</h2>
<Button variant="primary" size="lg" onClick={() => proceedAsGuest()}>
Vásárlás vendégként
</Button>
<div className="text-sm text-text-secondary">
Vagy: <Link href="/login">Bejelentkezés</Link>
<span className="mx-2">·</span>
<Link href="/register">Regisztráció</Link>
</div>
</div>
Offer account creation on the post-purchase confirmation screen instead:
Köszönjük a rendelést!
Tegyük könnyebbé a következő vásárlást egy ingyenes fiókkal:
☐ Igen, készíts nekem fiókot — csak emailt + jelszót kérünk
Every extra field costs 5-10% in bounce rate. The checkout form should only include mandatory fields:
Billing address defaults to a "same as shipping address" checkbox. Company details (tax number) are collapsed and shown only for B2B.
// Hungarian postal-code-to-city mapping
async function lookupZip(zip: string): Promise<{ city: string; county: string } | null> {
const response = await fetch(`/api/zip/${zip}`);
if (!response.ok) return null;
return response.json();
}
// Form
<input
type="text"
name="zip"
pattern="[0-9]{4}"
onChange={async (e) => {
if (e.target.value.length === 4) {
const data = await lookupZip(e.target.value);
if (data) {
setFormValue('city', data.city);
setFormValue('county', data.county);
}
}
}}
/>
Hotjar / FullStory session recordings show exactly which field causes users to abandon. Typical drop-off points:
On long product pages, users scroll down and lose sight of the CTA. A sticky bottom bar on mobile fixes this:
'use client';
import { useEffect, useState } from 'react';
export function StickyCartBar({ product }) {
const [visible, setVisible] = useState(false);
useEffect(() => {
const handleScroll = () => {
// Show after scrolling 400px (below the fold)
setVisible(window.scrollY > 400);
};
window.addEventListener('scroll', handleScroll, { passive: true });
return () => window.removeEventListener('scroll', handleScroll);
}, []);
if (!visible) return null;
return (
<div className="fixed bottom-0 left-0 right-0 z-40 border-t bg-white p-3 md:hidden
safe-bottom shadow-lg">
<button
className="w-full rounded-lg bg-accent py-3 font-semibold"
onClick={addToCart}
>
Kosárba — {formatPrice(product.price)}
</button>
</div>
);
}
The safe-bottom Tailwind utility handles the iPhone notch / safe area. The shadow-lg signals to the user that this is a floating element.
| Setup | Mobile CR |
|---|---|
| Top-of-page CTA only | 1.4% |
| Sticky bottom bar | 1.55% |
| Sticky bottom bar + "discount" badge | 1.7% |
Typically +8-12% mobile CR.
"Only 3 left in stock" style visual cues (FOMO triggers). Don't lie — if there's no real scarcity, don't fake it. But if there is, communicate it.
{stock <= 5 && stock > 0 && (
<p className="text-sm text-amber-600 flex items-center gap-1.5">
<Clock className="h-4 w-4" />
Készleten {stock} db • Gyors szállítás
</p>
)}
{stock === 0 && (
<p className="text-sm text-red-600">
Jelenleg készletkimaradás — várólista
</p>
)}
Cart abandonment in the Hungarian market typically runs at 65-80%. Recovery tactics:
Typical recovery rate: 8-15%.
// Trigger: add-to-cart event
async function onCartAdded(userId: string, cartId: string) {
// Schedule 3 emails
await emailScheduler.schedule({
to: userId,
template: 'cart_reminder_1h',
sendAt: addMinutes(new Date(), 60),
condition: () => !isCheckoutCompleted(cartId),
});
await emailScheduler.schedule({
to: userId,
template: 'cart_reminder_24h_discount',
sendAt: addHours(new Date(), 24),
condition: () => !isCheckoutCompleted(cartId),
});
await emailScheduler.schedule({
to: userId,
template: 'cart_reminder_3d_lastchance',
sendAt: addDays(new Date(), 3),
condition: () => !isCheckoutCompleted(cartId),
});
}
An "Others bought this" section combined with recent-purchase notifications lifts conversion by 5-15%.
<div className="rounded-lg bg-bg-surface p-4">
<p className="text-sm">
<strong>72-en</strong> vásárolták az elmúlt 7 napban
</p>
</div>
// Toast: "István, Budapest, bought this 5 minutes ago"
function RecentPurchaseNotification({ data }) {
return (
<div className="fixed bottom-4 left-4 z-50 rounded-lg bg-white p-3 shadow-lg
border max-w-xs animate-slide-in">
<p className="text-xs">
<strong>{data.firstName}</strong> ({data.city})
</p>
<p className="text-sm">{data.timeAgo}-kor vásárolta</p>
</div>
);
}
Source the data honestly: if 72 people really bought it, show that. If it's 3, don't lie.
| Reviews count | Average CR uplift |
|---|---|
| 0 reviews | 0% (baseline) |
| 1-5 reviews | +8% |
| 6-20 reviews | +15% |
| 20+ reviews | +22% |
Collect reviews through a post-purchase email flow. "Leave a review and get a 5% coupon for your next purchase" — 30-40% response rate.
Every technique above is testable. Without A/B testing, impact is just a hypothesis.
import { posthog } from 'posthog-js';
// Initialize (with consent)
posthog.init('phc_xxx', {
api_host: 'https://eu.posthog.com', // EU-region
capture_pageview: false, // GDPR-friendly default
});
// In component
function ProductPage({ product }) {
const showStickyBar = posthog.getFeatureFlag('sticky-cart-bar') === 'variant_a';
const showScarcity = posthog.getFeatureFlag('scarcity-message');
return (
<>
{/* ... */}
{showStickyBar && <StickyCartBar product={product} />}
{showScarcity && stock <= 5 && <ScarcityBadge stock={stock} />}
</>
);
}
Baseline CR: 2.0%
Detectable lift: 10% (relative)
Statistical power: 80%
Significance: 95%
→ Sample size: ~10,000 visitors per variant
→ At 1,000 visitors/day: a 10-day test
Evan's A/B Calculator is ideal for quick estimates.
For higher-value products, image zoom plus a 360° view adds +5-10% CR. Users get to "hold" the product virtually.
A "questions?" button can add +3-7% to CR. Live chat during business hours (9am-5pm), an AI chatbot 24/7.
A "You're X HUF away from free shipping" message in the cart. +12-18% lift in average order value.
"Save for later" separates "interested" intent from "ready to buy" intent. The wishlist also doubles as a newsletter-targeting segment.
The lack of Hungarian payment options often costs 30-40% CR in the Hungarian market.
A project-level optimisation sprint (4-6 weeks) typically delivers a 30-60% relative CR increase over baseline.
| Week | Activity |
|---|---|
| 1 | Audit (Lighthouse, Hotjar, analytics review) |
| 2 | Prioritisation — top 5 issues with impact estimates |
| 3 | Implement 1-2 quick wins |
| 4 | A/B test launches, monitoring |
| 5 | Results review, iteration |
| 6 | Production rollout, follow-up audit |
Related articles from us: Next.js 16 production-ready checklist — performance fundamentals. Headless CMS in Hungary — choosing a content stack. Mobile app GDPR compliance — analytics and consent management.
Webshop conversion rate never comes down to a single trick. The cumulative effect of the 10 techniques above is substantial. A project-level optimisation sprint (4-6 weeks) typically delivers a 30-60% relative CR increase over baseline.
Measurement is the key. Without A/B testing infrastructure, changes remain just hypotheses. PostHog or GrowthBook can be integrated free of charge and up and running within 1-2 weeks.
If you're planning a webshop development or optimisation project, let's talk it through in a discovery call to find where the biggest wins are. A 1-2 week audit (300,000-600,000 HUF) often pays for itself 5-10x within the first 3 months once the quick wins are implemented.
About the author
Corevanix Kft.
Technology partner
Budapest-based technology partner — SAP/ERP integration, web development, AI automation and mobile app development. We work inside the client’s own environment, and the delivered code belongs entirely to the client.

25 concrete checks a Next.js 16 project must pass before go-live, covering security, performance, SEO, accessibility and monitoring in one list.

A deep dive into three headless CMS options: Sanity, Strapi and Contentful. Pricing, real-time preview, localisation and five Hungarian-market use cases.