diff --git a/content/pricing.md b/content/pricing.md index 7cada71..00de962 100644 --- a/content/pricing.md +++ b/content/pricing.md @@ -232,7 +232,7 @@ sections: barsTitle: "What our users pay each month" bars: - name: "Federated" - amount: 120 + amount: 159 highlight: true - name: "Google" amount: 575 @@ -240,45 +240,48 @@ sections: amount: 940 - name: "Zoom" amount: 1450 - federatedAnnual: 2900 - calcNote: "Savings compare the retail price of the apps you pick with our Best plan billed annually ($2,900/year). Prices are typical list prices per person per month, or per month for flat-fee apps." + federatedPlans: + - { name: "Good", tier: "good", annual: 700 } + - { name: "Better", tier: "better", annual: 1450 } + - { name: "Best", tier: "best", annual: 2900 } + calcNote: "Savings compare the retail price of the apps you pick with the smallest hosted plan that replaces all of them, billed annually (Good $700, Better $1,450, or Best $2,900 a year). Prices are typical list prices per person per month, or per month for flat-fee apps." apps: - - { name: "1Password", cost: 8, perSeat: true } - - { name: "Airtable", cost: 20, perSeat: true } - - { name: "Asana", cost: 15, perSeat: true } - - { name: "Box", cost: 15, perSeat: true } - - { name: "Calendly", cost: 10, perSeat: true } - - { name: "ClickUp", cost: 12, perSeat: true } - - { name: "Confluence", cost: 9, perSeat: true } - - { name: "Constant Contact", cost: 80, perSeat: false } - - { name: "Doodle", cost: 7, perSeat: true } - - { name: "Dropbox", cost: 10, perSeat: true } - - { name: "Fastmail", cost: 5, perSeat: true } - - { name: "Freshdesk", cost: 15, perSeat: true } - - { name: "Front", cost: 29, perSeat: true } - - { name: "GitHub", cost: 4, perSeat: true } - - { name: "GitLab", cost: 29, perSeat: true } - - { name: "Google Workspace", cost: 13, perSeat: true, selected: true } - - { name: "HubSpot", cost: 20, perSeat: true } - - { name: "Intercom", cost: 29, perSeat: true } - - { name: "Jira", cost: 12, perSeat: true } - - { name: "Mailchimp", cost: 135, perSeat: false } - - { name: "Microsoft 365", cost: 14, perSeat: true } - - { name: "Microsoft Teams", cost: 8, perSeat: true } - - { name: "Monday.com", cost: 12, perSeat: true } - - { name: "Notion", cost: 12, perSeat: true } - - { name: "Odoo", cost: 25, perSeat: true } - - { name: "Proton", cost: 13, perSeat: true } - - { name: "Salesforce", cost: 25, perSeat: true } - - { name: "Shopify", cost: 79, perSeat: false } - - { name: "Slack", cost: 9, perSeat: true, selected: true } - - { name: "Squarespace", cost: 65, perSeat: false, selected: true } - - { name: "Tailscale", cost: 6, perSeat: true } - - { name: "Trello", cost: 11, perSeat: true } - - { name: "Wix", cost: 36, perSeat: false } - - { name: "Zendesk", cost: 19, perSeat: true } - - { name: "Zoho", cost: 29, perSeat: true } - - { name: "Zoom", cost: 13, perSeat: true } + - { name: "1Password", cost: 8, tier: "good", perSeat: true } + - { name: "Airtable", cost: 20, tier: "best", perSeat: true } + - { name: "Asana", cost: 15, tier: "best", perSeat: true } + - { name: "Box", cost: 15, tier: "good", perSeat: true } + - { name: "Calendly", cost: 10, tier: "better", perSeat: true } + - { name: "ClickUp", cost: 12, tier: "best", perSeat: true } + - { name: "Confluence", cost: 9, tier: "best", perSeat: true } + - { name: "Constant Contact", cost: 80, tier: "good", perSeat: false } + - { name: "Doodle", cost: 7, tier: "better", perSeat: true } + - { name: "Dropbox", cost: 10, tier: "good", perSeat: true } + - { name: "Fastmail", cost: 5, tier: "good", perSeat: true } + - { name: "Freshdesk", cost: 15, tier: "best", perSeat: true } + - { name: "Front", cost: 29, tier: "best", perSeat: true } + - { name: "GitHub", cost: 4, tier: "good", perSeat: true } + - { name: "GitLab", cost: 29, tier: "good", perSeat: true } + - { name: "Google Workspace", cost: 13, tier: "good", perSeat: true, selected: true } + - { name: "HubSpot", cost: 20, tier: "better", perSeat: true } + - { name: "Intercom", cost: 29, tier: "better", perSeat: true } + - { name: "Jira", cost: 12, tier: "best", perSeat: true } + - { name: "Mailchimp", cost: 135, tier: "good", perSeat: false } + - { name: "Microsoft 365", cost: 14, tier: "good", perSeat: true } + - { name: "Microsoft Teams", cost: 8, tier: "better", perSeat: true } + - { name: "Monday.com", cost: 12, tier: "best", perSeat: true } + - { name: "Notion", cost: 12, tier: "best", perSeat: true } + - { name: "Odoo", cost: 25, tier: "best", perSeat: true } + - { name: "Proton", cost: 13, tier: "good", perSeat: true } + - { name: "Salesforce", cost: 25, tier: "better", perSeat: true } + - { name: "Shopify", cost: 79, tier: "good", perSeat: false } + - { name: "Slack", cost: 9, tier: "better", perSeat: true, selected: true } + - { name: "Squarespace", cost: 65, tier: "good", perSeat: false, selected: true } + - { name: "Tailscale", cost: 6, tier: "good", perSeat: true } + - { name: "Trello", cost: 11, tier: "best", perSeat: true } + - { name: "Wix", cost: 36, tier: "good", perSeat: false } + - { name: "Zendesk", cost: 19, tier: "best", perSeat: true } + - { name: "Zoho", cost: 29, tier: "good", perSeat: true } + - { name: "Zoom", cost: 13, tier: "better", perSeat: true } - type: faq id: "faq" diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 9a1a085..1e34f3c 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -3,6 +3,9 @@ {{ if .IsHome }}{{ .Site.Title }} — {{ .Site.Params.tagline }}{{ else }}{{ .Title }} · {{ .Site.Title }}{{ end }} + + + diff --git a/layouts/partials/savings-calc.html b/layouts/partials/savings-calc.html index 931f15f..967157a 100644 --- a/layouts/partials/savings-calc.html +++ b/layouts/partials/savings-calc.html @@ -1,19 +1,20 @@ {{/* The savings calculator: pick the apps you pay for today and your team - size, and compare their yearly retail cost with Federated's annual price. - Input: dict with "key" (unique id), "apps" (name, cost, perSeat, selected), - "annual", optional "note", "compact" (one result, no cost breakdown) and + size, and compare their yearly retail cost with the smallest Federated plan + that replaces every app picked (the highest `tier` among them). + Input: dict with "key" (unique id), "apps" (name, cost, tier, perSeat, + selected), "plans" (name, tier, annual; cheapest first), optional "note", "compact" (one result, no cost breakdown) and "more" (a link to the full calculator). The totals need JS; without it, the app list still shows each app's retail price. */}} {{ $key := .key }} -
+
{{ if .compact }}Which of these do you pay for?{{ else }}Which apps do you pay for today?{{ end }}
{{ range .apps }} @@ -34,7 +35,7 @@
Apps replaced0
Their retail cost$0/year
{{ end }} -
You'd save$0/year
+
You save$0/year on the Good plan
{{ with .more }}{{ .label }}{{ end }}
{{ with .note }}

