// i18n.jsx: language infrastructure and all translations
// Loaded before slides.jsx / simulation.jsx / train.jsx / app.jsx

// ═══════════════════════════════════════════════════════════════════════════
// MONEY. ONE VALUE, ONE PLACE.
//
// Every krone amount AdMel earns or spends is stored here once, in NOK, and
// written into copy as a [[key]] token. The dollar figure is derived at load
// time by dividing by ten, so the two language versions cannot drift: there
// is no second set of numbers to forget to update.
//
// Foreign facts quoted in dollars are deliberately NOT in this table. IHL's
// 1.77 trillion and Doss's 73 million are dollar amounts in the world, not
// converted krone amounts, and they stay in dollars in Norwegian too.
// ═══════════════════════════════════════════════════════════════════════════
const NOK = {
  raise:         3000000,   // the round
  committed:     1500000,
  grant:         1000000,   // Innovation Norway, on top of the round
  remaining:     1500000,   // the round less what is committed: half each
  arrBreakeven:  4500000,   // 54 customers at list, twelve months
  arrMonth9:     6800000,
  arrBase24:    83300000,
  arrNordic1pct: 419400000, // 6 250 companies at the blended price
  burn:           370000,   // a month, funded team
  // 412 000 divided by ten is 41 200, not the 41 000 an earlier hand
  // conversion rounded it to. The exact figure is kept: it is what makes the
  // fix room's arithmetic hold, 41 200 less 11 800 leaving the 29 400 freed.
  deadStock:      412000,   // one retailer, one month
  // These two used to share one key because both happened to be 118 000.
  // The booker spend has since changed and the dead stock has not, so they
  // are separate values now and must stay that way.
  deadStockAfter: 118000,   // what is left after the fix
  bookersFixed:    58000,   // one agency, a month, whatever happens
  bookerFee:       10000,   // the other agency, per signed customer
  onboarding:      10000,   // what the customer pays, covering that fee
  freed:          294000,
  // CAC is the fixed retainer spread over the month's new customers. The
  // per-signature fee is passed through at cost, so it nets to zero and is
  // not in these figures: 58 000 / 6 and 58 000 / 12.
  cacPlan:          9700,   // at a 20% close, the plan
  cac:              4800,   // at a 40% close, the upside
  listPrice:        6990,
  blended:          5592,
  partnerNet:       4893,
  prelaunch:         990,
  // Measured infrastructure cost per customer per month. The band is the
  // catalogue: up to 3 000 active SKUs at the bottom, over 50 000 with
  // unlimited OCR at the top.
  serveHigh:        1000,
  serveLow:           70,
  saved:           47141,
};

const RATE = 10;   // NOK per USD, stated on screen in the English version

function groupNum(n) {
  return String(n).replace(/\B(?=(\d{3})+(?!\d))/g, ' ');
}
function oneDp(x, dec) {
  const r = Math.round(x * 10) / 10;
  const t = (r % 1 === 0) ? String(r) : r.toFixed(1);
  return dec === ',' ? t.replace('.', ',') : t;
}

// Figures that belong to the round are quoted in MNOK in Norwegian even when
// they fall under a million, because "500 000 kr committed" against a 3 MNOK
// round makes the reader do the conversion themselves. Everything else takes
// the form its own size suggests.
const ALWAYS_MNOK = ['raise', 'committed', 'remaining', 'arrBreakeven',
                     'arrMonth9', 'arrBase24', 'arrNordic1pct'];

// Norwegian reads kroner, English reads dollars. Millions carry MNOK or M so
// a figure never runs to nine digits on a shelf label.
function formatMoney(nok, lang, asMillions) {
  if (lang === 'no') {
    if (asMillions || nok >= 1000000) return oneDp(nok / 1000000, ',') + ' MNOK';
    return groupNum(nok) + ' kr';
  }
  const usd = Math.round(nok / RATE);
  if (usd >= 10000000) return '$' + groupNum(Math.round(usd / 1000000)) + 'M';
  if (usd >= 1000000)  return '$' + oneDp(usd / 1000000, '.') + 'M';
  return '$' + groupNum(usd);
}

// Resolves every [[key]] in a language tree, in place, once at load.
function resolveMoney(node, lang) {
  if (typeof node === 'string') {
    return node.replace(/\[\[([a-zA-Z0-9]+)\]\]/g, (m, k) =>
      (k in NOK) ? formatMoney(NOK[k], lang, ALWAYS_MNOK.indexOf(k) >= 0) : m);
  }
  if (Array.isArray(node)) return node.map(v => resolveMoney(v, lang));
  if (node && typeof node === 'object') {
    const out = {};
    for (const k in node) out[k] = resolveMoney(node[k], lang);
    return out;
  }
  return node;
}

window.__NOK = NOK;
window.__formatMoney = formatMoney;
window.__RATE = RATE;

// ── Global language state ────────────────────────────────────────────────────
// ?lang=no opens the deck in Norwegian. Useful for sending a Norwegian
// investor straight into their own version, and for capturing both.
window.__lang = (function () {
  try { return new URLSearchParams(location.search).get('lang') === 'no' ? 'no' : 'en'; }
  catch (e) { return 'en'; }
})();
window.__langListeners = [];

window.__setLang = (l) => {
  window.__lang = l;
  [...window.__langListeners].forEach(fn => fn(l));
};

// useLang(): drop this at the top of any component that needs translation
window.__useLang = function useLang() {
  const [l, setL] = React.useState(window.__lang);
  React.useEffect(() => {
    window.__langListeners.push(setL);
    return () => { window.__langListeners = window.__langListeners.filter(f => f !== setL); };
  }, []);
  return l;
};

// ── LangToggle button ────────────────────────────────────────────────────────
window.LangToggle = function LangToggle({ style }) {
  const lang = window.__useLang();
  return (
    <div style={{
      display: 'flex', alignItems: 'center', gap: 2,
      fontFamily: 'var(--mono)', fontSize: 11, letterSpacing: '0.12em',
      ...style,
    }}>
      {['en', 'no'].map((l, i) => (
        <React.Fragment key={l}>
          {i > 0 && <span style={{ color: 'var(--line)', padding: '0 2px' }}>/</span>}
          <button
            onClick={() => window.__setLang(l)}
            style={{
              fontFamily: 'var(--mono)', fontSize: 11, letterSpacing: '0.12em',
              textTransform: 'uppercase',
              color: lang === l ? 'var(--accent)' : 'var(--dim)',
              fontWeight: lang === l ? 600 : 400,
              padding: '3px 5px', borderRadius: 4,
              background: lang === l ? 'oklch(0.45 0.18 255 / 0.08)' : 'transparent',
              border: 'none', cursor: 'pointer',
              transition: 'color 160ms, background 160ms',
            }}
          >{l.toUpperCase()}</button>
        </React.Fragment>
      ))}
    </div>
  );
};

