feat: Updated pricing

This commit is contained in:
2026-07-28 12:31:00 +01:00
parent 766dcabfde
commit febe48a974
+34 -104
View File
@@ -3,8 +3,7 @@ import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Pricing",
description:
"Three tiers, cloud or self-hosted, priced per managed server. Free for 3 servers. Professional from £19 a month, Enterprise from £49 a month, £5 per extra server.",
description: "Three tiers, cloud or self-hosted, priced per managed server. Free for 3 servers. Professional from £19 a month, Enterprise from £49 a month, £5 per extra server.",
};
/* Prices and allowances are the shipped catalogue, not marketing rounding:
@@ -12,7 +11,7 @@ export const metadata: Metadata = {
* catalogue. Annual is ten times monthly everywhere, which is the "two months
* free" the portal's own term picker states. */
const COMPARISON: [string, string, string, string][] = [
["Managed servers", "3", "3, then £5 each", "10, then £5 each"],
["Managed servers", "3", "5, then £2.50 each", "10, then £2.50 each"],
["People", "Unlimited", "Unlimited", "Unlimited"],
["SSH key assignment", "Yes", "Yes", "Yes"],
["Workflows and step library", "Yes", "Yes", "Yes"],
@@ -41,28 +40,20 @@ export default function PricingPage() {
Pick a tier, then pay per server.
</h1>
<p className="lede">
People are free. Keys, workflows, monitors and secrets are free.
You pay for a tier and for the servers running an agent, because
that is the only number that grows with you. Every tier runs
either in our cloud or on your own hardware, for the same money.
People are free. Keys, workflows, monitors and secrets are free. You pay for a tier and for the servers running an agent, because that is the only number that grows with you. Every
tier runs either in our cloud or on your own hardware, for the same money.
</p>
<div className="plans">
<div className="plan">
<div>
<div className="plan__n">Free</div>
<p className="plan__d">
A homelab, a couple of VPSes, and the keys on your
own laptop.
</p>
<p className="plan__d">A homelab, a couple of VPSes, and the keys on your own laptop.</p>
</div>
<div className="plan__p">
£0 <span>3 servers</span>
</div>
<p className="plan__t">
Cloud or self-hosted. Renewed once a year from the
portal, one free instance per deployment.
</p>
<p className="plan__t">Cloud or self-hosted. Renewed once a year from the portal, one free instance per deployment.</p>
<ul>
<li>3 servers and 3 monitors</li>
<li>Keys, workflows and the step library</li>
@@ -78,18 +69,12 @@ export default function PricingPage() {
<div className="plan plan--pick">
<div>
<div className="plan__n">Professional</div>
<p className="plan__d">
Real infrastructure, and more than one person
holding the keys.
</p>
<p className="plan__d">Real infrastructure, and more than one person holding the keys.</p>
</div>
<div className="plan__p">
£19 <span>/ month, 3 servers</span>
</div>
<p className="plan__t">
£5 per extra server. £190 a year saves two months.
Self-hosted is £190 a year.
</p>
<p className="plan__t">£5 per extra server. £190 a year saves two months. Self-hosted is £190 a year.</p>
<ul>
<li>3 servers included, add as many as you like</li>
<li>Unlimited monitors, secrets and channels</li>
@@ -105,18 +90,12 @@ export default function PricingPage() {
<div className="plan">
<div>
<div className="plan__n">Enterprise</div>
<p className="plan__d">
A fleet, a compliance question, and someone who
wants a phone number.
</p>
<p className="plan__d">A fleet, a compliance question, and someone who wants a phone number.</p>
</div>
<div className="plan__p">
£49 <span>/ month, 10 servers</span>
</div>
<p className="plan__t">
£5 per extra server. £490 a year saves two months.
Self-hosted is £490 a year.
</p>
<p className="plan__t">£5 per extra server. £490 a year saves two months. Self-hosted is £490 a year.</p>
<ul>
<li>10 servers included, add as many as you like</li>
<li>Everything in Professional</li>
@@ -130,44 +109,26 @@ export default function PricingPage() {
</div>
</div>
<div
className="specs"
style={{ marginTop: "2.6rem", maxWidth: "66ch" }}
>
<span className="tag">
Add-ons, on Professional and Enterprise
</span>
<div className="specs" style={{ marginTop: "2.6rem", maxWidth: "66ch" }}>
<span className="tag">Add-ons, on Professional and Enterprise</span>
<div className="spec">
<span className="spec__k">£5 / MO</span>
<div>
<h3>Browser console</h3>
<p>
SSH, RDP and VNC sessions in the browser, audited
like everything else. £50 a year.
</p>
<p>SSH, RDP and VNC sessions in the browser, audited like everything else. £50 a year.</p>
</div>
</div>
<div className="spec">
<span className="spec__k">£9 / MO</span>
<div>
<h3>Single sign-on</h3>
<p>
Connect your own OIDC provider to an instance. £90 a
year.
</p>
<p>Connect your own OIDC provider to an instance. £90 a year.</p>
</div>
</div>
</div>
<p className="scroll__hint">
Scroll the table sideways for all three tiers
</p>
<div
className="scroll"
tabIndex={0}
role="region"
aria-label="Plan comparison"
>
<p className="scroll__hint">Scroll the table sideways for all three tiers</p>
<div className="scroll" tabIndex={0} role="region" aria-label="Plan comparison">
<table className="cmp">
<thead>
<tr>
@@ -178,16 +139,14 @@ export default function PricingPage() {
</tr>
</thead>
<tbody>
{COMPARISON.map(
([capability, free, professional, enterprise]) => (
<tr key={capability}>
<td>{capability}</td>
<td>{free}</td>
<td>{professional}</td>
<td>{enterprise}</td>
</tr>
),
)}
{COMPARISON.map(([capability, free, professional, enterprise]) => (
<tr key={capability}>
<td>{capability}</td>
<td>{free}</td>
<td>{professional}</td>
<td>{enterprise}</td>
</tr>
))}
</tbody>
</table>
</div>
@@ -199,45 +158,28 @@ export default function PricingPage() {
<span className="spec__k">COUNTING</span>
<div>
<h3>What counts as a server</h3>
<p>
One running agent, one server. You choose the
cap rather than being metered on what you ran,
so the invoice is the same number you set.
</p>
<p>One running agent, one server. You choose the cap rather than being metered on what you ran, so the invoice is the same number you set.</p>
</div>
</div>
<div className="spec">
<span className="spec__k">ADDING</span>
<div>
<h3>Going up mid-term</h3>
<p>
Raise the server count and the new cap applies
straight away, prorated for the rest of the
period. Your renewal date does not move.
</p>
<p>Raise the server count and the new cap applies straight away, prorated for the rest of the period. Your renewal date does not move.</p>
</div>
</div>
<div className="spec">
<span className="spec__k">REDUCING</span>
<div>
<h3>Going down</h3>
<p>
A reduction takes effect at your next renewal.
You keep what you have already paid for until
then, and we show you the date it changes.
</p>
<p>A reduction takes effect at your next renewal. You keep what you have already paid for until then, and we show you the date it changes.</p>
</div>
</div>
<div className="spec">
<span className="spec__k">LIMITS</span>
<div>
<h3>Reaching the cap</h3>
<p>
Nothing is deleted. An agent beyond the cap
still registers and heartbeats, but stops
syncing keys until you raise the cap or remove a
server.
</p>
<p>Nothing is deleted. An agent beyond the cap still registers and heartbeats, but stops syncing keys until you raise the cap or remove a server.</p>
</div>
</div>
<div className="spec">
@@ -245,11 +187,8 @@ export default function PricingPage() {
<div>
<h3>What happens when you stop paying</h3>
<p>
Your licence runs to the end of the period you
paid for, then the instance goes read-only.
Monitors keep checking, alerts keep firing and
agents keep their keys you just cannot change
anything until you renew.
Your licence runs to the end of the period you paid for, then the instance goes read-only. Monitors keep checking, alerts keep firing and agents keep their keys you
just cannot change anything until you renew.
</p>
</div>
</div>
@@ -258,11 +197,8 @@ export default function PricingPage() {
<div>
<h3>Why self-hosted is annual only</h3>
<p>
A self-hosted licence is a signed file your
install checks offline, with no phone home. That
means we cannot withdraw one early, so the term
is the limit and we would rather bound it at a
year than sell it twelve times over.
A self-hosted licence is a signed file your install checks offline, with no phone home. That means we cannot withdraw one early, so the term is the limit and we would
rather bound it at a year than sell it twelve times over.
</p>
</div>
</div>
@@ -270,20 +206,14 @@ export default function PricingPage() {
<span className="spec__k">EXIT</span>
<div>
<h3>Leaving</h3>
<p>
Export every server, key, workflow and secret
group as JSON whenever you like. Agents keep
their last synced state on disk, so nobody is
locked out mid-migration.
</p>
<p>Export every server, key, workflow and secret group as JSON whenever you like. Agents keep their last synced state on disk, so nobody is locked out mid-migration.</p>
</div>
</div>
</div>
</div>
<p className="prose" style={{ marginTop: "2.4rem" }}>
Prices exclude VAT, which is calculated at checkout. Billing is
handled by Paddle as merchant of record.{" "}
Prices exclude VAT, which is calculated at checkout. Billing is handled by Paddle as merchant of record.{" "}
<Link href="/contact" style={{ color: "var(--accent)" }}>
Ask us anything
</Link>{" "}