{{ . | markdownify }}

{{ end }} @@ -43,7 +44,7 @@ (function () { var form = document.getElementById('{{ $key }}-calc'); if (!form) return; - var annual = +form.dataset.annual || 0; + var plans = JSON.parse(form.dataset.plans || '[]'); var range = form.querySelector('input[type=range]'); var shown = form.querySelector('.calc-users-value'); var fmt = function (n) { return '$' + Math.round(n).toLocaleString('en-US'); }; @@ -56,16 +57,19 @@ return 1000 + (step - 20) * 500; } function update() { - var n = users(+range.value), count = 0, cost = 0; + var n = users(+range.value), count = 0, cost = 0, need = 0; shown.textContent = n.toLocaleString('en-US') + (+range.value === +range.max ? '+' : ''); range.setAttribute('aria-valuetext', shown.textContent + ' people'); form.querySelectorAll('.calc-app input:checked').forEach(function (box) { count++; + need = Math.max(need, plans.findIndex(function (p) { return p.tier === box.dataset.tier; })); cost += +box.value * (box.dataset.perSeat === 'true' ? n : 1) * 12; }); out('count', count); out('cost', fmt(cost)); - out('savings', fmt(Math.max(0, cost - annual))); + var plan = plans[need] || plans[plans.length - 1] || { name: '', annual: 0 }; + out('savings', fmt(Math.max(0, cost - plan.annual))); + out('plan', plan.name); } form.addEventListener('input', update); update(); diff --git a/layouts/partials/sections/quote.html b/layouts/partials/sections/quote.html index d50d6ec..4cd171a 100644 --- a/layouts/partials/sections/quote.html +++ b/layouts/partials/sections/quote.html @@ -49,12 +49,12 @@ {{ $apps := slice }} {{ range $name := $cfg.apps }} {{ range $src.apps }}{{ if eq .name $name }} - {{ $apps = $apps | append (dict "name" .name "cost" .cost "perSeat" .perSeat "selected" (in ($cfg.selected | default slice) $name)) }} + {{ $apps = $apps | append (dict "name" .name "cost" .cost "tier" .tier "perSeat" .perSeat "selected" (in ($cfg.selected | default slice) $name)) }} {{ end }}{{ end }} {{ end }}
{{ with $cfg.headline }}

{{ . }}

{{ end }} - {{ partial "savings-calc.html" (dict "key" (printf "%s-savings" (partial "section-id.html" $s)) "apps" $apps "annual" $src.federatedAnnual "compact" true "more" $cfg.more) }} + {{ partial "savings-calc.html" (dict "key" (printf "%s-savings" (partial "section-id.html" $s)) "apps" $apps "plans" $src.federatedPlans "compact" true "more" $cfg.more) }}
{{ else }} {{ errorf "quote section: savings.from page %q not found" $cfg.from }} diff --git a/layouts/partials/sections/savings.html b/layouts/partials/sections/savings.html index 5c7b4df..b5740c6 100644 --- a/layouts/partials/sections/savings.html +++ b/layouts/partials/sections/savings.html @@ -1,7 +1,7 @@ {{/* Savings — an optional bar comparison (`bars`: name, amount, highlight) and - a savings calculator (`apps`: name, cost, perSeat, selected; compared with - `federatedAnnual`), rendered by partials/savings-calc.html. + a savings calculator (`apps`: name, cost, tier, perSeat, selected; compared + with the smallest of `federatedPlans`: name, tier, annual), rendered by partials/savings-calc.html. */}} {{ $s := . }} {{ $key := partial "section-id.html" $s | default "savings" }} @@ -26,6 +26,6 @@ {{ end }} {{ with $s.apps }} - {{ partial "savings-calc.html" (dict "key" $key "apps" . "annual" $s.federatedAnnual "note" $s.calcNote) }} + {{ partial "savings-calc.html" (dict "key" $key "apps" . "plans" $s.federatedPlans "note" $s.calcNote) }} {{ end }} {{ if $s.ctas }}
{{ partial "sections/ctas.html" $s.ctas }}
{{ end }} diff --git a/public/css/style.css b/public/css/style.css index b505941..6f814d1 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -139,7 +139,7 @@ main:focus { outline: none; } .site-head.is-scrolled { background: #001a2bf2; backdrop-filter: blur(12px); } .head-bar { display: flex; align-items: center; gap: 32px; height: var(--head-h); } .brand { display: inline-flex; flex: none; } -.brand-logo { width: 148px; height: auto; filter: invert(1); } +.brand-logo { width: 148px; height: auto; filter: invert(1); translate: 0 -3px; } /* lifts the wordmark baseline onto the nav text baseline */ .head-nav { display: flex; align-items: center; gap: 2px; margin-right: auto; } .nav-item { position: relative; } diff --git a/public/index.html b/public/index.html index 935a6de..6139904 100644 --- a/public/index.html +++ b/public/index.html @@ -6,6 +6,9 @@ Federated Computer — The Computer for your business — and the AI that runs on it. + + + @@ -1441,79 +1444,79 @@

What would your business save?

- +
Which of these do you pay for?
@@ -1531,7 +1534,7 @@
-
You'd save$0/year
+
You save$0/year on the Good plan
Try the full calculator
@@ -1540,7 +1543,7 @@ (function () { var form = document.getElementById('customers-savings-calc'); if (!form) return; - var annual = +form.dataset.annual || 0; + var plans = JSON.parse(form.dataset.plans || '[]'); var range = form.querySelector('input[type=range]'); var shown = form.querySelector('.calc-users-value'); var fmt = function (n) { return '$' + Math.round(n).toLocaleString('en-US'); }; @@ -1553,16 +1556,19 @@ return 1000 + (step - 20) * 500; } function update() { - var n = users(+range.value), count = 0, cost = 0; + var n = users(+range.value), count = 0, cost = 0, need = 0; shown.textContent = n.toLocaleString('en-US') + (+range.value === +range.max ? '+' : ''); range.setAttribute('aria-valuetext', shown.textContent + ' people'); form.querySelectorAll('.calc-app input:checked').forEach(function (box) { count++; + need = Math.max(need, plans.findIndex(function (p) { return p.tier === box.dataset.tier; })); cost += +box.value * (box.dataset.perSeat === 'true' ? n : 1) * 12; }); out('count', count); out('cost', fmt(cost)); - out('savings', fmt(Math.max(0, cost - annual))); + var plan = plans[need] || plans[plans.length - 1] || { name: '', annual: 0 }; + out('savings', fmt(Math.max(0, cost - plan.annual))); + out('plan', plan.name); } form.addEventListener('input', update); update(); diff --git a/public/pricing/index.html b/public/pricing/index.html index 0cc874b..bfdf598 100644 --- a/public/pricing/index.html +++ b/public/pricing/index.html @@ -6,6 +6,9 @@ Pricing · Federated Computer + + + @@ -615,8 +618,8 @@
  • Federated - - $120 + + $159
  • @@ -645,223 +648,223 @@ - +
    Which apps do you pay for today?
    @@ -882,16 +885,16 @@
    Apps replaced0
    Their retail cost$0/year
    -
    You'd save$0/year
    +
    You save$0/year on the Good plan
    -

    Savings compare the retail price of the apps you pick with our Best plan billed annually ($2,900/year). Prices are typical list prices per person per month, or per month for flat-fee apps.

    +

    Savings compare the retail price of the apps you pick with the smallest hosted plan that replaces all of them, billed annually (Good $700, Better $1,450, or Best $2,900 a year). Prices are typical list prices per person per month, or per month for flat-fee apps.