// Pricing & fit — engagement model, ROI calculator, when-to-choose comparison const { useState: useStateP } = React; function PricingPage({ onNavigate }) { return (
Pricing & fit

No mystery pricing.
No sales theatre.

You get a fixed-scope implementation and an annual platform licence. Here's how the numbers work, and how to tell whether we're the right answer for you at all.

{/* Engagement model */}
How you buy

Four stages. Priced separately.

You can stop after any one of them. Discovery costs you nothing, and the specification it produces is yours to take elsewhere if you'd rather.

{[ { n: "01", t: "Discovery", p: "Free", d: "We map your process, agree the scope and write it down — at no charge. You leave with a specification, a fixed implementation price and a delivery date, whether or not you continue with us.", out: ["Process map", "Written specification", "Fixed price + date"] }, { n: "02", t: "Implementation", p: "Fixed price", d: "We build and deploy the agreed scope. No hourly billing, no change-request games — the scope was agreed in discovery and the price doesn't move unless you move the scope.", out: ["Working application", "Data migrated", "Users trained"] }, { n: "03", t: "Platform licence", p: "Annual", d: "Your application runs on ActiveManage. The licence covers hosting on UK-sovereign infrastructure, backups, monitoring, security patching and every platform release we ship.", out: ["Hosting + backups", "All platform updates", "Uptime monitoring"] }, { n: "04", t: "Ongoing support", p: "Annual or ad-hoc", d: "Change requests, new features and bug reports raised through the ITSM built into your app. Either a support agreement with agreed response times, or pay-as-you-go.", out: ["In-app request logging", "Agreed response times", "Direct to engineers"] }, ].map(s => (
{s.n}

{s.t}

{s.p}

{s.d}

    {s.out.map(o => (
  • {o}
  • ))}
))}

We don't publish a rate card because scope genuinely varies — a spreadsheet replacement and a multi-tenant SaaS product aren't the same purchase. Discovery is where the number becomes real, and it's free.

); } /* --------------------------------------------------------------------------- ROI calculator — honest arithmetic, no inflated multipliers --------------------------------------------------------------------------- */ function RoiCalculator() { const [people, setPeople] = useStateP(8); const [hours, setHours] = useStateP(5); const [rate, setRate] = useStateP(28); const [saving, setSaving] = useStateP(60); const weeklyHours = people * hours; const savedHours = weeklyHours * (saving / 100); const weeklyCost = savedHours * rate; const annual = Math.round(weeklyCost * 46); // 46 working weeks const annualDays = Math.round((savedHours * 46) / 7.5); const fmt = (n) => "£" + n.toLocaleString("en-GB"); return (
Worth doing?

The arithmetic, before the sales call.

Most systems we replace waste people's time rather than money directly. Put your own numbers in — it costs nothing and you may conclude you don't need us.

setPeople(+e.target.value)} />
setHours(+e.target.value)} />
setRate(+e.target.value)} />
setSaving(+e.target.value)} />
Recovered per year {fmt(annual)} ≈ {annualDays.toLocaleString("en-GB")} working days returned to the team
{[ ["Hours spent now", weeklyHours.toLocaleString("en-GB") + " / week"], ["Hours recovered", Math.round(savedHours).toLocaleString("en-GB") + " / week"], ["Value recovered", fmt(Math.round(weeklyCost)) + " / week"], ].map(([k, v]) => (
{k} {v}
))}

Based on 46 working weeks and 7.5-hour days. This counts recovered time only — it ignores error reduction, faster customer response and the cost of the risk you're carrying today, because those are harder to defend in a business case.

); } /* --------------------------------------------------------------------------- When to choose us — and when not to --------------------------------------------------------------------------- */ const FIT_ROWS = [ ["Regulated data, audit and permissions matter", "yes", "part", "no"], ["Needs to be live in weeks, not quarters", "yes", "part", "no"], ["Complex multi-stage workflow and approvals", "yes", "part", "yes"], ["Must run under your own brand and domain", "yes", "part", "yes"], ["You want to edit it yourself afterwards", "yes", "yes", "no"], ["Per-user licensing gets expensive at scale", "no", "yes", "no"], ["Consumer-scale app with millions of users", "no", "no", "yes"], ]; function FitSection({ onNavigate }) { const cell = (v) => { if (v === "yes") return ; if (v === "part") return ; return ; }; return (
Honest comparison

When we're the right answer — and when we aren't.

We lose deals we should lose. If we're not the right fit for what you're doing, we'll tell you on the first call rather than the third.

ActiveManage
Generic low-code
Custom development
{FIT_ROWS.map(r => (
{r[0]}
{cell(r[1])}
{cell(r[2])}
{cell(r[3])}
))}

Generic low-code platforms are strong tools — they tend to bill per user, keep your application inside their runtime, and get expensive once a system becomes genuinely core. Custom development gives total freedom and takes the longest. We sit deliberately between the two.

); } /* --------------------------------------------------------------------------- Founding customer / design partner programme --------------------------------------------------------------------------- */ function DesignPartner({ onNavigate }) { return (
Founding customers

We're taking five.

We're deliberately choosing a handful of organisations to build alongside this year — regulated UK operations replacing a process that's genuinely holding them back. Preferential pricing, direct access to the people building it, and real influence over where the platform goes next.

{[ ["Founding-customer pricing", "Materially below list, held for the life of the agreement."], ["Direct line to the founder", "Not an account manager. The person who makes the decisions."], ["A defined outcome", "One agreed process, live and in use — not an open-ended project."], ["Influence on the roadmap", "Your edge cases become platform features."], ["What we ask in return", "Structured feedback, and permission to publish a case study once you're happy with it."], ].map(([t, d]) => (
{t} {d}
))}
); } Object.assign(window, { PricingPage });