// ── Translations ─────────────────────────────────────────────────────────────
window.TDATA = {
  en: {
    landingAskPlaceholder: 'Ask anything about this company. Otto answers from the deck.',
    landingExamples: [
      'How do the ten paying customers actually use it?',
      'What happens if the distribution partner walks?',
      'Why should I believe your price assumptions?',
    ],
    landingClaim: 'AutoStock decides what a retailer should order.',
    landingStanding: 'A shop with 4 000 products runs three systems that each report a different stock number, and orders on the difference. The buyer can count what did not sell, but not the customer who walked out. We reconcile the systems, take the decision, and show the reasoning behind it. Live in under an hour, on the systems already in place.',
    landingLine: 'We do not sell to retailers. We arrive inside the software they already pay for.',
    landingStatus: 'Ten retailers pay for it today. A signed distribution agreement reaches 400 more from September. Raising [[raise]].',
    landingEnter: 'Read the deck',
    landingRead: 'Continuous read',
    landingPdf: 'Download PDF',
    ottoRole: 'AI assistant · AutoStock',
    ottoAsk: 'Ask Otto anything',
    // ── App chrome ──
    confidential: 'Pre-Seed · {date} · confidential',
    landingHeadline: 'Hello…',
    landingSubtitle: "This is an agentic interactive pitch deck for AdMel. Click a section, or ask anything. Let's talk!",
    suggestions: [
      'What does AdMel actually do?',
      'Could this be a unicorn?',
      'Why are Alexander and Bjørn Erik so important?',
      'Why are you raising now?',
      "What's your biggest risk?",
    ],
    chatPlaceholder: 'Ask Otto anything about AdMel…',
    chatFollowUp: 'Ask a follow-up…',
    chatThinking: 'thinking…',
    youAsked: 'You asked',
    deckSays: 'The deck says',
    takeToSlide: 'Take me to the slide →',
    close: 'Close',
    kbSend: 'send', kbNav: 'navigate', kbBack: 'back',
    nav: {
      start: 'Start', intro: 'Intro', problem: 'Problem', solution: 'Solution',
      whynow: 'Why now', market: 'Market', simulation: 'The fix', unit: 'Unit economics',
      proof: 'Proof', scale: 'Scale', moat: 'Hard to copy',
      train: 'Train your AI', competition: 'Competition', business: 'Business model',
      team: 'Team', squad: 'Squad', roadmap: 'Roadmap', ask: 'The Ask', waitlist: 'Waitlist',
      thanks: 'Thank you',
    },

    // ── Intro ──
    intro: {
      h1a: 'AdMel is the', h1b: 'decision layer', h1c: 'on top of the systems you already use.',
      lead: 'Your systems tell you what you have. AdMel tells you what you need, how much, and when.',
      systemsLabel: 'Plugs into the systems you already run',
      connector: 'One integration. AdMel sits on top as the decision layer.',
      decisionLeft: 'Your systems tell you:',
      decisionLeftValue: 'What you have.',
      decisionRight: 'AdMel tells you:',
      decisionRightValues: ['What you need.', 'How much.', 'When.'],
      outputsLabel: 'What you get',
      outputs: [
        { kw: 'Forecasts', body: 'Demand projected per SKU, per location, every week. AdMel reads seasonal patterns, sales velocity and supplier lead times, so you know what\'s coming before it hits.' },
        { kw: 'Reorders', body: 'Precise, validated, explainable. Every suggestion comes with a reason: "Why 26 units?" answered every time. One click sends the order straight to your supplier.' },
        { kw: 'Zero dead stock', body: 'Capital stops getting trapped in slow-moving inventory. Bestsellers stay in stock. Stale SKUs get flagged before they become a write-off.' },
      ],
      footerBadge: 'Live · paying pilots',
      footerText: 'We distribute through ERP partnerships, not paid acquisition.',
      founderFit: 'Our CTO was an inventory manager before building this.',
    },

    // ── Thank you (closing slide) ──
    thanks: {
      h1a: 'Thank', h1b: 'you', h1c: '.',
      lead: 'Signed distribution. Paying pilots. A category the market already validated.',
      facts: [
        { v: '400',        k: 'retailers ready through our partner' },
        { v: '10',         k: 'paying pilots live today' },
        { v: 'Sept 2026',  k: 'partner launch' },
      ],
      close: 'Happy to take questions.',
    },

    // ── Squad (closing slide) ──
    squad: {
      eyebrow: 'AdMel',
      h1a: 'This is the team', h1b: 'that ships it.',
      close: 'Signed distribution. Paying pilots. A category the market already validated.',
    },

    // ── Problem ──
    problem: {
      scopeLabel: 'The problem',
      headline: 'Every order is a forecast. Most retailers make it from memory.',
      body3: 'The buyer only ever sees half of their mistakes. Overstock sits on the shelf where it can be counted. A stockout is a customer who walked out and left no record. The rational response to one sided feedback is to order more than you need.',
      measuredLabel: 'One customer. Three stores. 4 200 SKUs. One month before AutoStock.',
      measured: [
        { v: '6.5',     k: 'hours a week spent reordering' },
        { v: '23',      k: 'stockouts' },
        { v: '[[deadStock]]', k: 'In stock that will not sell' },
      ],
    },

    // ── Solution ──
    solution: {
      h1a: '', h1b: 'AutoStock', h1c: ': a three-step loop that keeps the operator in control.',
      lead: 'One integration replaces four. AutoStock unifies your stock data, forecasts demand per SKU, and turns it into validated reorder decisions you approve in a single click.',
      steps: [
        { tag: 'realtime',      t: 'Insight',     d: 'Every POS, ERP, ecommerce and warehouse feed unified into one live view: per SKU, per location. Cleaned and reconciled, so the numbers are finally trustworthy.' },
        { tag: 'validated',     t: 'Suggestion',  d: 'AI forecasts demand and proposes the exact reorder quantity, with the reasoning shown. "Why 26 units?" is answered by seasonality, sell-through and supplier lead time.' },
        { tag: 'human-in-loop', t: 'Action',      d: 'You approve, AdMel executes: the purchase order goes straight to the supplier in one click. Nothing moves without the operator.' },
      ],
      diffLabel: 'The differentiator',
      diffBody: 'Every recommendation is validated against real constraints before it is shown, never a black-box guess. The operator stays in control, and each approved decision sharpens the models.',
    },

    // ── Why Now ──
    whynow: {
      shifts: [
        { k: 'Technology', v: 'Forecasting that used to need a data science team now runs on commodity infrastructure.' },
        { k: 'Access', v: 'The ERP platforms Norwegian retailers run on opened their APIs.' },
        { k: 'Capital', v: 'Doss has raised $73M. Whitespace came out of Y Combinator\'s latest batch. Neither is in the Nordics.' },
      ],
      honestTitle: 'If they arrive',
      honestBody: '',
      h1a: 'Someone else is proving the model.', h1b: 'The channel', h1c: 'is already ours.',
      lead: 'Two US-funded companies are building this exact product, so the category is no longer a bet, and we are not the ones paying to prove it. What they do not have is a Nordic channel. Ours goes live in September 2026 with 400 customers one warm intro away.',
      leadAccent: 'September 2026',
      items: [
        { headline: 'Proof',        stat: '2',   statLabel: 'US-funded companies building this.',
          proof: [{ name: 'Doss', fact: '$73M raised to date' }, { name: 'Whitespace', fact: 'Y Combinator, latest batch' }] },
        { headline: 'Distribution', stat: '400', statLabel: 'retailers ready. Signed distribution partnership, partner launch in September.' },
        { headline: 'Window',       stat: 'Now', statLabel: 'Product live. Pilots paying. Partner launching.' },
      ],
      quote: 'The risky question was whether this category is real. Two funded US companies just answered it.',
      quoteItalic: 'We are the ones who already own the road in.',
    },

    // ── Market ──
    market: {
      h1a: 'Win Norway first. Then ride the', h1b: '$192B', h1c: 'wave.',
      lead: 'A concrete, winnable home market with a clean wedge, and a global category growing at 39% a year underneath us.',
      sf1: '$399/mo · blended ACV per company',
      sf2: 'Norway = the wedge',
      sf3: '$192B by 2034 · the gravity',
      layers: [
        { tag: 'TAM',        scope: 'Norway', label: 'Inventory-holding companies',               value: '$660M', math: '125,000 companies × $399/mo',        pct: 100, highlight: false, wide: false },
        { tag: 'SAM',        scope: 'Norway', label: 'Chains & SMBs without SAP / Oracle',        value: '$130M', math: '~25,000 companies × $399/mo',           pct: 20,  highlight: true,  wide: false },
        { tag: 'Global TAM', scope: '2034',   label: 'AI in supply chain',                        value: '$192B', math: '39% CAGR · the wave we ride after Norway', pct: 100, highlight: false, wide: true  },
      ],
    },

    // ── Competition ──
    competition: {
      h1a: 'Product parity is real.', h1b: 'Distribution', h1c: 'is the tiebreaker.',
      lead: 'Doss and Whitespace match us on product, and that is the point. Once the capability is table stakes, the winner is whoever reaches the customer. They would have to build into Visma, Tripletex, Finago and Unimicro and then win those channels from scratch. We are already inside them.',
      criteriaLabel: 'Product capability, scored on four criteria , ',
      criteria: ['AI-driven decisions', 'Autonomous ordering', 'SMB-friendly pricing', 'Rapid deployment'],
      players: [
        { kind: 'US AI-native',                   name: 'Doss / Whitespace',     blurb: 'Product equals ours: well funded and credible. What they do not have is the Nordic ERP stack or a channel into it.',  score: 4, rival: true },
        { kind: 'SMB ERP',                        name: 'Visma / Tripletex',     blurb: 'Owns the ledger, has the customers, but no decision layer on top. They are our channel, not our rival.',                 score: 2 },
        { kind: 'Enterprise ERP',                 name: 'SAP / Oracle',          blurb: 'Powerful, but priced and scoped far above the SMB we serve.',                                                            score: 0 },
        { kind: 'Internal build',                 name: 'In-house data science', blurb: 'Real AI, but out of reach for an SMB to build, staff and maintain.',                                                     score: 1 },
        { kind: 'AI-native, partner-distributed', name: 'AdMel',                 blurb: 'Same capability, plus the Nordic ERP integrations and the partner channel that actually put it in front of customers.', score: 4, hero: true },
      ],
      scoreLabel: '/ 4',
    },

    // ── Business ──
    business: {
      h1a: 'Priced per', h1b: 'location', h1c: ', not per seat.',
      lead: "Onboarding fee plus a monthly or annual subscription. Enterprise tiers carry real expansion potential. We deliberately break the legacy ERP seat model: operators shouldn't pay more because more of their team uses the tool.",
      tiers: [
        { tag: 'Single location', price: '$399', unit: '/mo',    desc: 'Single location. Core AI ordering.',              ribbon: null,           highlight: false,
          features: ['Core AI reorder engine', 'Real-time stock view', 'Email + chat support'] },
        { tag: 'Multi location',  price: '$669', unit: '/mo',    desc: 'Multi-location. Advanced analytics + API.',       ribbon: 'Most popular',  highlight: true,
          features: ['Cross-location balancing', 'Advanced analytics', 'API integrations', 'Priority support'] },
        { tag: 'Enterprise', price: 'Custom', unit: 'pricing',  desc: 'Unlimited. Custom workflows. Dedicated CSM.',     ribbon: null,           highlight: false,
          features: ['Unlimited locations', 'Custom workflows', 'Dedicated CSM', 'SLAs + procurement-friendly terms'] },
      ],
      revenueLabel: 'Revenue streams',
      revenueRows: [
        ['Onboarding fee', 'one-time, paid up front'],
        ['Subscription', 'monthly or annual, per location'],
        ['Enterprise expansion', 'tier upgrades + custom workflows'],
      ],
      partnerLabel: 'Partner channel · ERP distribution',
      partnerSplit: '70/30',
      partnerDesc: "Revenue-share in AdMel's favor. Partner brings the customer; we bring the product.",
    },

    // ── Team ──
    team: {
      roster: [
        { n: 'Mattis Deila Dusmanu', r: 'Co-founder & CEO', c: 'Opened the distribution deal.' },
        { n: 'David Yuval Hercz', r: 'Co-founder & COO', c: 'Landed the first paying customers.' },
        { n: 'Johannes Aftret', r: 'Co-founder & CTO', c: 'Built AutoStock. Was an inventory manager before AdMel.' },
        { n: 'Victor Figueroa', r: 'Chief AI Officer', c: 'Leads the forecasting models.' },
        { n: 'Bjørn Erik Dahl', r: 'Head of Channel Partnerships', c: 'Commercial director of sales and marketing at Visma, 2012. Three decades in the market.', w: 'Opens ERP distribution deals through his own C-level network.' },
        { n: 'Alexander Wøien', r: 'Shareholder & chairman', c: 'Former head of sales at Finago, one of the largest ERP vendors in the Nordics.', w: 'Former Head of Sales at 24SevenOffice.' },
      ],
      gapTitle: 'What is missing',
      gapBody: 'A senior integration engineer. That is the October 2026 hire.',
      h1a: "We don't cold-pitch the", h1b: 'Nordic ERP world', h1c: ', we already know it.',
      distroLead: '',
      featured: [
        { role: 'Head of Channel Partnerships', desc: "Two decades inside the Nordic ERP and accounting ecosystem, with direct C-level relationships at Unimicro, Tripletex, Finago, and Visma: the exact platforms AutoStock distributes through. He doesn't cold-pitch; he already sits across the table from the executives who decide these deals." },
        { role: 'Shareholder & Chairman', desc: 'Former Head of Sales at 24SevenOffice (Finago), now Country Manager at Fidelix. Deep operator credibility in the same accounting/ERP layer.' },
      ],
      distroClose: 'Together they cover the decision-making layer of our entire distribution strategy.',
      people: {
        mattis:   { role: 'Co-founder & CEO',  desc: 'Opened the Systima distribution deal and recruited Alexander Wøien and Bjørn Erik Dahl: locking in the C-level ERP relationships behind our distribution.', edu: 'Software Engineering, Noroff School of Technology' },
        david:    { role: 'Co-founder & COO',  desc: 'Landed our first paying customers and much of the waitlist: turns relationships into signed pilots.', edu: 'BBA, BI International Business School · International Business, Heriot-Watt University' },
        johannes: { role: 'Co-founder & CTO',  desc: 'Built AutoStock: was an inventory manager before AdMel, so he lived the problem.', edu: 'Information Technology & Finance, Høyskolen Kristiania · Engineering & IT, Griffith University' },
        victor:   { role: 'Chief AI Officer',  desc: 'Leads the forecasting models and the AI the product runs on.', edu: 'BASc Data Science, Høyskolen Kristiania · MCS in Artificial Intelligence, Oslo Metropolitan University' },
        bjorn:    { role: 'Head of Channel Partnerships', desc: 'As Head of Channel Partnerships he opens ERP distribution deals through his C-level network and turns signed partners into repeatable revenue.' },
        alex:     { role: 'Shareholder & Chairman', desc: 'Ex-Head of Sales at 24SevenOffice (Finago), now Country Manager at Fidelix: deep ERP-sales credibility.' },
        per:      { role: 'Strategic Advisor & Investor', desc: 'CEO of Navitas Shipping; investor and early-stage advisor.' },
        geir:     { role: 'Strategic Advisor & Investor', desc: 'CDO & co-founder of Siglar Carbon; has scaled startups and invests early-stage.' },
      },
      distroProofLabel: 'Distribution',
      foundersLabel: 'Founders & team',
      teamLabel: 'Team & Board',
      advisorsLabel: 'Board of Advisors',
    },

    // ── Roadmap ──
    roadmap: {
      h1a: 'One quarter to', h1b: 'launch', h1c: '. Nordics first: world next.',
      lead: 'Two engines: direct sales: much of it from the waitlist, and a partner channel of ERP distributors and accounting firms. Over the year the partner channel scales past direct.',
      directLabel: 'Direct',
      partnerLabel: 'Partner channel',
      arrLabel: 'ARR',
      phases: [
        { q: 'Q3 2026', label: 'Launch', direct: '30', partner: '15',  arr: '$190K–$290K',  milestones: ['Direct: waitlist converts', 'Systima goes live as first partner channel'], state: 'now' },
        { q: 'Q4 2026', label: 'Proof',  direct: '45', partner: '55',  arr: '$480K–$640K',  milestones: ['Partner channel overtakes direct', 'Priced round closes'],                state: 'next' },
        { q: 'Q1 2027', label: 'Scale',  direct: '60', partner: '140', arr: '$960K–$1.3M',  milestones: ['Sweden opened via partner', 'Series A prep begins'],                     state: 'next' },
        { q: 'Q2 2027', label: 'Expand', direct: '75', partner: '325', arr: '$1.9M–$2.6M',  milestones: ['Distributors + accounting firms scale', 'Series A closes'],               state: 'planned' },
      ],
      summaryLabel: 'Launch + 3 quarters',
      summaryCust: '45 → 400 customers',
      summaryArr: '$190K → $2.6M ARR',
      summaryFull: 'Partner channel becomes the primary growth engine',
    },

    // ── KPIs ──
    kpis: {
      h1a: 'Performance numbers', h1b: 'that speak', h1c: 'for themselves.',
      lead: 'These are not targets. These are results from our live pilots: measured, repeatable, and better than anything legacy ERP can offer.',
      stats: [
        {
          value: '1 hr',
          label: 'Onboarding time',
          sub: 'From zero to fully operational. One hour. No IT project, no consultants, no six-month implementation.',
          highlight: false,
        },
        {
          value: '29 sec',
          label: 'First API integration',
          sub: 'Time from initiating the first API connection to live data flowing into AutoStock. 29 seconds.',
          highlight: true,
        },
        {
          value: '22 min',
          label: 'Time to first AI recommendation',
          sub: 'From onboarding start to the first validated AI reorder suggestion appearing in the feed. 22 minutes.',
          highlight: false,
        },
      ],
      footnote: 'Measured across live pilot deployments. Results may vary by ERP configuration.',
    },

    // ── Waitlist ──
    ask: {
      eyebrow: "We're raising [[raise]].",
      h1a: 'Where the', h1b: 'raise', h1c: 'takes us.',
      lead: "This isn't a shopping list. It's the difference between staying founder-led and becoming a distribution machine.",
      engineLabel: 'The engine the raise lets us build',
      hires: [
        { role: 'Meeting-booker partnerships', outcome: 'Instead of hiring a sales team, we partner with meeting-booking firms to fill the pipeline with qualified ERP-partner and customer meetings.' },
        { role: 'Integration lead', outcome: 'Industrializes ERP onboarding: taking each new partner from months to weeks.' },
        { role: 'Marketing', outcome: 'More exposure and demand into the partner channels, filling the pipeline faster than we can build it.' },
      ],
      withoutLabel: 'Without the raise',
      withoutItems: [
        'Founder-led selling, limited bandwidth',
        'Systima channel barely activated',
        'A handful of customers reachable',
        'Runway runs out before the channels turn on',
      ],
      withLabel: 'With the raise',
      withItems: [
        'Booked-meeting partners + marketing actively working the partner channels',
        'Systima live + the next ERP partners opened',
        '~31,900 addressable SMBs reachable through distribution',
        'On track to 400+ customers by Q2 2027: cash-flow positive in 2027',
      ],
      destination: 'The raise takes us from a working product to a scalable revenue engine, and positions us for a priced round at a materially higher valuation.',
    },

    waitlist: {
      h1a: 'Onboarding', h1b: 'waitlist.',
      lead: '8 companies signed up independently: zero paid acquisition. A wide range of industries, all holding inventory, all waiting to go live.',
      cols: ['Company', 'Industry', 'Revenue', 'Segment', 'ERP', 'POS', 'WMS', 'E-Commerce'],
      companies: [
        { name: 'EcoGuard',              industry: 'Hardware',                   rev: '$30M',   segment: 'Enterprise', erp: 'Tripletex',          pos: '',        wms: '',           ecom: '',                    international: true },
        { name: 'PT Nordic AS',          industry: 'Test instruments',           rev: '$3M',    segment: 'SMB',        erp: 'Finago',             pos: '',        wms: 'Masterplan', ecom: 'WooCommerce'         },
        { name: 'Skarpekniver AS',       industry: 'Japanese Knives',            rev: '$2M',    segment: 'SMB',        erp: 'Custom built',       pos: '',        wms: '',           ecom: ''                    },
        { name: 'Golfshopen Billingstad',industry: 'Golf Equipment',             rev: '$25M',   segment: 'Enterprise', erp: 'Tripletex / Xledger',pos: 'Omnium',  wms: '',           ecom: 'Shopify / WooCommerce'},
        { name: 'Dekkspesialisten AS',   industry: 'Tires',                      rev: '$7M',    segment: 'SMB',        erp: 'Tripletex',          pos: '',        wms: '',           ecom: 'Shopify'             },
        { name: 'Smartfilm Norge AS',    industry: 'Smartfilm',                  rev: '$150K',  segment: 'SMB',        erp: 'Tripletex',          pos: '',        wms: '',           ecom: 'Shopify / WooCommerce'},
        { name: 'Suntex AS',             industry: 'Window film',                rev: '$320K',  segment: 'SMB',        erp: 'Tripletex',          pos: '',        wms: '',           ecom: 'Shopify'             },
        { name: 'Art of Business',       industry: 'Book Storage',               rev: '$5K',    segment: 'SMB',        erp: 'Fiken',              pos: '',        wms: '',           ecom: 'Shopify'             },
      ],
      footnote: 'Signed up independently. No paid acquisition. Sorted by sign-up date.',
      totalArr: '$58,116',
      totalArrLabel: 'ARR when all 8 are live',
      totalArrNote: 'Before a single new customer is acquired.',
    },

    // ── Simulation ──
    sim: {
      fifthVendor: 'Unmet demand · AdMel',
      fifthKey: 'SKU 45821',
      fifthMetric: 'Requests',
      fifthValue: '3',
      fifthFoot: 'No record in any system',
      fix: {
        b1: { label: 'Tuesday, 08:14',
              head: 'One product. The buyer has to decide today.',
              body: '' },
        b2: { label: 'What the three systems say',
              reads: [
                { k: 'POS', v: '12' },
                { k: 'ERP', v: '18' },
                { k: 'Webshop', v: '4' },
              ],
              lines: [
                '18 on hand',
                'minus 6 reserved for web orders',
                'minus 4 miscounted at POS',
              ],
              total: '= 8 truly available',
              close: '' },
        b3: { label: 'What no system says',
              hero: '3',
              heroLabel: 'Times someone wanted this last month and it was not there',
              body: 'We recover it from what those customers bought instead.',
              kicker: '' },
        b4: { label: 'The decision',
              sku: 'SKU 45821 · Merino base layer',
              order: 'Order 26 units today',
              qty: '26',
              because: [
                '8 truly available',
                '4 days of cover left',
                'sales up 34% week on week',
                '3 unmet requests last month',
                'nine day lead time',
              ],
              confLabel: 'Confidence', conf: '83%',
              altSku: 'SKU 21104 · Wool socks',
              altConf: '47%',
              altBody: 'Too irregular to call.',
              foot: '',
              askHint: 'Ask why 26' },
        b5: { label: 'The buyer decides',
              approve: 'Approve', override: 'or override',
              approved: 'Approved',
              scope: 'Across 4 200 products, one month',
              hero: '[[freed]]', heroUnit: 'freed up',
              rows: [
                { a: '6.5', b: '0.5', k: 'hours a week reordering' },
                { a: '23',  b: '2',   k: 'times out of stock' },
              ] },
        next: 'Next', replay: 'Replay',
      },
      startLabel: 'What it costs to start',
      startBodyPre: 'Live in ',
      startBodyHi: 'under an hour',
      startBodyPost: '. No implementation project.',
      setup: 'Tuesday morning. The buyer has to decide whether to reorder one product.',
      payoff: 'No system was wrong. Each was answering a different question.',
      reconcilingLabel: 'Time spent reconciling this week',
      // ── Rebuilt simulation ──
      panels: [
        { vendor: 'POS · Lightspeed',    key: 'SKU 45821', metric: 'In stock',   value: '12', foot: 'Last sync 09:14',      stock: true, correct: true },
        { vendor: 'ERP · Visma',         key: 'SKU 45821', metric: 'On hand',    value: '18', foot: 'Last sync yesterday',  stock: true },
        { vendor: 'Ecommerce · Shopify', key: 'SKU 45821', metric: 'Available',  value: '4',  foot: 'Reserved 6',           stock: true },
      ],
      payload: 'Same product. Three answers. Which one do you order from?',
      reconciling: 'Reconciling manually',
      minutes: 'min',
      painMetrics: [
        { label: 'Hours / week on reordering', bad: '6.5',        good: '0.5' },
        { label: 'Stockouts this month',       bad: '23',         good: '2' },
        { label: 'Capital in dead stock',      bad: '[[deadStock]]', good: '[[deadStockAfter]]' },
      ],
      wasLabel: 'was',
      aiRecs: 'AI purchasing recommendations',
      dashTitle: 'The person who orders stock',
      dashScope: 'One retailer · 3 stores · 4 200 SKUs · one month',
      dashRows: [
        { from: '6.5',  to: '0.5',  target: 0.5, dp: 1, label: 'hours a week spent reordering' },
        { from: '23',   to: '2',    target: 2,   dp: 0, label: 'times out of stock' },
        { from: '$41k', to: '$11.8k', target: 11.8, dp: 1, suffix: 'k', label: "Stuck in stock that won't sell" },
      ],
      dashFooter: '[[freed]] freed up. 6 hours a week back.',
      distortion: '$1.77 trillion lost globally each year to stockouts and overstock.',
      distortionSource: 'IHL Group · 2026 Inventory Distortion Study',
      resolveLabel: 'True available',
      resolveValue: '8',
      resolveFrom: { v: '18', k: 'on hand · ERP' },
      resolveSteps: [
        { op: '−', v: '6', k: 'reserved for web orders' },
        { op: '−', v: '4', k: 'miscounted at POS' },
      ],
      resolveNote: '2 more in transit, not available until Thursday',
      sourcesLabel: 'Data sources',
      recWhat: 'What', recHowMuch: 'How much', recWhen: 'When', recWhy: 'Why', recConfidence: 'Confidence',
      recWhatV: 'SKU 45821 · Merino base layer',
      recHowMuchV: '26 units',
      recWhenV: 'Order today · 9 day lead time',
      recWhyV: 'Sales +34% w/w · 4 days cover left',
      recConfidenceV: '83%',

      h1a: 'Three systems. One operator.', h1b: 'AdMel sits in between.',
      opHeader: 'Operator dashboard',
      inControl: 'in control', overwhelmed: 'overwhelmed',
      invValue: 'Inventory value', aiReady: 'AI recommendations ready', actionsToday: 'Actions today',
      savedLabel: 'saved this week', savedValue: '[[saved]]', savedUnit: 'in dead stock',
      compareHint: 'auto-plays: click to compare',
      reduceIn: 'systems in', reduceOut: 'decision out',
      colSources: 'Your systems', colAdmel: 'AdMel · decision layer', colOperator: 'Operator & accounting',
      accHeader: 'Accounting', accAuto: 'automated', accManual: 'manual',
      accLabel: 'Postings booked automatically', accValue: '128 today', accIdle: '– –',
      accChip: 'Entry · 4471',
      withoutLabel: 'Without AdMel', withoutDesc: 'Customer juggles four direct integrations and reconciles siloed data manually.',
      withLabel: 'With AdMel', withDesc: 'One integration. We validate, unify, and surface AI recommendations the customer acts on directly.',
    },

    // ── Train ──
    train: {
      h1a: 'Teach an AI to', h1b: 'see the future', h1c: '.',
      lead: 'Five small steps. No AI background needed.',
      steps: ['Pick a business', 'Spot the pattern', 'Train the AI', 'You vs. the AIs', 'Ask the AI'],
      next: 'Next', done: 'Done', back: 'Back', stepOf: 'STEP',
      s1: {
        heading: 'Pick a business.',
        sub: "The AI will study its sales. We'll come back to your choice through every step.",
        businesses: [
          { icon: '☕', name: 'Coffee shop chain',  desc: 'Steady customers, more in winter: students come back from break.', sku: 'House blend · 250g' },
          { icon: '🧦', name: 'Outdoor apparel',    desc: 'Winter spike, summer slump. Sales taper off year to year.',         sku: 'Wool sock · merino' },
          { icon: '🚲', name: 'Bike retailer',      desc: 'Spring and summer dominate. Cycling tech is on the rise.',          sku: 'Garmin Edge 540' },
        ],
        selected: 'Selected',
        hint: 'Pick whichever feels real to you. Forecasting is the same problem in every business: past on the left, future on the right.',
      },
      s2: {
        heading: 'What pattern do you see?',
        sub: "Trust your eye. You've spotted patterns your whole life.",
        chartLabel: '8 months of',
        options: [
          { id: 'random',   label: 'Random noise',          sub: 'No real pattern: just luck.' },
          { id: 'up',       label: 'Going up over time',    sub: 'Sales are rising year over year.' },
          { id: 'down',     label: 'Going down over time',  sub: 'Sales are slowly declining.' },
          { id: 'seasonal', label: 'A repeating rhythm',    sub: 'Higher and lower months that cycle.' },
        ],
        correctFeedback: 'Exactly. You spotted the rhythm. Now the AI learns to do the same.',
        wrongFeedback: 'Close: look again for the rhythm under the noise.',
      },
      s3: {
        heading: 'Now the AI studies the world.',
        sub: 'Before it sees your business, it reads billions of other charts. Each one teaches it a kind of shape.',
        worldLabel: "The world's data",
        waitBtn: '▶  Let the AI study',
        doneMsg: 'Trained. The AI now carries five kinds of shape in its memory.',
        patterns: [
          { label: 'Seasonal rhythm', desc: 'Coffee, ice cream, ski tickets: all follow the calendar.' },
          { label: 'Slow trend',      desc: 'E-bikes climbing year over year. Heating oil declining.' },
          { label: 'One-time spikes', desc: 'Back to school, Black Friday, product launches.' },
          { label: 'Industry clusters', desc: 'Coffee shops behave like each other, not like factories.' },
          { label: 'Unusual shocks',  desc: 'A pandemic, a supply crisis, and how things settled after.' },
        ],
      },
      s4: {
        heading: 'You vs. the AIs. Predict next month.',
        sub: 'Drag the slider to commit a number for month 9, then lock it in.',
        chartLabel: 'Monthly sales ·',
        guessLabel: 'Your guess · month 9',
        units: 'units',
        lockBtn: 'Lock it in →',
        skipWarning: '⚠ You skipped training in step 3.',
        legend: ['You', 'Cold AI', 'World-Brain AI', 'What happened'],
        closest: 'closest',
        unitOff: 'units off',
        winners: [
          'World AI wins. It saw this shape in other businesses first.',
          'You won! Your eye caught the rhythm: cold AI just averaged.',
          'Cold AI got lucky. The world AI wins on average.',
        ],
        resetBtn: '↺  Try again',
      },
      s5: {
        heading: 'Now ask the AI anything.',
        sub: 'It remembers everything you just walked through.',
        initMsg: "Hi. I'm the AI you just trained. I studied billions of business charts before I ever saw your {biz}. Ask me anything about the forecast, the pattern, or how I work.",
        chips: ['How are you different from ChatGPT?', 'Why was the cold AI so wrong?', 'What would make the forecast change?'],
        placeholder: 'Ask in plain language…',
        sendBtn: 'Ask →',
        thinking: 'thinking…',
        error: 'I lost connection for a moment: try asking again?',
      },
    },

    proofRoom: {
      heroNum: '10',
      eyebrow: 'Proof it works',
      headline: 'Ten retailers pay for this today.',
      sub: 'Small and real. We would rather show you ten paying than sixty in a pipeline.',
      // Anonymised on purpose — sector, size and start date carry what a name
      // would. Entries marked tbd are not confirmed and must be filled before
      // this is sent to anyone.
      customers: [
        { sector: 'Grocery retailer', size: '1 location', since: 'Live since August' },
        { sector: 'Outdoor equipment chain', size: '3 locations', since: 'Live since July' },
      ],
      terms: 'Pre-launch pricing at [[prelaunch]]/month, locked. Converts to founding terms at launch.',
      breakeven: 'Breakeven sits at 54 customers. That is the number this round is aimed at.',
    },
    scaleRoom: {
      eyebrow: 'Proof it scales',
      headline: 'A signed distribution agreement, and what is actually in it.',
      // Left as literal [FILL] markers on purpose: these are commercial terms
      // only Mattis knows, and a plausible guess here is worse than a gap.
      mechanics: [
        { k: 'How we reach them',     v: '[FILL: in-product surface / marketplace listing / their salespeople sell it / co-selling]' },
        { k: 'Who sells',             v: '[FILL: their reps, our reps, or both]' },
        { k: 'First line support',    v: '[FILL: them or us]' },
        { k: 'Who owns the customer', v: '[FILL: contract is with AdMel or with the partner]' },
        { k: 'Term and exclusivity',  v: '[FILL: length, and whether category exclusive]' },
      ],
      penetration: '400 retailers in the partner portfolio. We model 15 percent, which is 60 customers. Breakeven is 54.',
      facts: [
        { v: 'September 2026', k: 'channel goes live' },
        { v: '70/30', k: 'revenue split in our favour' },
      ],
      stats: [
        { v: '400', k: 'retailers in the partner portfolio', fig: 'pool' },
        { v: '15%', k: 'penetration assumed' },
        { v: '60',  k: 'customers from this channel alone' },
      ],
      whyTitle: 'Why they signed',
      why: 'A payroll and accounting vendor tested AutoStock against its own customers before signing. It is the only validation in this deck from someone with something to lose.',
      repeatTitle: 'Why it repeats',
      repeat: 'The first agreement took [FILL: months from first contact to signature] from first contact to signature. A second vendor is now placing a small group of its own customers on AutoStock to observe the integration before it commits.',
      honestTitle: 'What this does not cover',
      honest: 'The 24-month numbers lean on a second partner we have not signed: 64% of customers at month 24 come from it. At April 2027, the milestone this round is set against, that exposure is 14%.',
    },
    moatRoom: {
      eyebrow: 'Why this is hard to copy',
      headline: 'We sit on top of systems that could build this. Here is what actually stops them.',
      pillars: [
        { t: 'Multi-ERP normalisation', b: 'Reconciling three stock schemas and their edge cases is the work.' },
        { t: 'The incentive gap', b: 'Their economics are seats and modules, not per-decision accuracy.' },
        { t: 'Data compounding', b: 'Every retailer improves forecasting for the rest.' },
        { t: 'The channel itself', b: 'An incumbent has to displace an embedded partner.' },
      ],
      ceilingTitle: 'What this does not buy',
      ceiling: 'None of these is permanent. We think they buy roughly eighteen months.',
    },
    marketRoom: {
      eyebrow: 'Market & model',
      heroNum: '1%',
      bottomUpHeadline: '1 242 customers out of 125 000 Norwegian companies that hold inventory is one percent of the market.',
      arithmetic: '1 242 customers × [[blended]] a month × 12 = [[arrBase24]] ARR.',
      blendedNote: 'Two thirds arrive through the channel, where the partner keeps 30%. That is why the blend is below list price.',
      arpu: [
        { k: 'Direct, list', v: '[[listPrice]]/mo' },
        { k: 'Partner channel, net of split', v: '[[partnerNet]]/mo' },
        { k: 'Blended at month 24', v: '[[blended]]/mo' },
        { k: 'Gross margin', v: '85%' },
        { k: 'Variable cost', v: '3.7% of revenue' },
      ],
      nordicTitle: 'The Nordics, as a hypothesis',
      nordic: '',
      bottomUpNote: '',
    },
    askRoom: {
      eyebrow: 'The ask',
      amount: '[[raise]]',
      statement: 'From ten customers to breakeven.',
      // [FILL] markers are rendered in coral. Never substitute a plausible value.
      destination: [
        { v: '54',        k: 'customers' },
        { v: '[[arrBreakeven]]',  k: 'ARR' },
        { v: 'Breakeven', k: 'on a cost base of [[burn]] per month' },
      ],
      mathRows: [
        [ { t: '30 meetings a month', gold: true }, { t: '×' }, { t: '20% close', gold: true }, { t: '=' }, { t: '6 customers a month', gold: true } ],
        [ { t: '44 to go', gold: true }, { t: '=' }, { t: 'eight months', gold: true } ],
      ],
      mathNote: 'Thirty meetings a month from the bookers, at the close rate we see.',
      downside: 'At the 40% our booker agencies deliver elsewhere, four months. The round is sized for eight.',
      buysLabel: 'What it buys',
      buys: 'Meeting bookers, an integration lead, an experienced CRO.',
      closesLine: 'Round closes 1 October. [[committed]] committed by investors, [[remaining]] remaining.',
      bridge: 'This round is a [[raise]] bridge, closing ahead of a priced round. Existing shareholders are participating, alongside a few new investors we have invited in. Innovation Norway has granted [[grant]] on top of it.',
      close: [
        { id: 'call', label: 'Book a call', href: 'mailto:mattis@admel.no?subject=AdMel%20%E2%80%94%20intro%20call' },
        { id: 'dataroom', label: 'Request the data room', href: 'mailto:mattis@admel.no?subject=AdMel%20%E2%80%94%20data%20room%20access' },
      ],
    },
    // ═════════ Layer 2 · evidence. Every spine figure opens its proof here.
    // Sourced from 02_Financials/AdMel_Growth_Model_24M_EUR.xlsx unless noted.
    // ═══════════════════════════════════════════════════════════════════════
    // THE TEMPLATE CONTENT. Nine rooms, one shape each: label, headline,
    // one support paragraph of 45 words or fewer, and two to four figures of
    // which exactly one is dominant. Anything that did not survive that
    // budget was moved into Otto, never deleted.
    // ═══════════════════════════════════════════════════════════════════════
    tpl: {
      problem: {
        tone: 'dark', label: 'The problem',
        headline: 'Every order is a forecast. Most retailers make it from memory.',
        support: 'The buyer only ever sees half of their mistakes. Overstock sits on the shelf where it can be counted. A stockout is a customer who walked out and left no record. The rational response to one-sided feedback is to order more than you need.',
        figures: [
          { code: 'Hrs/wk',     v: '6.5',     k: 'Spent reordering', c: 'coral' },
          { code: 'Stockouts',  v: '23',      k: 'In one month',     c: 'coral' },
          { code: 'Dead stock', v: '[[deadStock]]', k: 'In one month', c: 'coral', dominant: true },
        ],
      },
      proof: {
        tone: 'dark', label: 'Proof it works',
        headline: 'Ten retailers pay for this today.',
        support: 'Small and real. We would rather show you ten paying than sixty in a pipeline. Pre-launch pricing is locked, and converts to founding terms at launch.',
        figures: [
          { code: 'Customers', v: '10',  k: 'Paying today',       c: 'gold', dominant: true, fig: 'customersPaying' },
          { code: 'Price/mo',  v: '[[prelaunch]]', k: 'Pre-launch, locked', c: 'gold' },
          { code: 'Breakeven', v: '54',  k: 'Customers needed',   c: 'gold' },
        ],
      },
      scale: {
        tone: 'light', label: 'Proof it scales',
        // The argument is repeatability, not channel size. Size of one
        // channel is a market question; whether the first agreement can be
        // done again is the scale question.
        headline: 'The first agreement was the hard one.',
        // The cycle time is on the shelf, so it is not repeated here.
        support: 'We do not sell to retailers one at a time. We integrate into the software they already pay for, and the vendor puts us in front of their base. The second vendor is already testing, before it has signed anything.',
        // The two vendors sit adjacent and numbered, so a reader can never be
        // unsure which one a figure belongs to. Gold is the signed one.
        figures: [
          { code: 'Vendor 01',  v: '400',      k: 'Retailers, signed', c: 'gold', small: true, fig: 'pool' },
          { code: 'Cycle time', v: '2',        k: 'Months, contact to signature', c: 'gold', dominant: true },
          { code: 'Vendor 02',  v: 'Testing',  k: 'A small group is live, unsigned' },
          { code: 'Onboarding', v: 'Under 1h', k: 'No services work from us', c: 'gold' },
        ],
      },
      moat: {
        tone: 'dark', label: 'Why this is hard to copy',
        headline: 'Anyone can build the chat. Not what it stands on.',
        support: 'Ask Otto in plain Norwegian. He answers from live stock reconciled across three systems, in your own product codes, and drafts an order. He never sends one. The conversation is a weekend of work. What it stands on is not.',
        figures: [
          { code: 'Systems',     v: '3',  k: 'Behind every answer', c: 'gold' },
          { code: 'Orders sent', v: '0',  k: 'Otto sends none',     c: 'gold' },
          { code: 'Head start',  v: '18', k: 'Months, not more',    c: 'gold', dominant: true },
        ],
      },
      market: {
        tone: 'light', label: 'Market and model',
        // The size of the problem, then the disclaimer, then our own slice.
        // Naming the trillion without disclaiming it in the same breath is
        // the fast way to lose a room, so the disclaimer is on screen rather
        // than left to Otto.
        headline: 'Retailers lose 1.77 trillion dollars a year to this.',
        support: 'That is the global cost of stockouts and overstock, measured by IHL Group across 4 500 retailers. We do not claim a share of it. Our market is the Nordic companies that hold inventory, and Norway is where we sell today.',
        figures: [
          { code: 'Global cost', v: '$1.77T',    k: 'Stockouts and overstock, a year', c: 'coral', dominant: true },
          { code: 'Nordic',      v: '625 000',   k: 'Companies that hold inventory' },
          { code: 'Norway',      v: '125 000',   k: 'Where we sell today', c: 'gold', fig: 'market' },
          { code: 'ARR',         v: '[[arrNordic1pct]]',       k: 'At 6 250 customers, one percent of the Nordics', c: 'gold' },
        ],
      },
      // The room sits between Market and Why now because it answers the
      // question the market size provokes: fine, but what does one customer
      // cost and what does one customer pay back. Every figure here is
      // derived from two inputs, the [[bookersFixed]] a month retainer and the
      // [[listPrice]] list price, so the row cannot drift from the Ask room.
      unit: {
        tone: 'light', label: 'Unit economics',
        headline: 'Every dollar comes back in under two months.',
        support: 'We have no outbound sales team. One booker agency costs [[bookersFixed]] a month. The other is paid [[bookerFee]] per signed customer, which our [[onboarding]] onboarding fee covers. The fixed exposure is [[bookersFixed]] a month, whatever the close rate does.',
        churnLabel: 'On churn',
        churn: 'Ten customers and no history. We are not going to give you an LTV we cannot prove. We will have a churn number after two quarters on ordinary terms.',
        figures: [
          { code: 'CAC',              v: '[[cacPlan]]', k: 'Per customer at plan, net of onboarding' },
          { code: 'Gross margin',     v: '90%',        k: 'Infrastructure [[serveLow]] to [[serveHigh]] per customer' },
          { code: 'Payback, months',  v: '1.5',        k: 'At our planned 20% close', c: 'gold', dominant: true },
          { code: 'Payback, upside',  v: '0.8',        k: 'At 40%' },
        ],
      },
      whynow: {
        tone: 'dark', label: 'Why now',
        headline: 'The category is being funded. Nobody is here yet.',
        support: 'Doss has raised $73M in the US. Whitespace came out of Y Combinator this summer. Both do roughly what we do. Neither is in the Nordics. Shopify had a purchasing forecast tool and shut it down on 31 August.',
        // The competitive view. Four rows, no rules and no boxes: the names
        // carry weight, the reasons carry none, and space does the sorting.
        // Ordered by distance from us, farthest first, so the row that ends
        // the list is the one that matches our thesis.
        rivals: [
          { n: 'RELEX, Slimstock',  w: 'Enterprise and mid-market planning. Three to six months to implement, and RELEX states it is not a fit for small business.' },
          { n: 'EazyStock, AGR',    w: 'Closest to our position, but they sit on an ERP our customer does not have.' },
          { n: 'Rackbeat, GoFact',  w: 'They tell you what you have. Not what to order next week.' },
          { n: 'Doss, Whitespace',  w: 'Same thesis, funded, US only.' },
        ],
        figures: [
          { code: 'Raised',    v: '$73M',   k: 'By the nearest US player' },
          { code: 'In the Nordics', v: '0', k: 'Of them serving Nordic independents', c: 'gold', dominant: true },
          { code: 'Shopify',   v: '31 Aug', k: 'Shut down its own forecast tool' },
        ],
      },
      team: {
        tone: 'dark', label: 'Team',
        headline: 'We do not cold-pitch the Nordic ERP world. We already know it.',
        support: 'Two of the team hold C-level relationships at the exact platforms AutoStock distributes through. Our CTO was an inventory manager before AdMel, so he lived the problem rather than reading about it.',
        figures: [
          { code: 'Team',      v: '6',  k: 'People today',       c: 'gold' },
          { code: 'ERP years', v: '30', k: 'Head of channel partnerships', c: 'gold', dominant: true },
          { code: 'Missing',   v: '1',  k: 'Integration engineer', c: 'coral' },
        ],
      },
      ask: {
        tone: 'light', label: 'The ask',
        headline: 'From ten customers to breakeven.',
        figures: [
          { code: 'Raising',           v: '[[raise]]',        k: 'This round', c: 'gold', dominant: true, fig: 'raise' },
          { code: 'Innovation Norway', v: '[[grant]]',        k: 'Non-dilutive, granted', c: 'gold' },
          { code: 'Breakeven',         v: '54',               k: 'Customers', c: 'gold' },
          { code: 'ARR',               v: '[[arrBreakeven]]', k: 'At that point', c: 'gold' },
        ],
      },
    },
    // ═══════════════════════════════════════════════════════════════════════
    // 02 · THE FIX. Show, then tell. The diagram is the show: three systems
    // that disagree on the left, the decision AutoStock produces in the
    // middle, what changes for the buyer on the right. The three steps below
    // are the tell. Every figure here already exists elsewhere in the deck;
    // [[deadStockAfter]] is [[deadStock]] dead stock less the [[freed]] freed.
    // ═══════════════════════════════════════════════════════════════════════
    fixRoom: {
      label: 'The fix',
      headline: 'Three systems disagree. One decision comes out.',
      sourcesLabel: 'What the systems say',
      sources: [
        { sys: 'POS',       field: 'In stock',  v: '12' },
        { sys: 'ERP',       field: 'On hand',   v: '18' },
        { sys: 'Ecommerce', field: 'Available', v: '4'  },
      ],
      replay: 'Replay',
      // The fourth panel. It is not a system he has, which is the whole
      // point: it occupies the empty position under the three and carries
      // the gold token rather than the hairline, so it reads as ours.
      unmet: {
        sys: 'Unmet demand · AdMel',
        field: 'SKU 45821',
        v: '3 requests',
        note: 'No record in any system',
      },
      unmetCopy: 'A sale that does not happen writes no line anywhere. Three times last month a customer wanted this and it was not there, and none of his systems recorded it. We recover it from what those customers bought instead, from webshop searches that returned nothing, and from the gap against his own baseline. The demand existed. It had nowhere to go.',
      cardBrand: 'AutoStock',
      cardLive: 'Live',
      cardTitle: 'Purchasing recommendation',
      inLabel: 'in', outLabel: 'out', inN: '3', outN: '1',
      truthLabel: 'Truly available', truthV: '8',
      rows: [
        { k: 'What',       v: 'SKU 45821 · Merino base layer' },
        { k: 'How much',   v: '26 units' },
        { k: 'When',       v: 'Order today · 9 day lead time' },
        { k: 'Why',        v: 'Sales up 34% w/w · 4 days cover left' },
        { k: 'Confidence', v: '83%' },
      ],
      outTitle: 'The person who orders stock',
      outScope: 'One retailer · 3 stores · 4 200 SKUs · one month',
      outRows: [
        { a: '6.5',     b: '0.5',     k: 'hours a week reordering' },
        { a: '23',      b: '2',       k: 'times out of stock' },
        { a: '[[deadStock]]', b: '[[deadStockAfter]]', k: 'In dead stock' },
      ],
      outFoot: '[[freed]] freed up. Six hours a week back.',
      // The diagram shows what happens. This says why that is a solution and
      // not another dashboard, which is the question the room has to answer.
      how: 'No system is wrong. Each counts something different, and none of them owns the reorder decision. AutoStock sits above all three, reconciles them into one number, and turns it into an order with its reasoning attached. It is a decision layer, not another system of record.',
    },
    evidence: {
      raise: {
        label: 'The round',
        body: 'This round is a [[raise]] bridge, closing ahead of a priced round, with existing shareholders participating alongside a few invited new investors. It carries the company from ten paying customers to a seed-stage business, counting only channels we have already signed.',
        rows: [
          { k: 'Amount', v: '[[raise]]' },
          { k: 'Instrument', v: 'Bridge, terms shared on request' },
          { k: 'Backing', v: 'Existing shareholders and invited new investors' },
          { k: 'Model equivalent', v: 'EUR 261k' },
        ],
        caveat: 'The growth model was built against EUR 300k. This round is EUR 261k, about 87% of that. The plan below is what 261k funds, not a trimmed version of a larger plan.',
        source: 'Growth model · Assumptions, Base Case 24M',
      },
      useOfFunds: {
        label: 'What the money does',
        body: 'Three activations, in the order the model spends them. Each one is a hire or a contract, not a budget line.',
        rows: [
          { k: 'Meeting-booker agencies', v: 'EUR 10 435/mo\n30 warm leads/mo, 40% close' },
          { k: 'Integration lead', v: 'From Oct 2026' },
          { k: 'Channel CRO', v: 'Full-time from Jan 2027' },
        ],
        caveat: 'The third hire is the one that matters. Until that person is full-time the largest channel in the model does not start, which is why it is funded before it is proven.',
        source: 'Growth model · Summary "Capital activates", Headcount & Opex',
      },
      milestone: {
        label: 'The milestone',
        body: 'Taken from the Base case, which is the floor: it excludes all three unsigned ERP channels entirely.',
        rows: [
          { k: 'Today', v: '7 paying customers' },
          { k: 'April 2027 (month 8)', v: '144 customers' },
          { k: 'ARR at that point', v: '[[arrMonth9]]' },
          { k: 'Breakeven', v: '54 customers' },
          { k: 'From the signed channel', v: '46%' },
          { k: 'From an unsigned channel', v: '14%' },
        ],
        caveat: 'Month 8 is where the model raises its next round. 14% of those 144 come from a channel we have not signed yet. By month 24 that share is 58%, which is the real exposure in this model and the reason the milestone is set at month 8 rather than at the 24-month number.',
        source: 'Growth model · Base Case 24M, months 1-8',
      },
      runway: {
        label: 'Runway',
        body: 'The lowest point comes in March 2027, one month before the next round, and it is tight.',
        rows: [
          { k: 'Lowest cash (at EUR 300k)', v: 'EUR 51k, Mar 2027' },
          { k: 'Adjusted for this round', v: '≈ EUR 12k' },
          { k: 'Monthly burn, funded team', v: '[[burn]]' },
          { k: 'Breakeven', v: '54 customers' },
        ],
        caveat: 'This is the tightest number in the deck and we would rather you saw it from us. At EUR 261k the conservative case passes within about EUR 12k of zero in March 2027, one month before the next raise. It assumes 30 warm leads a month from the start; at 15 the low point comes earlier and goes negative.',
        source: 'Growth model · Base Case 24M, CASH EOP',
      },
      customersPaying: {
        label: 'Ten paying customers',
        body: 'Pre-launch pricing, invoiced monthly. Small enough that we can describe every one of them.',
        rows: [
          { k: 'Paying today', v: '10' },
          { k: 'Price', v: '[[prelaunch]]/mo, locked' },
          { k: 'At launch', v: 'Converts to founding terms' },
          { k: 'Breakeven', v: '54 customers' },
        ],
        caveat: 'Ten is small and we are not going to dress it up. What it buys is that every one of them is a real invoice, and that breakeven is 44 customers away rather than a thousand.',
        source: 'Internal billing · growth model Assumptions',
      },
      pool: {
        label: '400 retailers',
        body: 'The partner’s addressable portfolio, not a waiting list. They are reachable through the channel, not signed up.',
        rows: [
          { k: 'Pool', v: '400 retailers' },
          { k: 'Modelled penetration', v: '50% ceiling' },
          { k: 'Base case reaches', v: '162 by month 24' },
          { k: 'Launch', v: 'September 2026' },
        ],
        caveat: 'The saturation ceiling is modelled explicitly rather than ignored. Even at full penetration this channel alone does not carry the plan, which is why the unsigned channels matter.',
        source: 'Growth model · Assumptions, Base Case 24M',
      },
      split: {
        label: 'The channel economics',
        rows: [
          { k: 'Split', v: '70/30 in our favour' },
          { k: 'Direct ARPU, net', v: '413 EUR/mo' },
          { k: 'Partner ARPU, net', v: '278 EUR/mo' },
          { k: 'Onboarding fee', v: '1 100 direct / 650 partner' },
        ],
        caveat: 'A partner customer is worth about a third less than a direct one. We take that trade because the channel reaches customers we could not afford to acquire directly, and partner churn is lower.',
        source: 'Growth model · Assumptions',
      },
      unsigned: {
        label: 'The unsigned-channel exposure',
        body: 'The part of the model that rests on channels we have not signed. You would find this in diligence, so here it is now.',
        rows: [
          { k: 'Plan case, month 24', v: '39% from three unsigned ERP channels' },
          { k: 'Base case, month 8', v: '14% unsigned' },
          { k: 'Base case, month 24', v: '58% unsigned' },
          { k: 'Signed channel only', v: '162 customers by month 24' },
        ],
        caveat: 'The Base case excludes the three ERP channels entirely, but it still leans on one unsigned partner for most of its month-24 number. Only the near-term milestone is largely carried by signed distribution. We set the ask against that milestone for exactly this reason.',
        source: 'Growth model · Base Case 24M, Plan Case 24M',
      },
      market: {
        label: '125 000 companies',
        body: 'Bottom-up, because you can check it. Norwegian companies that hold inventory. Norway is where we sell; the Nordics are the market.',
        rows: [
          { k: 'Addressable companies', v: '125 000' },
          { k: 'Base case at month 24', v: '1 242 customers' },
          { k: 'That is', v: '1.0% of the market' },
          { k: 'ARR at that point', v: '[[arrBase24]]' },
        ],
        caveat: 'One percent in 24 months is the conservative case, and it depends on channels described above. We are not claiming a share of a trillion-dollar number.',
        source: 'Growth model · Base Case 24M',
      },
      scenarios: {
        label: 'Base and Plan',
        body: 'The Base case is the promise. The Plan case is the upside. The difference is the three unsigned ERP channels.',
        rows: [
          { k: 'Base, month 24', v: '1 242 customers\n[[arrBase24]] ARR' },
          { k: 'Plan, month 24', v: '4 724 customers\n[FILL: Plan-case ARR at the [[listPrice]] list price]' },
          { k: 'What separates them', v: 'Tripletex, PowerOffice, UniMicro' },
        ],
        caveat: 'We lead with Base everywhere in this deck. If the ERP channels sign, the Plan case is what happens; we are not asking you to fund it on that assumption.',
        source: 'Growth model · both scenario sheets',
      },
    },

    // ═════════ Layer 3 · conversation. Pre-written, retrieved not generated.
    objections: {
      proof: [
        { q: 'How many have churned?', a: 'We are confirming the exact figure before publishing it rather than giving you a number we have not checked. Ask and a founder will give you the retention history directly, including anyone who left and why.' },
        { q: 'What do they actually pay?', a: '[[prelaunch]] a month on pre-launch pricing, locked, converting to founding terms at launch. Full list price is [[listPrice]] a month, so these ten are deliberately cheap in exchange for being first.' },
        { q: 'Why only ten?', a: 'Because we have not launched through the distribution channel yet, and we would rather have ten invoices than sixty trials. Breakeven is 54 customers, which is the gap this round closes.' },
      ],
      scale: [
        { q: 'Why does the channel scale without more people?' },
        { q: 'How big is the second vendor\u2019s base?' },
        { q: 'What if the partner does not deliver?', a: 'The Base case caps that channel at 50% of its 400-retailer pool and still models the rest of the growth without it. If it delivers nothing, breakeven at 54 customers is reachable on direct sales alone, but the 24-month numbers do not hold.' },
        { q: 'Who owns the customer relationship?', a: 'We do. The partner distributes and takes 30% of revenue; the contract, the product relationship and the data sit with AdMel.' },
        { q: 'How much of the plan depends on unsigned partners?', a: 'In the Plan case, 39% of month-24 customers come from three ERP channels we have not signed. Even the Base case is 58% dependent on one unsigned partner at month 24, though only 14% at the milestone this round is set against.' },
      ],
      moat: [
        { q: 'What can Otto actually do?', a: 'He reads your live stock and writes two kinds of draft. That is the whole list. Ask what to order and he returns the items at or under their reorder point, ranked by which hurt most if you wait. Ask about a product code and he gives stock on hand, what is already inbound, min/max and lead time, and every code he writes is a link into that item. He also answers how-do-I questions about the page you are standing on, and reads a screenshot you paste.' },
        { q: 'What stops Otto ordering the wrong thing?', a: 'Otto never places an order at all. He proposes a quantity with a reason and gives you two buttons: a recommendation that lands in the same approve-or-reject queue as the ones the system generates itself, or a purchase-order draft. Both are drafts. Nothing reaches a supplier, no stock is reserved, no money moves, and the price is looked up from your own product data rather than taken from anything Otto said. If the product has no supplier or no price, he says so instead of quietly building a broken order.' },
        { q: 'What if Visma builds this?', a: 'They can, for their own data. The problem we solve is three systems disagreeing, which is not a problem an ERP vendor experiences or is paid to fix. Their revenue is seats and modules; ours is decision accuracy, and those pull in different directions.' },
        { q: 'How long does your lead actually last?', a: 'We think about eighteen months. After that the defence has to be the data advantage and the installed base, not the integrations. If neither is real by then, the moat argument fails and we would rather you hold us to that.' },
      ],
      market: [
        { q: 'What about the Nordics?' },
        { q: 'How did you get to these numbers?', a: 'Bottom-up. 125 000 Norwegian companies hold inventory; the Base case reaches 1 242 of them in 24 months, which is one percent, at a blended net ARPU between 278 and 413 EUR a month.' },
        { q: 'What is the churn assumption?', a: '2.5% monthly for direct customers and 1.5% for partner-channel customers. We model churn explicitly rather than assuming zero, which our earlier internal model did.' },
        { q: 'What does this look like without the ERP channels?', a: 'That is the Base case: 1 242 customers and [[arrBase24]] ARR at month 24, versus 4 724 customers in the Plan case. The gap between those two numbers is entirely the three unsigned ERP channels.' },
      ],
      problem: [
        { q: 'Why does the buyer have to forecast at all?' },
        { q: 'How big is this problem?' },
        { q: 'Don\'t ERPs already do this?', a: 'They report what their own system believes. None of them reconciles across the other three, which is exactly where the number goes wrong. An ERP will tell you it has 18 on hand with complete confidence while the shelf has 8.' },
        { q: 'Why hasn\'t anyone solved it?', a: 'Solving it means normalising three stock schemas and their edge cases, which is unglamorous multi-year work with no single vendor incentivised to do it. Each system is correct about its own slice, so nobody experiences the problem except the person ordering.' },
      ],
      unit: [
        { q: 'What happens to CAC when the booker channel saturates?' },
        { q: 'Why is the serving cost range so wide?' },
        { q: 'What is the CAC through the partner channel?' },
        { q: 'When will you have a churn number?' },
      ],
      whynow: [
        { q: 'Why has nobody built this for smaller retailers?' },
        { q: 'What happens when Doss enters the Nordics?' },
        { q: 'Why can\u2019t RELEX just move down market?' },
        { q: 'What if Visma builds this?' },
      ],
      team: [
        { q: 'Why does distribution depend on this team?' },
        { q: 'What is missing from this team?', a: 'A senior integration engineer. We have the ERP relationships and the AI, and the gap is the person who ships connectors at pace. That is the October hire in the use of funds, and it is deliberately the first one.' },
        { q: 'Have you worked together before?', a: 'The three founders have, and the commercial side came in through the ERP network rather than a recruiter, which is why the relationships arrived intact.' },
      ],
      simulation: [
        { q: 'How accurate is the forecast?' },
        { q: 'What if the AI is wrong?' },
        { q: 'How long to go live?' },
        { q: 'How do you recover a sale that never happened?' },
      ],
      thanks: [
        { q: 'What is the single biggest risk here?' },
        { q: 'What are the terms of this round?' },
        { q: 'What is the single biggest risk here?' },
      ],
      ask: [
        { q: 'Where do your close rate assumptions come from?' },
        {
          q: 'What are the terms?',
          a: 'The instrument and headline terms for this round are shared directly with investors on request rather than published in the deck. We do not disclose terms from earlier agreements at all. Ask and you will get the full term sheet the same day.',
        },
        {
          q: 'What if the raise falls short?',
          a: 'Breakeven is 54 customers on a funded cost base of [[burn]] a month. A short raise delays the channel CRO hire, which pushes the largest growth channel to the right, but it does not put the company at risk of running out of cash on the current team.',
        },
        {
          q: 'What does the next round look like?',
          a: 'The model raises again at month 9, May 2027, at 144 customers and [[arrMonth9]] ARR, counting only signed channels. The size of that round is a function of how the channel has performed by then, so we would rather show you the trigger than name a number now.',
        },
        {
          q: 'Why [[raise]] and not more?',
          a: '[[raise]] is what the three activations cost plus a cash floor. Raising more at this stage would price a round on ten customers rather than on a proven channel, which is worse for everyone on the cap table including a new investor.',
        },
      ],
    },
  },

  no: {
    landingAskPlaceholder: 'Spør om hva som helst om selskapet. Otto svarer fra decket.',
    landingExamples: [
      'Hvordan bruker de ti betalende kundene det egentlig?',
      'Hva skjer hvis distribusjonspartneren trekker seg?',
      'Hvorfor skal jeg tro på prisforutsetningene deres?',
    ],
    landingClaim: 'AutoStock bestemmer hva en butikk skal bestille.',
    landingStanding: 'En butikk med 4 000 varer kjører tre systemer som hver rapporterer et forskjellig lagertall, og bestiller på differansen. Innkjøperen kan telle det som ikke ble solgt, men ikke kunden som gikk ut igjen. Vi avstemmer systemene, tar beslutningen, og viser resonnementet bak den. Live på under en time, på systemene butikken allerede har.',
    landingLine: 'Vi selger ikke til butikker. Vi kommer inn i programvaren de allerede betaler for.',
    landingStatus: 'Ti butikker betaler for det i dag. En signert distribusjonsavtale når 400 til fra september. Henter [[raise]].',
    landingEnter: 'Les decket',
    landingRead: 'Sammenhengende lesning',
    landingPdf: 'Last ned PDF',
    ottoRole: 'AI-assistent · AutoStock',
    ottoAsk: 'Spør Otto om hva som helst',
    // ── App chrome ──
    confidential: 'Pre-Seed · {date} · konfidensielt',
    landingHeadline: 'Hei…',
    landingSubtitle: 'Dette er en interaktiv pitchdeck for AdMel. Klikk på en seksjon, eller still et spørsmål. La oss snakke!',
    suggestions: [
      'Hva gjør AdMel egentlig?',
      'Kan dette bli en unicorn?',
      'Hvorfor er Alexander og Bjørn Erik så viktige?',
      'Hvorfor henter dere inn kapital nå?',
      'Hva er den største risikoen deres?',
    ],
    chatPlaceholder: 'Spør Otto om hva som helst…',
    chatFollowUp: 'Still et oppfølgingsspørsmål…',
    chatThinking: 'tenker…',
    youAsked: 'Du spurte',
    deckSays: 'Decket svarer',
    takeToSlide: 'Ta meg til lysbildet →',
    close: 'Lukk',
    kbSend: 'send', kbNav: 'naviger', kbBack: 'tilbake',
    nav: {
      start: 'Start', intro: 'Intro', problem: 'Problem', solution: 'Løsning',
      whynow: 'Hvorfor nå', market: 'Marked', simulation: 'Løsningen', unit: 'Enhetsøkonomi',
      train: 'Tren din AI', competition: 'Konkurrenter', business: 'Forretningsmodell',
      team: 'Team', squad: 'Teamet', roadmap: 'Veikart', ask: 'Hva vi ber om', waitlist: 'Venteliste',
      thanks: 'Takk',
      proof: 'Bevis', scale: 'Skalering', moat: 'Vanskelig å kopiere',
    },

    // ── Intro ──
    intro: {
      h1a: 'AdMel er', h1b: 'beslutningslaget', h1c: 'på toppen av systemene du allerede bruker.',
      lead: 'Systemene dine forteller deg hva du har. AdMel forteller deg hva du trenger, hvor mye, og når.',
      systemsLabel: 'Kobler til systemene du allerede kjører',
      connector: 'Én integrasjon. AdMel sitter på toppen som beslutningslag.',
      decisionLeft: 'Systemene dine forteller deg:',
      decisionLeftValue: 'Hva du har.',
      decisionRight: 'AdMel forteller deg:',
      decisionRightValues: ['Hva du trenger.', 'Hvor mye.', 'Når.'],
      outputsLabel: 'Det du får',
      outputs: [
        { kw: 'Prognoser',     body: 'Etterspørsel projisert per SKU, per lokasjon, hver uke. AdMel leser sesongmønstre, salgshastighet og leverandørledetider, så du vet hva som kommer før det treffer.' },
        { kw: 'Bestillinger',  body: 'Presis, validert, forklarbar. Hver anbefaling kommer med en begrunnelse: "Hvorfor 26 enheter?" besvart hver gang. Ett klikk sender bestillingen rett til leverandøren.' },
        { kw: 'Null dødlager', body: 'Kapital slutter å bli låst i tregtgående varer. Bestselgere er alltid på lager. Trege SKU-er flagges før de blir en avskrivning.' },
      ],
      footerBadge: 'Aktiv · betalende piloter',
      footerText: 'Vi distribuerer gjennom ERP-partnerskap, ikke betalt annonsering.',
      founderFit: 'Vår CTO var lagerforvalter før han bygde dette.',
    },

    // ── Takk (avslutning) ──
    thanks: {
      h1a: 'Takk', h1b: 'for', h1c: ' oppmerksomheten.',
      lead: 'Signert distribusjon. Betalende piloter. En kategori markedet allerede har validert.',
      facts: [
        { v: '400',        k: 'retailere klare gjennom partneren vår' },
        { v: '10',         k: 'betalende piloter live i dag' },
        { v: 'sept. 2026', k: 'partnerlansering' },
      ],
      close: 'Spør gjerne om hva som helst.',
    },

    // ── Squad (avslutningsslide) ──
    squad: {
      eyebrow: 'AdMel',
      h1a: 'Dette er teamet', h1b: 'som leverer.',
      close: 'Signert distribusjon. Betalende piloter. En kategori markedet allerede har validert.',
    },

    // ── Problem ──
    problem: {
      scopeLabel: 'Problemet',
      headline: 'Hver bestilling er en prognose. De fleste butikker lager den fra hukommelsen.',
      body3: 'Innkjøperen ser bare halvparten av feilene. Overlager ligger i hylla og kan telles. En tom hylle er en kunde som gikk ut igjen og ikke etterlot seg noe spor. Den rasjonelle responsen på ensidig tilbakemelding er å bestille mer enn du trenger.',
      measuredLabel: 'Én kunde. Tre butikker. 4 200 varenummer. Én måned før AutoStock.',
      measured: [
        { v: '6,5',     k: 'timer i uka brukt på gjenbestilling' },
        { v: '23',      k: 'tomme hyller' },
        { v: '[[deadStock]]', k: 'I lager som ikke blir solgt' },
      ],
    },

    // ── Solution ──
    solution: {
      h1a: '', h1b: 'AutoStock', h1c: ': en trestegssyklus som holder operatøren i kontroll.',
      lead: 'Én integrasjon erstatter fire. AutoStock samler lagerdataene dine, prognostiserer etterspørsel per SKU, og gjør det om til validerte bestillingsbeslutninger du godkjenner med ett klikk.',
      steps: [
        { tag: 'sanntid',       t: 'Innsikt',   d: 'Alle POS-, ERP-, e-handels- og lagerkilder samlet i én sanntidsvisning: per SKU, per lokasjon. Vasket og avstemt, så tallene endelig er til å stole på.' },
        { tag: 'validert',      t: 'Forslag',   d: 'AI prognostiserer etterspørsel og foreslår nøyaktig bestillingsmengde, med begrunnelsen vist. "Hvorfor 26 enheter?" besvares av sesong, salgshastighet og leverandørledetid.' },
        { tag: 'human-in-loop', t: 'Handling',  d: 'Du godkjenner, AdMel utfører: bestillingen går rett til leverandøren med ett klikk. Ingenting skjer uten operatøren.' },
      ],
      diffLabel: 'Differensiatoren',
      diffBody: 'Hver anbefaling valideres mot reelle begrensninger før den vises: aldri en svart-boks-gjetning. Operatøren beholder kontrollen, og hver godkjent beslutning skjerper modellene.',
    },

    // ── Why Now ──
    whynow: {
      shifts: [
        { k: 'Teknologi', v: 'Prognoser som før krevde et data science-team kjører nå på standard infrastruktur.' },
        { k: 'Tilgang', v: 'ERP-plattformene norske butikker kjører på åpnet API-ene sine.' },
        { k: 'Kapital', v: 'Doss har hentet 73M dollar. Whitespace kom ut av Y Combinators siste kull. Ingen av dem er i Norden.' },
      ],
      honestTitle: 'Hvis de kommer',
      honestBody: '',
      h1a: 'Andre beviser modellen.', h1b: 'Kanalen', h1c: 'er allerede vår.',
      lead: 'To amerikansk-finansierte selskaper bygger akkurat dette produktet, så kategorien er ikke lenger et veddemål, og det er ikke vi som betaler for å bevise den. Det de ikke har, er en nordisk kanal. Vår går live i september 2026 med 400 kunder én varm intro unna.',
      leadAccent: 'september 2026',
      items: [
        { headline: 'Bevis',        stat: '2',   statLabel: 'amerikanske selskaper bygger dette.',
          proof: [{ name: 'Doss', fact: 'hentet $73M totalt' }, { name: 'Whitespace', fact: 'Y Combinator, siste batch' }] },
        { headline: 'Distribusjon', stat: '400', statLabel: 'retailere klare. Signert distribusjonsavtale, partnerlansering i september.' },
        { headline: 'Vinduet',      stat: 'Nå',  statLabel: 'Produkt live. Piloter betaler. Partner lanserer.' },
      ],
      quote: 'Det risikable spørsmålet var om denne kategorien er reell. To finansierte amerikanske selskaper har nettopp svart på det.',
      quoteItalic: 'Vi er de som allerede eier veien inn.',
    },

    // ── Market ──
    market: {
      h1a: 'Vinn Norge først. Ri deretter', h1b: '$192B', h1c: '-bølgen.',
      lead: 'Et konkret, vinnbart hjemmemarked med en ren kile, og en global kategori som vokser 39% i året under oss.',
      sf1: '$399/mnd · blandet ACV per bedrift',
      sf2: 'Norge = kilen',
      sf3: '$192B innen 2034 · tyngdekraften',
      layers: [
        { tag: 'TAM',        scope: 'Norge', label: 'Bedrifter med lager',               value: '$660M', math: '125 000 bedrifter × $399/mnd',   pct: 100, highlight: false, wide: false },
        { tag: 'SAM',        scope: 'Norge', label: 'Kjeder og SMBer uten SAP / Oracle', value: '$130M', math: '~25 000 bedrifter × $399/mnd',   pct: 20,  highlight: true,  wide: false },
        { tag: 'Global TAM', scope: '2034',  label: 'AI i forsyningskjeden',              value: '$192B', math: '39% CAGR · bølgen vi rir etter Norge', pct: 100, highlight: false, wide: true  },
      ],
    },

    // ── Competition ──
    competition: {
      h1a: 'Produktparitet er reelt.', h1b: 'Distribusjon', h1c: 'avgjør kampen.',
      lead: 'Doss og Whitespace matcher oss på produkt, og det er nettopp poenget. Når kapabiliteten er inngangsbilletten, vinner den som når kunden. De må bygge seg inn i Visma, Tripletex, Finago og Unimicro og deretter vinne kanalene fra bunnen. Vi er allerede inne i dem.',
      criteriaLabel: 'Produktkapabilitet, scoret på fire kriterier , ',
      criteria: ['AI-drevne beslutninger', 'Autonom bestilling', 'SMB-vennlig prising', 'Rask utrulling'],
      players: [
        { kind: 'Amerikansk AI-nativ',          name: 'Doss / Whitespace',     blurb: 'Produktet er på høyde med vårt: velfinansiert og troverdig. Det de ikke har, er den nordiske ERP-stacken eller en kanal inn i den.', score: 4, rival: true },
        { kind: 'SMB ERP',                      name: 'Visma / Tripletex',     blurb: 'Eier reskontroen og kundene, men har ikke noe beslutningslag på toppen. De er kanalen vår, ikke konkurrenten.',                        score: 2 },
        { kind: 'Enterprise ERP',               name: 'SAP / Oracle',          blurb: 'Kraftig, men priset og dimensjonert langt over SMB-ene vi betjener.',                                                                   score: 0 },
        { kind: 'Intern utvikling',             name: 'In-house datascience',  blurb: 'Ekte AI, men utenfor rekkevidde for en SMB å bygge, bemanne og vedlikeholde.',                                                          score: 1 },
        { kind: 'AI-nativ, partnerdistribuert', name: 'AdMel',                 blurb: 'Samme kapabilitet: pluss de nordiske ERP-integrasjonene og partnerkanalen som faktisk setter det foran kunden.',                     score: 4, hero: true },
      ],
      scoreLabel: '/ 4',
    },

    // ── Business ──
    business: {
      h1a: 'Priset per', h1b: 'lokasjon', h1c: ', ikke per sete.',
      lead: 'Innmeldingsgebyr pluss månedlig eller årlig abonnement. Enterprise-nivåer har reelt ekspansjonspotensial. Vi bryter bevisst med legacy ERP-setemodellen: operatører bør ikke betale mer fordi flere av teamet bruker verktøyet.',
      tiers: [
        { tag: 'Én lokasjon',       price: '$399', unit: '/mnd',      desc: 'Én lokasjon. Kjerne AI-bestilling.',                ribbon: null,           highlight: false,
          features: ['Kjerne AI-bestillingsmotor', 'Sanntids lagervisning', 'E-post + chat-støtte'] },
        { tag: 'Flere lokasjoner', price: '$669', unit: '/mnd',      desc: 'Flere lokasjoner. Avansert analyse + API.',          ribbon: 'Mest populær', highlight: true,
          features: ['Balansering på tvers av lokasjoner', 'Avansert analyse', 'API-integrasjoner', 'Prioritert support'] },
        { tag: 'Enterprise', price: 'Egendefinert', unit: 'pris',  desc: 'Ubegrenset. Tilpassede arbeidsflyter. Dedikert CSM.', ribbon: null,          highlight: false,
          features: ['Ubegrensede lokasjoner', 'Tilpassede arbeidsflyter', 'Dedikert CSM', 'SLA-er + innkjøpsvennlige vilkår'] },
      ],
      revenueLabel: 'Inntektsstrømmer',
      revenueRows: [
        ['Innmeldingsgebyr', 'engangsbetaling, betalt på forhånd'],
        ['Abonnement', 'månedlig eller årlig, per lokasjon'],
        ['Enterprise-vekst', 'nivåoppgraderinger + tilpassede arbeidsflyter'],
      ],
      partnerLabel: 'Partnerkanal · ERP-distribusjon',
      partnerSplit: '70/30',
      partnerDesc: 'Inntektsdeling til AdMels fordel. Partner bringer kunden; vi bringer produktet.',
    },

    // ── Team ──
    team: {
      roster: [
        { n: 'Mattis Deila Dusmanu', r: 'Gründer og CEO', c: 'Åpnet distribusjonsavtalen.' },
        { n: 'David Yuval Hercz', r: 'Gründer og COO', c: 'Landet de første betalende kundene.' },
        { n: 'Johannes Aftret', r: 'Gründer og CTO', c: 'Bygget AutoStock. Var lageransvarlig før AdMel.' },
        { n: 'Victor Figueroa', r: 'Chief AI Officer', c: 'Leder prognosemodellene.' },
        { n: 'Bjørn Erik Dahl', r: 'Head of Channel Partnerships', c: 'Kommersiell direktør for salg og marked i Visma i 2012. Tre tiår i markedet.', w: 'Åpner ERP-distribusjonsavtaler gjennom sitt eget C-nivå-nettverk.' },
        { n: 'Alexander Wøien', r: 'Aksjonær og styreleder', c: 'Tidligere salgssjef i Finago, en av Nordens største ERP-leverandører.', w: 'Tidligere salgssjef i 24SevenOffice.' },
      ],
      gapTitle: 'Hva som mangler',
      gapBody: 'En senior integrasjonsutvikler. Det er oktober 2026-ansettelsen.',
      h1a: 'Vi cold-pitcher ikke', h1b: 'nordisk ERP', h1c: ', vi kjenner det allerede.',
      distroLead: '',
      featured: [
        { role: 'Head of Channel Partnerships', desc: 'To tiår i det nordiske ERP- og regnskapsøkosystemet, med direkte C-nivå-relasjoner hos Unimicro, Tripletex, Finago og Visma: akkurat plattformene AutoStock distribuerer gjennom. Han cold-pitcher ikke; han sitter allerede ved bordet med lederne som avgjør disse avtalene.' },
        { role: 'Aksjonær & styreleder', desc: 'Tidligere salgssjef i 24SevenOffice (Finago), nå Country Manager i Fidelix. Dyp operatør-troverdighet i samme regnskaps-/ERP-lag.' },
      ],
      distroClose: 'Sammen dekker de beslutningslaget i hele distribusjonsstrategien vår.',
      people: {
        mattis:   { role: 'Gründer & CEO',  desc: 'Åpnet Systima-avtalen og hentet inn Alexander Wøien og Bjørn Erik Dahl, og låste dermed C-nivå-relasjonene som distribusjonen vår hviler på.', edu: 'Software Engineering, Noroff School of Technology' },
        david:    { role: 'Gründer & COO',  desc: 'Landet våre første betalende kunder og store deler av ventelisten: gjør relasjoner om til signerte piloter.', edu: 'BBA, BI International Business School · International Business, Heriot-Watt University' },
        johannes: { role: 'Gründer & CTO',  desc: 'Bygget AutoStock: han var lagerforvalter før AdMel, og levde problemet selv.', edu: 'IT & finans, Høyskolen Kristiania · Engineering & IT, Griffith University' },
        victor:   { role: 'Chief AI Officer', desc: 'Leder prognosemodellene og AI-en produktet kjører på.', edu: 'BASc Data Science, Høyskolen Kristiania · MCS in Artificial Intelligence, OsloMet' },
        bjorn:    { role: 'Head of Channel Partnerships', desc: 'Som Head of Channel Partnerships åpner han ERP-distribusjonsavtaler gjennom sitt C-nivå-nettverk og gjør signerte partnere om til repeterbar inntekt.' },
        alex:     { role: 'Aksjonær & styreleder', desc: 'Tidligere salgssjef i 24SevenOffice (Finago), nå Country Manager i Fidelix: tung troverdighet innen ERP-salg.' },
        per:      { role: 'Strategisk rådgiver & investor', desc: 'CEO i Navitas Shipping; investor og rådgiver i tidlig fase.' },
        geir:     { role: 'Strategisk rådgiver & investor', desc: 'CDO og medgründer av Siglar Carbon; har skalert oppstartsselskaper og investerer i tidlig fase.' },
      },
      distroProofLabel: 'Distribusjon',
      foundersLabel: 'Gründere & team',
      teamLabel: 'Team & styre',
      advisorsLabel: 'Rådgivende styre',
    },

    // ── Roadmap ──
    roadmap: {
      h1a: 'Ett kvartal til', h1b: 'lansering', h1c: '. Norden først: verden neste.',
      lead: 'To motorer: direktesalg: mye fra ventelisten, og en partnerkanal av ERP-distributører og regnskapsbyråer. I løpet av året vokser partnerkanalen forbi direktesalget.',
      directLabel: 'Direkte',
      partnerLabel: 'Partnerkanal',
      arrLabel: 'ARR',
      phases: [
        { q: 'Q3 2026', label: 'Lansering', direct: '30', partner: '15',  arr: '$190K–$290K',  milestones: ['Direkte: ventelisten konverterer', 'Systima går live som første partnerkanal'], state: 'now' },
        { q: 'Q4 2026', label: 'Bevis',     direct: '45', partner: '55',  arr: '$480K–$640K',  milestones: ['Partnerkanalen passerer direktesalg', 'Priset runde lukkes'],                  state: 'next' },
        { q: 'Q1 2027', label: 'Skala',     direct: '60', partner: '140', arr: '$960K–$1,3M',  milestones: ['Sverige åpnet via partner', 'Serie A-forberedelse starter'],                  state: 'next' },
        { q: 'Q2 2027', label: 'Ekspander', direct: '75', partner: '325', arr: '$1,9M–$2,6M',  milestones: ['Distributører + regnskapsbyråer skalerer', 'Serie A lukkes'],                  state: 'planned' },
      ],
      summaryLabel: 'Lansering + 3 kvartaler',
      summaryCust: '45 → 400 kunder',
      summaryArr: '$190K → $2,6M ARR',
      summaryFull: 'Partnerkanalen blir den primære vekstmotoren',
    },

    // ── KPIer ──
    kpis: {
      h1a: 'Prestasjonstall', h1b: 'som taler', h1c: 'for seg selv.',
      lead: 'Dette er ikke mål. Dette er resultater fra våre live piloter: målte, repeterbare, og bedre enn alt legacy ERP kan tilby.',
      stats: [
        {
          value: '1 t',
          label: 'Onboarding-tid',
          sub: 'Fra null til fullt operasjonell. Én time. Ingen IT-prosjekt, ingen konsulenter, ingen seks måneders implementering.',
          highlight: false,
        },
        {
          value: '29 sek',
          label: 'Første API-integrasjon',
          sub: 'Tid fra oppstart av første API-tilkobling til live data strømmer inn i AutoStock. 29 sekunder.',
          highlight: true,
        },
        {
          value: '22 min',
          label: 'Tid til første AI-anbefaling',
          sub: 'Fra onboarding-start til første validerte AI-bestillingsanbefaling vises i feeden. 22 minutter.',
          highlight: false,
        },
      ],
      footnote: 'Målt på tvers av live pilotdistribusjoner. Resultater kan variere etter ERP-konfigurasjon.',
    },

    // ── Waitlist ──
    ask: {
      eyebrow: 'Vi henter inn [[raise]].',
      h1a: 'Hvor', h1b: 'kapitalen', h1c: 'tar oss.',
      lead: 'Dette er ikke en handleliste. Det er forskjellen mellom å forbli grunnlegger-drevet og å bli en distribusjonsmaskin.',
      engineLabel: 'Motoren kapitalen lar oss bygge',
      hires: [
        { role: 'Partnerskap med møtebookere', outcome: 'I stedet for å ansette et salgsteam samarbeider vi med møtebooking-firmaer som fyller pipelinen med kvalifiserte ERP-partner- og kundemøter.' },
        { role: 'Integrasjonsleder', outcome: 'Industrialiserer ERP-onboarding: tar hver ny partner fra måneder til uker.' },
        { role: 'Markedsføring', outcome: 'Mer eksponering og etterspørsel inn i partnerkanalene, fyller pipelinen raskere enn vi klarer å bygge.' },
      ],
      withoutLabel: 'Uten kapitalen',
      withoutItems: [
        'Grunnlegger-drevet salg, begrenset kapasitet',
        'Systima-kanalen knapt aktivert',
        'En håndfull kunder innen rekkevidde',
        'Runway tar slutt før kanalene skrus på',
      ],
      withLabel: 'Med kapitalen',
      withItems: [
        'Bookede møter via partnere + markedsføring som aktivt jobber partnerkanalene',
        'Systima live + de neste ERP-partnerne åpnet',
        '~31 900 adresserbare SMB-er innen rekkevidde via distribusjon',
        'På vei mot 400+ kunder innen Q2 2027: kontantstrøm-positiv i 2027',
      ],
      destination: 'Kapitalen tar oss fra et fungerende produkt til en skalerbar inntektsmotor, og posisjonerer oss for en priset runde til en vesentlig høyere verdsettelse.',
    },

    waitlist: {
      h1a: 'Onboarding', h1b: 'venteliste.',
      lead: '8 bedrifter meldt seg på selv: ingen betalt markedsføring. Bred bransjebredde, alle med varelager, alle klare til å gå live.',
      cols: ['Bedrift', 'Bransje', 'Omsetning', 'Segment', 'ERP', 'POS', 'WMS', 'E-handel'],
      companies: [
        { name: 'EcoGuard',              industry: 'Maskinvare',                 rev: '$30M',   segment: 'Enterprise', erp: 'Tripletex',          pos: '',        wms: '',           ecom: '',                    international: true },
        { name: 'PT Nordic AS',          industry: 'Testinstrumenter',           rev: '$3M',    segment: 'SMB',        erp: 'Finago',             pos: '',        wms: 'Masterplan', ecom: 'WooCommerce'         },
        { name: 'Skarpekniver AS',       industry: 'Japanske kniver',            rev: '$2M',    segment: 'SMB',        erp: 'Egenutviklet',       pos: '',        wms: '',           ecom: ''                    },
        { name: 'Golfshopen Billingstad',industry: 'Golfutstyr',                 rev: '$25M',   segment: 'Enterprise', erp: 'Tripletex / Xledger',pos: 'Omnium',  wms: '',           ecom: 'Shopify / WooCommerce'},
        { name: 'Dekkspesialisten AS',   industry: 'Dekk',                       rev: '$7M',    segment: 'SMB',        erp: 'Tripletex',          pos: '',        wms: '',           ecom: 'Shopify'             },
        { name: 'Smartfilm Norge AS',    industry: 'Smartfilm',                  rev: '$150K',  segment: 'SMB',        erp: 'Tripletex',          pos: '',        wms: '',           ecom: 'Shopify / WooCommerce'},
        { name: 'Suntex AS',             industry: 'Vindusfilm',                 rev: '$320K',  segment: 'SMB',        erp: 'Tripletex',          pos: '',        wms: '',           ecom: 'Shopify'             },
        { name: 'Art of Business',       industry: 'Boklagring',                 rev: '$5K',    segment: 'SMB',        erp: 'Fiken',              pos: '',        wms: '',           ecom: 'Shopify'             },
      ],
      footnote: 'Meldte seg på uoppfordret. Ingen betalt anskaffelse. Sortert etter påmeldingsdato.',
      totalArr: '$58 116',
      totalArrLabel: 'ARR når alle 8 er live',
      totalArrNote: 'Før én eneste ny kunde er hentet inn.',
    },

    // ── Simulation ──
    sim: {
      fifthVendor: 'Udekket etterspørsel · AdMel',
      fifthKey: 'SKU 45821',
      fifthMetric: 'Forespørsler',
      fifthValue: '3',
      fifthFoot: 'Ingen spor i noe system',
      fix: {
        b1: { label: 'Tirsdag, 08:14',
              head: 'Én vare. Innkjøperen må bestemme seg i dag.',
              body: '' },
        b2: { label: 'Hva de tre systemene sier',
              reads: [
                { k: 'Kasse', v: '12' },
                { k: 'ERP', v: '18' },
                { k: 'Nettbutikk', v: '4' },
              ],
              lines: [
                '18 på lager',
                'minus 6 reservert til nettordrer',
                'minus 4 feiltalt i kassa',
              ],
              total: '= 8 reelt tilgjengelig',
              close: '' },
        b3: { label: 'Hva ingen systemer sier',
              hero: '3',
              heroLabel: 'Ganger noen ville ha denne forrige måned og den ikke var der',
              body: 'Vi henter det tilbake fra hva de kundene kjøpte i stedet.',
              kicker: '' },
        b4: { label: 'Beslutningen',
              sku: 'SKU 45821 · Merino innerlag',
              order: 'Bestill 26 enheter i dag',
              qty: '26',
              because: [
                '8 reelt tilgjengelig',
                '4 dagers dekning igjen',
                'salg opp 34% uke over uke',
                '3 udekkede forespørsler forrige måned',
                'ni dagers ledetid',
              ],
              confLabel: 'Sikkerhet', conf: '83%',
              altSku: 'SKU 21104 · Ullsokker',
              altConf: '47%',
              altBody: 'For uregelmessig til å kalle.',
              foot: '',
              askHint: 'Spør hvorfor 26' },
        b5: { label: 'Innkjøperen bestemmer',
              approve: 'Godkjenn', override: 'eller overstyr',
              approved: 'Godkjent',
              scope: 'Over 4 200 varer, én måned',
              hero: '[[freed]]', heroUnit: 'frigjort',
              rows: [
                { a: '6,5', b: '0,5', k: 'timer i uka på gjenbestilling' },
                { a: '23',  b: '2',   k: 'ganger tom for varer' },
              ] },
        next: 'Neste', replay: 'Spill av igjen',
      },
      startLabel: 'Hva det koster å komme i gang',
      startBodyPre: 'Live på ',
      startBodyHi: 'under en time',
      startBodyPost: '. Ingen implementeringsprosjekt.',
      setup: 'Tirsdag morgen. Innkjøperen skal avgjøre om én vare skal bestilles på nytt.',
      payoff: 'Ingen av systemene tok feil. Hvert svarte på et forskjellig spørsmål.',
      reconcilingLabel: 'Tid brukt på avstemming denne uka',
      // ── Rebuilt simulation ──
      panels: [
        { vendor: 'POS · Lightspeed',    key: 'SKU 45821', metric: 'På lager',     value: '12', foot: 'Sist synk 09:14',  stock: true, correct: true },
        { vendor: 'ERP · Visma',         key: 'SKU 45821', metric: 'Beholdning',   value: '18', foot: 'Sist synk i går',  stock: true },
        { vendor: 'Ecommerce · Shopify', key: 'SKU 45821', metric: 'Tilgjengelig', value: '4',  foot: 'Reservert 6',      stock: true },
      ],
      payload: 'Samme vare. Tre svar. Hvilket bestiller du etter?',
      reconciling: 'Avstemmer manuelt',
      minutes: 'min',
      painMetrics: [
        { label: 'Timer / uke på bestilling', bad: '6,5',         good: '0,5' },
        { label: 'Tomme hyller denne måneden', bad: '23',         good: '2' },
        { label: 'Kapital i dødlager',        bad: '[[deadStock]]', good: '[[deadStockAfter]]' },
      ],
      wasLabel: 'var',
      aiRecs: 'AI-anbefalinger for innkjøp',
      dashTitle: 'Personen som bestiller varer',
      dashScope: 'Én retailer · 3 butikker · 4 200 varenummer · én måned',
      dashRows: [
        { from: '6,5',  to: '0,5',  target: 0.5, dp: 1, label: 'timer i uka på bestilling' },
        { from: '23',   to: '2',    target: 2,   dp: 0, label: 'ganger tom på lager' },
        { from: '$41k', to: '$11,8k', target: 11.8, dp: 1, suffix: 'k', label: 'Bundet i varer som ikke selger' },
      ],
      dashFooter: '[[freed]] frigjort. 6 timer i uka tilbake.',
      distortion: '1,77 billioner dollar tapt globalt hvert år på tomme hyller og overlager.',
      distortionSource: 'IHL Group · Inventory Distortion Study 2026',
      resolveLabel: 'Faktisk tilgjengelig',
      resolveValue: '8',
      resolveFrom: { v: '18', k: 'beholdning · ERP' },
      resolveSteps: [
        { op: '−', v: '6', k: 'reservert for nettordre' },
        { op: '−', v: '4', k: 'feiltelt på kassa' },
      ],
      resolveNote: '2 til er underveis, ikke tilgjengelig før torsdag',
      sourcesLabel: 'Datakilder',
      recWhat: 'Hva', recHowMuch: 'Hvor mye', recWhen: 'Når', recWhy: 'Hvorfor', recConfidence: 'Sikkerhet',
      recWhatV: 'SKU 45821 · Merino innerlag',
      recHowMuchV: '26 stk',
      recWhenV: 'Bestill i dag · 9 dagers ledetid',
      recWhyV: 'Salg +34% u/u · 4 dagers dekning',
      recConfidenceV: '83%',

      h1a: 'Tre systemer. Én operatør.', h1b: 'AdMel er i midten.',
      opHeader: 'Operatørdashbord',
      inControl: 'i kontroll', overwhelmed: 'overveldet',
      invValue: 'Lagerverdi', aiReady: 'AI-anbefalinger klare', actionsToday: 'Handlinger i dag',
      savedLabel: 'spart denne uken', savedValue: '[[saved]]', savedUnit: 'i dødlager',
      compareHint: 'spilles automatisk: klikk for å sammenligne',
      reduceIn: 'systemer inn', reduceOut: 'beslutning ut',
      colSources: 'Systemene dine', colAdmel: 'AdMel · beslutningslag', colOperator: 'Operatør & regnskap',
      accHeader: 'Regnskap', accAuto: 'automatisert', accManual: 'manuelt',
      accLabel: 'Bilag bokført automatisk', accValue: '128 i dag', accIdle: '– –',
      accChip: 'Bilag · 4471',
      withoutLabel: 'Uten AdMel', withoutDesc: 'Kunden håndterer fire direkte integrasjoner og avstemmer siloisolerte data manuelt.',
      withLabel: 'Med AdMel', withDesc: 'Én integrasjon. Vi validerer, forener og presenterer AI-anbefalinger som kunden handler på direkte.',
    },

    // ── Train ──
    train: {
      h1a: 'Lær en AI å', h1b: 'se fremtiden', h1c: '.',
      lead: 'Fem enkle steg. Ingen AI-bakgrunn nødvendig.',
      steps: ['Velg en bedrift', 'Finn mønsteret', 'Tren AI-en', 'Du mot AI-ene', 'Spør AI-en'],
      next: 'Neste', done: 'Ferdig', back: 'Tilbake', stepOf: 'STEG',
      s1: {
        heading: 'Velg en bedrift.',
        sub: 'AI-en vil studere salget. Vi vender tilbake til valget ditt gjennom hvert steg.',
        businesses: [
          { icon: '☕', name: 'Kaffekjede',          desc: 'Stabile kunder, mer om vinteren: studenter er tilbake fra pause.', sku: 'Husbrygg · 250g' },
          { icon: '🧦', name: 'Friluftsbekleidning', desc: 'Vintertopp, sommerbunn. Salget avtar år for år.',                   sku: 'Ullsokk · merino' },
          { icon: '🚲', name: 'Sykkelforhandler',    desc: 'Vår og sommer dominerer. Sykkelteknologi er på vei opp.',           sku: 'Garmin Edge 540' },
        ],
        selected: 'Valgt',
        hint: 'Velg det som virker reelt for deg. Prognoser er det samme problemet i alle bedrifter: fortiden til venstre, fremtiden til høyre.',
      },
      s2: {
        heading: 'Hvilket mønster ser du?',
        sub: 'Stol på øyet ditt. Du har oppdaget mønstre hele livet.',
        chartLabel: '8 måneder av',
        options: [
          { id: 'random',   label: 'Tilfeldig støy',          sub: 'Intet reelt mønster: bare tilfeldigheter.' },
          { id: 'up',       label: 'Oppadgående over tid',    sub: 'Salget stiger fra år til år.' },
          { id: 'down',     label: 'Nedadgående over tid',    sub: 'Salget synker sakte.' },
          { id: 'seasonal', label: 'En gjentakende rytme',    sub: 'Høyere og lavere måneder som syklerer.' },
        ],
        correctFeedback: 'Akkurat. Du oppdaget rytmen. Nå lærer AI-en å gjøre det samme.',
        wrongFeedback: 'Nesten: se etter rytmen under støyen igjen.',
      },
      s3: {
        heading: 'Nå studerer AI-en verden.',
        sub: 'Før den ser din bedrift, leser den milliarder av andre grafer. Hver lærer den en slags form.',
        worldLabel: 'Verdens data',
        waitBtn: '▶  La AI-en studere',
        doneMsg: 'Trent. AI-en bærer nå fem slags form i minnet sitt.',
        patterns: [
          { label: 'Sesongmessig rytme',  desc: 'Kaffe, iskrem, skibilletter: alt følger kalenderen.' },
          { label: 'Sakte trend',          desc: 'E-sykler stiger år for år. Fyringsolje synker.' },
          { label: 'Engangstopper',        desc: 'Skolestart, Black Friday, produktlanseringer.' },
          { label: 'Bransjeclusters',      desc: 'Kaffebarer oppfører seg som hverandre, ikke som fabrikker.' },
          { label: 'Uvanlige sjokk',       desc: 'En pandemi, en forsyningskrise, og hvordan ting stabiliserte seg etterpå.' },
        ],
      },
      s4: {
        heading: 'Du mot AI-ene. Forutsi neste måned.',
        sub: 'Dra glidebryteren for å bestemme et tall for måned 9, og lås det inn.',
        chartLabel: 'Månedlig salg ·',
        guessLabel: 'Din gjetning · måned 9',
        units: 'enheter',
        lockBtn: 'Lås det inn →',
        skipWarning: '⚠ Du hoppet over trening i steg 3.',
        legend: ['Du', 'Kald AI', 'Verdens-AI', 'Det som skjedde'],
        closest: 'nærmest',
        unitOff: 'enheter feil',
        winners: [
          'Verdens-AI vinner. Den så denne formen i andre bedrifter først.',
          'Du vant! Øyet ditt fanget rytmen: kald AI bare gjennomsnitterte.',
          'Kald AI hadde flaks. Verdens-AI vinner i snitt.',
        ],
        resetBtn: '↺  Prøv igjen',
      },
      s5: {
        heading: 'Spør AI-en nå.',
        sub: 'Den husker alt du nettopp gikk gjennom.',
        initMsg: 'Hei: jeg er AI-en du nettopp trente. Jeg studerte milliarder av forretningsgrafer før jeg noen gang så din {biz}. Still meg hva som helst om prognosen, mønsteret, eller hvordan jeg fungerer.',
        chips: ['Hvordan er du forskjellig fra ChatGPT?', 'Hvorfor tok den kalde AI-en så feil?', 'Hva ville få prognosen til å endre seg?'],
        placeholder: 'Still et spørsmål på vanlig språk…',
        sendBtn: 'Spør →',
        thinking: 'tenker…',
        error: 'Jeg mistet tilkoblingen et øyeblikk: prøv å spørre igjen?',
      },
    },

    proofRoom: {
      heroNum: '10',
      eyebrow: 'Bevis for at det virker',
      headline: 'Ti butikkjeder betaler for dette i dag.',
      sub: 'Lite og ekte. Vi viser heller ti som betaler enn seksti i en pipeline.',
      customers: [
        { sector: 'Dagligvarebutikk', size: '1 lokasjon', since: 'Live siden august' },
        { sector: 'Friluftskjede', size: '3 lokasjoner', since: 'Live siden juli' },
      ],
      terms: 'Førlansering-pris på [[prelaunch]]/mnd, låst. Går over til founding-vilkår ved lansering.',
      breakeven: 'Break-even ligger på 54 kunder. Det er tallet denne runden sikter mot.',
    },
    scaleRoom: {
      eyebrow: 'Bevis for at det skalerer',
      headline: 'En signert distribusjonsavtale, og hva som faktisk står i den.',
      mechanics: [
        { k: 'Hvordan vi når dem',      v: '[FILL: in-product surface / marketplace listing / their salespeople sell it / co-selling]' },
        { k: 'Hvem selger',             v: '[FILL: their reps, our reps, or both]' },
        { k: 'Førstelinjesupport',      v: '[FILL: them or us]' },
        { k: 'Hvem eier kunden',        v: '[FILL: contract is with AdMel or with the partner]' },
        { k: 'Varighet og eksklusivitet', v: '[FILL: length, and whether category exclusive]' },
      ],
      penetration: '400 butikker i partnerens portefølje. Vi modellerer 15 prosent, som er 60 kunder. Break-even er 54.',
      facts: [
        { v: 'September 2026', k: 'kanalen går live' },
        { v: '70/30', k: 'inntektsdeling i vår favør' },
      ],
      stats: [
        { v: '400', k: 'butikker i partnerens portefølje', fig: 'pool' },
        { v: '15%', k: 'antatt penetrasjon' },
        { v: '60',  k: 'kunder fra denne kanalen alene' },
      ],
      whyTitle: 'Hvorfor de signerte',
      why: 'En lønns- og regnskapsleverandør testet AutoStock mot sine egne kunder før de signerte. Det er den eneste valideringen i dette decket fra noen som har noe å tape.',
      repeatTitle: 'Hvorfor det gjentar seg',
      repeat: 'Den første avtalen tok [FILL: months from first contact to signature] fra første kontakt til signatur. En andre leverandør legger nå en liten gruppe av sine egne kunder på AutoStock for å se integrasjonen før de forplikter seg.',
      honestTitle: 'Hva dette ikke dekker',
      honest: '24-månederstallene lener seg på en andre partner vi ikke har signert: 64% av kundene ved måned 24 kommer derfra. Ved april 2027, milepælen denne runden er satt mot, er eksponeringen 14%.',
    },
    moatRoom: {
      eyebrow: 'Hvorfor dette er vanskelig å kopiere',
      headline: 'Vi sitter oppå systemer som kunne bygget dette. Her er hva som faktisk stopper dem.',
      pillars: [
        { t: 'Normalisering på tvers av ERP', b: 'Å avstemme tre lagerskjemaer og alle unntakene er selve jobben.' },
        { t: 'Insentivgapet', b: 'Økonomien deres er lisenser og moduler, ikke treffsikkerhet per beslutning.' },
        { t: 'Data som forsterker seg', b: 'Hver butikk forbedrer prognosene for de andre.' },
        { t: 'Kanalen i seg selv', b: 'En etablert aktør må fortrenge en innarbeidet partner.' },
      ],
      ceilingTitle: 'Hva dette ikke kjøper',
      ceiling: 'Ingen av disse er permanente. Vi tror de kjøper omtrent atten måneder.',
    },
    marketRoom: {
      eyebrow: 'Marked og modell',
      heroNum: '1%',
      bottomUpHeadline: '1 242 kunder av 125 000 norske selskaper som fører lager er én prosent av markedet.',
      arithmetic: '1 242 kunder × [[blended]] i måneden × 12 = [[arrBase24]] ARR.',
      blendedNote: 'To tredjedeler kommer gjennom kanalen, der partneren beholder 30%. Derfor ligger blandingen under listepris.',
      arpu: [
        { k: 'Direkte, listepris', v: '[[listPrice]]/mnd' },
        { k: 'Partnerkanal, etter deling', v: '[[partnerNet]]/mnd' },
        { k: 'Blandet ved måned 24', v: '[[blended]]/mnd' },
        { k: 'Bruttomargin', v: '85%' },
        { k: 'Variabel kostnad', v: '3,7% av omsetning' },
      ],
      nordicTitle: 'Norden, som hypotese',
      nordic: '',
      bottomUpNote: '',
    },
    askRoom: {
      eyebrow: 'Runden',
      amount: '[[raise]]',
      statement: 'Fra ti kunder til break-even.',
      destination: [
        { v: '54',        k: 'kunder' },
        { v: '[[arrBreakeven]]',  k: 'ARR' },
        { v: 'Break-even', k: 'på en kostnadsbase på [[burn]] i måneden' },
      ],
      mathRows: [
        [ { t: '30 møter i måneden', gold: true }, { t: '×' }, { t: '20% close', gold: true }, { t: '=' }, { t: '6 kunder i måneden', gold: true } ],
        [ { t: '44 igjen', gold: true }, { t: '=' }, { t: 'åtte måneder', gold: true } ],
      ],
      mathNote: 'Tretti møter i måneden fra bookerne, med close-raten vi faktisk ser.',
      downside: 'Med de 40% bookerbyråene våre leverer andre steder, fire måneder. Runden er dimensjonert for åtte.',
      buysLabel: 'Hva det kjøper',
      buys: 'Møtebookere, en integrasjonsleder, en erfaren CRO.',
      closesLine: 'Runden lukkes 1. oktober. [[committed]] bekreftet fra investorer, [[remaining]] gjenstår.',
      bridge: 'Denne runden er en bro på [[raise]], som lukkes før en priset runde. Eksisterende aksjonærer er med, sammen med noen få nye investorer vi har invitert inn. Innovasjon Norge har innvilget [[grant]] i tillegg.',
      close: [
        { id: 'call', label: 'Book en prat', href: 'mailto:mattis@admel.no?subject=AdMel%20%E2%80%94%20intro' },
        { id: 'dataroom', label: 'Be om datarommet', href: 'mailto:mattis@admel.no?subject=AdMel%20%E2%80%94%20datarom' },
      ],
    },
    // ═════════ Lag 2 · dokumentasjon. Hvert tall på ryggraden åpner beviset sitt.
    tpl: {
      problem: {
        tone: 'dark', label: 'Problemet',
        headline: 'Hver bestilling er en prognose. De fleste butikker lager den fra hukommelsen.',
        support: 'Innkjøperen ser bare halvparten av feilene sine. Overlager står i hylla der det kan telles. Et tomt varenummer er en kunde som gikk ut og ikke la igjen spor. Den rasjonelle responsen på ensidig tilbakemelding er å bestille for mye.',
        figures: [
          { code: 'Timer/uke',  v: '6,5',     k: 'På bestilling',   c: 'coral' },
          { code: 'Tomt',       v: '23',      k: 'På én måned',     c: 'coral' },
          { code: 'Dødt lager', v: '[[deadStock]]', k: 'På én måned', c: 'coral', dominant: true },
        ],
      },
      proof: {
        tone: 'dark', label: 'Bevis for at det virker',
        headline: 'Ti butikker betaler for dette i dag.',
        support: 'Lite og ekte. Vi viser heller ti som betaler enn seksti i en pipeline. Pris før lansering er låst, og går over til founding-vilkår ved lansering.',
        figures: [
          { code: 'Kunder',     v: '10',  k: 'Betaler i dag',     c: 'gold', dominant: true, fig: 'customersPaying' },
          { code: 'Pris/mnd',   v: '[[prelaunch]]', k: 'Førlansering, låst', c: 'gold' },
          { code: 'Break-even', v: '54',  k: 'Kunder som trengs',  c: 'gold' },
        ],
      },
      scale: {
        tone: 'light', label: 'Bevis for at det skalerer',
        headline: 'Den første avtalen var den vanskelige.',
        support: 'Vi selger ikke til butikker én og én. Vi integreres i programvaren de allerede betaler for, og leverandøren setter oss foran kundebasen sin. Den andre leverandøren tester allerede, før den har signert noe.',
        figures: [
          { code: 'Leverandør 01', v: '400',      k: 'Butikker, signert', c: 'gold', small: true, fig: 'pool' },
          { code: 'Syklustid',     v: '2',        k: 'Måneder, kontakt til signatur', c: 'gold', dominant: true },
          { code: 'Leverandør 02', v: 'Tester',   k: 'En liten gruppe er live, usignert' },
          { code: 'Onboarding',    v: 'Under 1t', k: 'Ingen tjenestearbeid fra oss', c: 'gold' },
        ],
      },
      moat: {
        tone: 'dark', label: 'Hvorfor dette er vanskelig å kopiere',
        headline: 'Chatten kan hvem som helst bygge. Ikke det den står på.',
        support: 'Spør Otto på vanlig norsk. Han svarer fra levende lagerdata forent på tvers av tre systemer, i dine egne varenummer, og lager et ordreutkast. Han sender det aldri. Samtalen er en helgs arbeid. Det den står på er det ikke.',
        figures: [
          { code: 'Systemer',     v: '3',  k: 'Bak hvert svar',     c: 'gold' },
          { code: 'Ordrer sendt', v: '0',  k: 'Otto sender ingen',  c: 'gold' },
          { code: 'Forsprang',    v: '18', k: 'Måneder, ikke mer',  c: 'gold', dominant: true },
        ],
      },
      market: {
        tone: 'light', label: 'Marked og modell',
        headline: 'Butikker taper 1,77 billioner dollar i året på dette.',
        support: 'Det er den globale kostnaden av tomme hyller og overlager, målt av IHL Group på tvers av 4 500 butikkjeder. Vi gjør ikke krav på en andel av den. Markedet vårt er de nordiske selskapene som fører lager, og Norge er der vi selger i dag.',
        figures: [
          { code: 'Global kostnad', v: '$1,77B',    k: 'Tomme hyller og overlager, i året', c: 'coral', dominant: true },
          { code: 'Norden',         v: '625 000',   k: 'Selskaper som fører lager' },
          { code: 'Norge',          v: '125 000',   k: 'Der vi selger i dag', c: 'gold', fig: 'market' },
          { code: 'ARR',            v: '[[arrNordic1pct]]',       k: 'Ved 6 250 kunder, én prosent av Norden', c: 'gold' },
        ],
      },
      unit: {
        tone: 'light', label: 'Enhetsøkonomi',
        headline: 'Hver krone er tilbake på under to måneder.',
        support: 'Vi har ikke noe utgående salgsteam. Det ene bookerbyrået koster [[bookersFixed]] i måneden. Det andre betales [[bookerFee]] per signerte kunde, som onboardingen vår på [[onboarding]] dekker. Den faste eksponeringen er [[bookersFixed]] i måneden, uansett hva close-raten gjør.',
        churnLabel: 'Om churn',
        churn: 'Ti kunder og ingen historikk. Vi kommer ikke til å gi deg en LTV vi ikke kan bevise. Vi har et churn-tall etter to kvartaler på ordinære vilkår.',
        figures: [
          { code: 'CAC',                      v: '[[cacPlan]]', k: 'Per kunde i planen, etter onboarding' },
          { code: 'Bruttomargin',             v: '90 %',        k: 'Infrastruktur [[serveLow]] til [[serveHigh]] per kunde' },
          { code: 'Tilbakebetaling, måneder', v: '1,5',         k: 'Ved vår planlagte 20 % close', c: 'gold', dominant: true },
          { code: 'Tilbakebetaling, oppside', v: '0,8',         k: 'Ved 40 %' },
        ],
      },
      whynow: {
        tone: 'dark', label: 'Hvorfor nå',
        headline: 'Kategorien blir finansiert. Ingen er her ennå.',
        support: 'Doss har hentet 73 millioner dollar i USA. Whitespace kom ut av Y Combinator i sommer. Begge gjør omtrent det vi gjør. Ingen av dem er i Norden. Shopify hadde et innkjøpsverktøy med prognose, og la det ned 31. august.',
        rivals: [
          { n: 'RELEX, Slimstock',  w: 'Planlegging for store og mellomstore selskaper. Tre til seks måneder å implementere, og RELEX sier selv at de ikke passer for små bedrifter.' },
          { n: 'EazyStock, AGR',    w: 'Nærmest vår posisjon, men de sitter på et ERP kunden vår ikke har.' },
          { n: 'Rackbeat, GoFact',  w: 'De forteller deg hva du har. Ikke hva du skal bestille neste uke.' },
          { n: 'Doss, Whitespace',  w: 'Samme tese, finansiert, kun USA.' },
        ],
        figures: [
          { code: 'Hentet',   v: '$73M',   k: 'Av den nærmeste amerikanske aktøren' },
          { code: 'I Norden', v: '0',      k: 'Av dem betjener nordiske frittstående', c: 'gold', dominant: true },
          { code: 'Shopify',  v: '31. aug', k: 'La ned sitt eget prognoseverktøy' },
        ],
      },
      team: {
        tone: 'dark', label: 'Team',
        headline: 'Vi kaldpitcher ikke nordisk ERP. Vi kjenner det allerede.',
        support: 'To i teamet har C-nivå-relasjoner hos akkurat de plattformene AutoStock distribueres gjennom. Vår CTO var lagersjef før AdMel, så han levde problemet i stedet for å lese om det.',
        figures: [
          { code: 'Team',    v: '6',  k: 'Personer i dag',      c: 'gold' },
          { code: 'ERP-år',  v: '30', k: 'Head of channel partnerships',  c: 'gold', dominant: true },
          { code: 'Mangler', v: '1',  k: 'Integrasjonsingeniør', c: 'coral' },
        ],
      },
      ask: {
        tone: 'light', label: 'Runden',
        headline: 'Fra ti kunder til break-even.',
        figures: [
          { code: 'Henter',           v: '[[raise]]',        k: 'Denne runden', c: 'gold', dominant: true, fig: 'raise' },
          { code: 'Innovasjon Norge', v: '[[grant]]',        k: 'Ikke-utvannende, innvilget', c: 'gold' },
          { code: 'Break-even',       v: '54',               k: 'Kunder', c: 'gold' },
          { code: 'ARR',              v: '[[arrBreakeven]]', k: 'På det punktet', c: 'gold' },
        ],
      },
    },
    fixRoom: {
      label: 'Løsningen',
      headline: 'Tre systemer er uenige. Én beslutning kommer ut.',
      sourcesLabel: 'Hva systemene sier',
      sources: [
        { sys: 'Kasse',    field: 'På lager',     v: '12' },
        { sys: 'ERP',      field: 'Beholdning',   v: '18' },
        { sys: 'Nettbutikk', field: 'Tilgjengelig', v: '4' },
      ],
      replay: 'Spill av igjen',
      unmet: {
        sys: 'Udekket etterspørsel · AdMel',
        field: 'SKU 45821',
        v: '3 forespørsler',
        note: 'Ingen spor i noe system',
      },
      unmetCopy: 'Et salg som ikke skjer, setter ingen spor noe sted. Tre ganger forrige måned ville en kunde ha denne, og den var ikke der, og ingen av systemene hans registrerte det. Vi henter det tilbake fra hva de kundene kjøpte i stedet, fra søk i nettbutikken som ikke ga treff, og fra avviket mot hans egen baseline. Etterspørselen fantes. Den hadde ingen steder å gå.',
      cardBrand: 'AutoStock',
      cardLive: 'Live',
      cardTitle: 'Innkjøpsanbefaling',
      inLabel: 'inn', outLabel: 'ut', inN: '3', outN: '1',
      truthLabel: 'Faktisk tilgjengelig', truthV: '8',
      rows: [
        { k: 'Hva',        v: 'SKU 45821 · Merino superundertøy' },
        { k: 'Hvor mye',   v: '26 stk' },
        { k: 'Når',        v: 'Bestill i dag · 9 dagers ledetid' },
        { k: 'Hvorfor',    v: 'Salg opp 34% u/u · 4 dagers dekning igjen' },
        { k: 'Sikkerhet',  v: '83%' },
      ],
      outTitle: 'Den som bestiller varer',
      outScope: 'Én butikkjede · 3 butikker · 4 200 varenumre · én måned',
      outRows: [
        { a: '6,5',     b: '0,5',     k: 'timer i uka på bestilling' },
        { a: '23',      b: '2',       k: 'ganger tomt på lager' },
        { a: '[[deadStock]]', b: '[[deadStockAfter]]', k: 'I dødt lager' },
      ],
      outFoot: '[[freed]] frigjort. Seks timer i uka tilbake.',
      how: 'Ingen av systemene tar feil. De teller forskjellige ting, og ingen av dem eier bestillingsbeslutningen. AutoStock ligger over alle tre, forener dem til ett tall, og gjør det om til en ordre med begrunnelsen vedlagt. Det er et beslutningslag, ikke enda et system.',
    },
    evidence: {
      raise: {
        label: 'Runden',
        body: 'Denne runden er en bro på [[raise]], som lukkes før en priset runde, der eksisterende aksjonærer er med sammen med noen få inviterte nye investorer. Den tar selskapet fra ti betalende kunder til et seed-modent selskap, der vi bare regner inn kanaler vi allerede har signert.',
        rows: [
          { k: 'Beløp', v: '[[raise]]' },
          { k: 'Instrument', v: 'Bro, betingelser deles på forespørsel' },
          { k: 'Eiere', v: 'Eksisterende aksjonærer og inviterte nye investorer' },
          { k: 'Tilsvarer i modellen', v: 'EUR 261k' },
        ],
        caveat: 'Vekstmodellen er bygget mot EUR 300k. Denne runden er EUR 261k, rundt 87% av det. Planen under er hva 261k finansierer, ikke en nedskalert versjon av en større plan.',
        caveatLabel: 'Verdt å vite',
        source: 'Vekstmodell · Assumptions, Base Case 24M',
      },
      useOfFunds: {
        label: 'Hva pengene gjør',
        body: 'Tre aktiveringer, i den rekkefølgen modellen bruker dem. Hver av dem er en ansettelse eller en kontrakt, ikke en budsjettpost.',
        rows: [
          { k: 'Møtebookerbyråer', v: 'EUR 10 435/mnd\n30 varme leads/mnd, 40% close' },
          { k: 'Integrasjonsleder', v: 'Fra okt. 2026' },
          { k: 'Kanal-CRO', v: 'Fulltid fra jan. 2027' },
        ],
        caveat: 'Den tredje ansettelsen er den som betyr noe. Fram til den personen er på plass starter ikke den største kanalen i modellen, og det er derfor den finansieres før den er bevist.',
        caveatLabel: 'Verdt å vite',
        source: 'Vekstmodell · Summary «Capital activates», Headcount & Opex',
      },
      milestone: {
        label: 'Milepælen',
        body: 'Hentet fra Base-scenariet, som er gulvet: det utelater alle tre usignerte ERP-kanaler i sin helhet.',
        rows: [
          { k: 'I dag', v: '6 betalende kunder' },
          { k: 'April 2027 (måned 8)', v: '144 kunder' },
          { k: 'ARR på det tidspunktet', v: '[[arrMonth9]]' },
          { k: 'Break-even', v: '54 kunder' },
          { k: 'Fra signert kanal', v: '46%' },
          { k: 'Fra usignert kanal', v: '14%' },
        ],
        caveat: 'Måned 8 er der modellen henter neste runde. 14% av de 144 kommer fra en kanal vi ennå ikke har signert. Innen måned 24 er den andelen 58%, og det er den reelle eksponeringen i modellen. Derfor er milepælen satt til måned 8 og ikke til 24-månederstallet.',
        caveatLabel: 'Verdt å vite',
        source: 'Vekstmodell · Base Case 24M, måned 1-8',
      },
      runway: {
        label: 'Runway',
        body: 'Bunnpunktet kommer i mars 2027, én måned før neste runde, og det er stramt.',
        rows: [
          { k: 'Laveste kasse (ved EUR 300k)', v: 'EUR 51k, mars 2027' },
          { k: 'Justert for denne runden', v: '≈ EUR 12k' },
          { k: 'Månedlig burn, finansiert team', v: '[[burn]]' },
          { k: 'Break-even', v: '54 kunder' },
        ],
        caveat: 'Dette er det strammeste tallet i decket, og vi vil heller at du hører det fra oss. Ved EUR 261k passerer det konservative scenariet omtrent EUR 12k fra null i mars 2027, én måned før neste runde. Det forutsetter 30 varme leads i måneden fra start; på 15 kommer bunnpunktet tidligere og går negativt.',
        caveatLabel: 'Verdt å vite',
        source: 'Vekstmodell · Base Case 24M, CASH EOP',
      },
      customersPaying: {
        label: 'Ti betalende kunder',
        body: 'Førlansering-pris, fakturert månedlig. Så få at vi kan beskrive hver eneste én.',
        rows: [
          { k: 'Betaler i dag', v: '10' },
          { k: 'Pris', v: '[[prelaunch]]/mnd, låst' },
          { k: 'Ved lansering', v: 'Går over til founding-vilkår' },
          { k: 'Break-even', v: '54 kunder' },
        ],
        caveat: 'Ti er lite, og vi skal ikke pynte på det. Det det kjøper, er at hver enkelt er en reell faktura, og at break-even er 44 kunder unna og ikke tusen.',
        caveatLabel: 'Verdt å vite',
        source: 'Intern fakturering · vekstmodellens Assumptions',
      },
      pool: {
        label: '400 butikker',
        body: 'Partnerens adresserbare portefølje, ikke en venteliste. De er tilgjengelige gjennom kanalen, ikke påmeldt.',
        rows: [
          { k: 'Pool', v: '400 butikker' },
          { k: 'Modellert penetrasjon', v: '50% tak' },
          { k: 'Base-scenariet når', v: '162 innen måned 24' },
          { k: 'Lansering', v: 'September 2026' },
        ],
        caveat: 'Metningstaket er modellert eksplisitt og ikke oversett. Selv ved full penetrasjon bærer ikke denne kanalen alene planen, og det er derfor de usignerte kanalene betyr noe.',
        caveatLabel: 'Verdt å vite',
        source: 'Vekstmodell · Assumptions, Base Case 24M',
      },
      split: {
        label: 'Kanaløkonomien',
        rows: [
          { k: 'Deling', v: '70/30 i vår favør' },
          { k: 'Direkte ARPU, netto', v: '413 EUR/mnd' },
          { k: 'Partner-ARPU, netto', v: '278 EUR/mnd' },
          { k: 'Onboarding-gebyr', v: '1 100 direkte / 650 partner' },
        ],
        caveat: 'En partnerkunde er verdt omtrent en tredjedel mindre enn en direkte kunde. Vi tar den byttehandelen fordi kanalen når kunder vi ikke hadde råd til å kjøpe direkte, og fordi partnerchurn er lavere.',
        caveatLabel: 'Verdt å vite',
        source: 'Vekstmodell · Assumptions',
      },
      unsigned: {
        label: 'Eksponering mot usignerte kanaler',
        body: 'Den delen av modellen som hviler på kanaler vi ikke har signert. Du ville funnet dette i due diligence, så her er det nå.',
        rows: [
          { k: 'Plan-scenariet, måned 24', v: '39% fra tre usignerte ERP-kanaler' },
          { k: 'Base-scenariet, måned 8', v: '14% usignert' },
          { k: 'Base-scenariet, måned 24', v: '58% usignert' },
          { k: 'Kun signert kanal', v: '162 kunder innen måned 24' },
        ],
        caveat: 'Base-scenariet utelater de tre ERP-kanalene helt, men lener seg fortsatt på én usignert partner for det meste av 24-månederstallet. Bare den nære milepælen bæres i hovedsak av signert distribusjon. Det er nettopp derfor vi har satt runden mot den milepælen.',
        caveatLabel: 'Verdt å vite',
        source: 'Vekstmodell · Base Case 24M, Plan Case 24M',
      },
      market: {
        label: '125 000 selskaper',
        body: 'Nedenfra og opp, fordi du kan etterprøve det. Norske selskaper som fører lager.',
        rows: [
          { k: 'Adresserbare selskaper', v: '125 000' },
          { k: 'Base-scenariet ved måned 24', v: '1 242 kunder' },
          { k: 'Det er', v: '1,0% av markedet' },
          { k: 'ARR på det tidspunktet', v: '[[arrBase24]]' },
        ],
        caveat: 'Én prosent på 24 måneder er det konservative scenariet, og det avhenger av kanalene beskrevet over. Vi hevder ikke en andel av et billiontall.',
        caveatLabel: 'Verdt å vite',
        source: 'Vekstmodell · Base Case 24M',
      },
      scenarios: {
        label: 'Base og Plan',
        body: 'Base-scenariet er løftet. Plan-scenariet er oppsiden. Forskjellen er de tre usignerte ERP-kanalene.',
        rows: [
          { k: 'Base, måned 24', v: '1 242 kunder\n[[arrBase24]] ARR' },
          { k: 'Plan, måned 24', v: '4 724 kunder\n[FILL: Plan-case ARR at the [[listPrice]] list price]' },
          { k: 'Hva som skiller dem', v: 'Tripletex, PowerOffice, UniMicro' },
        ],
        caveat: 'Vi leder med Base overalt i dette decket. Signerer ERP-kanalene, er Plan-scenariet det som skjer; vi ber deg ikke finansiere oss på den forutsetningen.',
        caveatLabel: 'Verdt å vite',
        source: 'Vekstmodell · begge scenarioark',
      },
    },

    // ═════════ Lag 3 · samtalen. Forhåndsskrevet, hentet og ikke generert.
    objections: {
      proof: [
        { q: 'Hvor mange har churnet?', a: 'Vi bekrefter det eksakte tallet før vi publiserer det, framfor å gi deg et tall vi ikke har sjekket. Spør, så gir en gründer deg retensjonshistorikken direkte, inkludert hvem som eventuelt har sluttet og hvorfor.' },
        { q: 'Hva betaler de faktisk?', a: '[[prelaunch]] i måneden på førlansering-pris, låst, som går over til founding-vilkår ved lansering. Full listepris er [[listPrice]] i måneden, så disse ti er bevisst billige mot å være først.' },
        { q: 'Hvorfor bare ti?', a: 'Fordi vi ennå ikke har lansert gjennom distribusjonskanalen, og vi vil heller ha ti fakturaer enn seksti prøvekontoer. Break-even er 54 kunder, og det er gapet denne runden lukker.' },
      ],
      scale: [
        { q: 'Hvorfor skalerer kanalen uten flere folk?' },
        { q: 'Hvor stor er kundebasen til leverandør 2?' },
        { q: 'Hva om partneren ikke leverer?', a: 'Base-scenariet setter et tak på 50% av kanalens pool på 400 butikker og modellerer resten av veksten uten den. Leverer den ingenting, er break-even på 54 kunder fortsatt innen rekkevidde på direktesalg alene, men 24-månederstallene holder ikke.' },
        { q: 'Hvem eier kundeforholdet?', a: 'Det gjør vi. Partneren distribuerer og tar 30% av inntekten; kontrakten, produktforholdet og dataene ligger hos AdMel.' },
        { q: 'Hvor mye av planen avhenger av usignerte partnere?', a: 'I Plan-scenariet kommer 39% av kundene ved måned 24 fra tre ERP-kanaler vi ikke har signert. Selv Base-scenariet er 58% avhengig av én usignert partner ved måned 24, men bare 14% ved milepælen denne runden er satt mot.' },
      ],
      moat: [
        { q: 'Hva kan Otto faktisk gjøre?', a: 'Han leser levende lagerdata og skriver to typer utkast. Det er hele listen. Spør hva du må bestille, og han gir deg alt på eller under bestillingspunktet, prioritert etter hva som svir mest å vente med. Spør om et varenummer, og du får beholdning, hva som allerede er i bestilling, min/max og ledetid — og hvert varenummer han skriver er en lenke inn til varen. Han svarer også på hvordan-gjør-jeg-spørsmål om siden du står på, og leser et skjermbilde du limer inn.' },
        { q: 'Hva hindrer Otto i å bestille feil?', a: 'Otto bestiller aldri i det hele tatt. Han foreslår et antall med en begrunnelse og gir deg to knapper: en anbefaling som havner i samme godkjenn-eller-avvis-kø som de systemet lager selv, eller et ordreutkast. Begge er utkast. Ingenting går til en leverandør, ingen varer reserveres, ingen penger flyttes, og prisen hentes fra dine egne varedata — ikke fra noe Otto har sagt. Mangler varen leverandør eller pris, sier han det i stedet for å lage en ødelagt ordre.' },
        { q: 'Hva om Visma bygger dette?', a: 'De kan, for sine egne data. Problemet vi løser er at tre systemer er uenige, og det er ikke et problem en ERP-leverandør opplever eller får betalt for å fikse. Inntekten deres er lisenser og moduler; vår er treffsikkerhet per beslutning, og de trekker i hver sin retning.' },
        { q: 'Hvor lenge varer forspranget egentlig?', a: 'Vi tror omtrent atten måneder. Etter det må forsvaret være datafortrinnet og den installerte basen, ikke integrasjonene. Er ingen av delene reelle innen da, faller moat-argumentet, og vi vil heller at du holder oss til det.' },
      ],
      market: [
        { q: 'Hva med Norden?' },
        { q: 'Hvordan kom dere fram til disse tallene?', a: 'Nedenfra og opp. 125 000 norske selskaper fører lager; Base-scenariet når 1 242 av dem på 24 måneder, som er én prosent, med en blandet netto-ARPU mellom 278 og 413 EUR i måneden.' },
        { q: 'Hva er churn-forutsetningen?', a: '2,5% månedlig for direkte kunder og 1,5% for kunder i partnerkanalen. Vi modellerer churn eksplisitt framfor å anta null, slik den tidligere interne modellen vår gjorde.' },
        { q: 'Hvordan ser dette ut uten ERP-kanalene?', a: 'Det er Base-scenariet: 1 242 kunder og [[arrBase24]] ARR ved måned 24, mot 4 724 kunder i Plan-scenariet. Gapet mellom de to tallene er utelukkende de tre usignerte ERP-kanalene.' },
      ],
      problem: [
        { q: 'Hvorfor må innkjøperen i det hele tatt lage prognoser?' },
        { q: 'Hvor stort er dette problemet?' },
        { q: 'Gjør ikke ERP-systemene dette allerede?', a: 'De rapporterer hva deres eget system tror. Ingen av dem avstemmer mot de tre andre, og det er nettopp der tallet blir feil. Et ERP forteller deg med full sikkerhet at det har 18 på lager mens hylla har 8.' },
        { q: 'Hvorfor har ingen løst det?', a: 'Å løse det betyr å normalisere tre lagerskjemaer og alle unntakene deres, som er utakknemlig flerårig arbeid som ingen enkelt leverandør har insentiv til å gjøre. Hvert system har rett om sin egen bit, så ingen opplever problemet bortsett fra den som bestiller.' },
      ],
      unit: [
        { q: 'Hva skjer med CAC når bookerkanalen mettes?' },
        { q: 'Hvorfor er spennet i driftskost så bredt?' },
        { q: 'Hva er CAC gjennom partnerkanalen?' },
        { q: 'Når har dere et churn-tall?' },
      ],
      whynow: [
        { q: 'Hvorfor har ingen bygget dette for mindre butikker?' },
        { q: 'Hva skjer når Doss kommer til Norden?' },
        { q: 'Hvorfor kan ikke RELEX bare gå nedover i markedet?' },
        { q: 'Hva om Visma bygger dette?' },
      ],
      team: [
        { q: 'Hvorfor avhenger distribusjon av dette teamet?' },
        { q: 'Hva mangler i dette teamet?', a: 'En senior integrasjonsutvikler. Vi har ERP-relasjonene og AI-en, og gapet er personen som leverer integrasjoner i tempo. Det er oktober-ansettelsen i bruken av midlene, og den er bevisst den første.' },
        { q: 'Har dere jobbet sammen før?', a: 'De tre gründerne har det, og den kommersielle siden kom inn gjennom ERP-nettverket framfor en rekrutterer, som er grunnen til at relasjonene kom inn intakte.' },
      ],
      simulation: [
        { q: 'Hvor treffsikker er prognosen?' },
        { q: 'Hva om AI-en tar feil?' },
        { q: 'Hvor lang tid til live?' },
        { q: 'Hvordan gjenskaper dere et salg som aldri skjedde?' },
      ],
      thanks: [
        { q: 'Hva er den største risikoen her?' },
        { q: 'Hva er betingelsene i denne runden?' },
        { q: 'Hva er den største risikoen her?' },
      ],
      ask: [
        { q: 'Hvor kommer close rate-antakelsene deres fra?' },
        {
          q: 'Hva er betingelsene?',
          a: 'Instrument og hovedbetingelser for denne runden deles direkte med investorer på forespørsel, ikke i decket. Betingelser fra tidligere avtaler oppgir vi ikke i det hele tatt. Spør, så får du term sheetet samme dag.',
        },
        {
          q: 'Hva om runden ikke blir fulltegnet?',
          a: 'Break-even er 54 kunder på en finansiert kostnadsbase på [[burn]] i måneden. En kortere runde utsetter kanal-CRO-ansettelsen, som skyver den største vekstkanalen til høyre, men den setter ikke selskapet i fare for å gå tomt for penger på dagens team.',
        },
        {
          q: 'Hvordan ser neste runde ut?',
          a: 'Modellen henter igjen i måned 9, mai 2027, på 144 kunder og [[arrMonth9]] ARR, med bare signerte kanaler regnet inn. Størrelsen på den runden avhenger av hvordan kanalen har levert til da, så vi viser heller utløseren enn å sette et tall nå.',
        },
        {
          q: 'Hvorfor [[raise]] og ikke mer?',
          a: '[[raise]] er det de tre aktiveringene koster, pluss en kassabunn. Å hente mer nå ville priset en runde på ti kunder i stedet for på en bevist kanal, og det er dårligere for alle på aksjonærlisten, inkludert en ny investor.',
        },
      ],
    },
  },
};

// One pass at load. Every consumer downstream reads finished strings, so no
// component has to know that money was ever a token.
window.TDATA.en = resolveMoney(window.TDATA.en, 'en');
window.TDATA.no = resolveMoney(window.TDATA.no, 'no');
