Save Basket feature. A page reload appears to re-fetch the item.Reload Page button that calls window.location.reload(). Copy is grounded in words that already exist on FP’s site (“Basket”, “design”, “page”).<div class="shoppingcart__empty"><div class="catfish-container">Your Basket is empty!</div></div>
— verified funeralprints.com/cart on 2026-05-12. PostHog injection selector: .shoppingcart__empty .catfish-container.
<title>Basket</title>, H1, and existing Save Basket button.
“design” — PDP CTA CLICK TO DESIGN, Infigo designer URL /CF/DynamicProduct/Editor/....
“Reload” / “page” — generic UI vocabulary; no numerical or claim-bearing language.
The Reload Page button uses the existing catfish-button class so it inherits site styling natively. Verified at funeralprints.com/cart.
window.location.reload()..shoppingcart__empty exists in DOM (so it never shows on a populated cart).body:has(.navbar-end.is-shown a[href*="/login"]) .v-callout-fp56-gate{display:none!important}. When the visible navbar shows a Login link (logged-out state), the callout is hidden. PostHog feature-flag filters can't gate this (project has zero person properties), so we ship the gate inside the transform.By adding a one-line nudge plus a Reload Page button on the empty Basket page for logged-in users, we will recover a small share of designer-→-empty-Basket drop-offs — because the Basket sometimes appears empty after a designer session even though nopCommerce persists the item server-side for logged-in users, and users currently see no hint that a reload might restore it. Logged-in gating is enforced via a CSS rule inside the variant HTML (see Audience).
Single-variant test (50/50 Control vs Variant). Every word in the variant is grounded in vocabulary already on funeralprints.com. No invented numbers, no borrowed claims, no promises about recovery behavior.
Primary metric: FP โ Purchase (cart → purchase) — funnel gated to /cart pageview, sales-based (HARD rule: primary must be sales, gated to change-page)
Secondary metrics: FP โ Reached checkout (cart → begin_checkout) (cart-gated funnel), FP โ Revenue per visitor (mean metric, can't be funnel-gated)
Guardrails: overall purchase rate, AOV, bounce rate on /cart (must not drop)
Sample size: narrow audience — expect 6–8 weeks at ~1,200 sessions/day for ±15% MDE on the recovery rate. Confirm baseline once empty-Basket insight is set up in PostHog.
Audience: URL contains /cart, .shoppingcart__empty exists, user is logged in (enforced via CSS DOM-gate inside the variant HTML: body:has(.navbar-end.is-shown a[href*="/login"]) hides the callout when a visible Login link exists). Desktop + mobile, all geos.
Selector for injection: .shoppingcart__empty .catfish-container — append HTML after existing “Your Basket is empty!” text.
Source page audited: /cart
Pre-launch checks:
posthog.identify() fires on /login + /registerresult).document.querySelector('.shoppingcart__empty') exists.posthog.featureFlags.override({'fp-56-empty-basket-refresh-nudge':'variant'}), screenshot, send to Valentin before launch.