// calc-gate-upsell.jsx — the lightweight signup gate (the only friction, exists so // the upsell can recognise a returning buyer), the Stripe checkout note (VAT added // here), and the signature post-purchase upsell comparison. function SignupGate({ sel, onClose, onSignup, margin }) { const q = window.quotePrice(sel, margin); return (
e.stopPropagation()}>

Create a free account to make it

Quick and free — it's the only step. We just need to know it's you so your video lands in your account.

{window.fmt(q.total)}+ VAT · charged at checkout
Why an account? So we can save your videos and, if you come back, show you when subscribing would cost you less than buying one-by-one.
No subscription is created. By continuing you agree to the Terms and Privacy Policy.
); } function Checkout({ sel, onClose, onPaid, margin }) { const q = window.quotePrice(sel, margin); const vatRate = 0.25; // buyer location: Denmark · 25% — applied at payment const vat = Math.round(q.total * vatRate * 100) / 100; const total = Math.round((q.total + vat) * 100) / 100; return (
e.stopPropagation()}>

Checkout

Secure payment · powered by Stripe
{window.PRICE.length[sel.length].label} {sel.style === 'cinematic' ? 'cinematic' : 'talking-head'} video{window.fmt(q.render)}
{q.oneTime > 0 ?
Digital twin setup (one-time){window.fmt(q.oneTime)}
: null}
VAT (Denmark · 25%)€{vat.toFixed(2)}
Total today€{total.toFixed(2)}
VAT is calculated for your country at payment. You're paying once for this video — no subscription.
); } function UpsellCompare({ history, onClose, onSubscribe }) { const count = history.length; const spend = history.reduce((a, b) => a + b, 0); const plan = window.PLANS.starter; const oneOffRate = spend / count; const planRate = plan.price / plan.videos; const moreVideos = plan.videos - count; const saving = Math.max(0, Math.round((oneOffRate - planRate) * plan.videos)); return (
e.stopPropagation()}>
Video #{count} is rendering

You've made {count} videos for {window.fmt(spend)}. There's a better deal.

At the rate you're buying, a subscription would give you far more video for about what you're already spending.

What you've spent — one-off
{window.fmt(spend)} so far
{count} videos, bought one at a time.
That's ≈{window.fmt(Math.round(oneOffRate))} per video.
  • Pay again for every new video
  • No monthly images or voiceover allowance
Best value
{plan.name} subscription
{window.fmt(plan.price)} / month
{plan.blurb} — {moreVideos > 0 ? moreVideos + ' more' : 'more'} than you've made so far.
Just ≈{window.fmt(Math.round(planRate))} per video.
  • {plan.blurb}
  • {plan.extras.map((x, i) =>
  • {x}
  • )}
For about the same monthly spend, {plan.name} gives you {plan.videos} videos a month instead of {count}{saving > 0 ? — roughly {window.fmt(saving)} of value over buying them one-off : null}.
); } Object.assign(window, { SignupGate, Checkout, UpsellCompare });