From f1a4be18ce5ea04ab3b3e29f32441369f6ef687d Mon Sep 17 00:00:00 2001 From: abrichr Date: Fri, 24 Jul 2026 19:55:24 -0400 Subject: [PATCH] Simplify pricing decision paths --- components/Pricing.js | 415 ++++++++++++++++++++++++---------------- cypress/e2e/basic.cy.js | 52 ++++- 2 files changed, 291 insertions(+), 176 deletions(-) diff --git a/components/Pricing.js b/components/Pricing.js index 56b655e..5490cbf 100644 --- a/components/Pricing.js +++ b/components/Pricing.js @@ -47,6 +47,55 @@ function FeatureList({ items }) { ) } +function EntryCard({ + id, + eyebrow, + title, + price, + priceDetail, + description, + features, + children, + featured = false, +}) { + const titleId = `${id}-title` + + return ( +
+

{eyebrow}

+

+ {title} +

+
+ + {price} + + {priceDetail && ( + {priceDetail} + )} +
+

+ {description} +

+ +
{children}
+
+ ) +} + function HostedCheckoutButton({ available }) { const [state, setState] = useState('idle') const [message, setMessage] = useState('') @@ -66,7 +115,9 @@ function HostedCheckoutButton({ available }) { }) const payload = await response.json() if (!response.ok || !payload.url) { - throw new Error('We could not open secure checkout. Please try again.') + throw new Error( + 'We could not open secure checkout. Please try again.' + ) } window.location.assign(payload.url) } catch (error) { @@ -89,14 +140,7 @@ function HostedCheckoutButton({ available }) { }) } > - Start with our team - - - Qualify a managed workflow + Get Cloud setup help ) @@ -119,7 +163,10 @@ function HostedCheckoutButton({ available }) { : 'Start hosted subscription'} {state === 'error' && ( -

+

{message}{' '} Contact us to complete setup. @@ -136,9 +183,9 @@ export default function Pricing({ hostedOffer = null }) { ) const hostedOfferAvailable = Boolean( hostedOffer?.amount && - hostedOffer?.cadence && - hostedOffer?.product && - runCapLabel + hostedOffer?.cadence && + hostedOffer?.product && + runCapLabel ) return ( @@ -149,34 +196,32 @@ export default function Pricing({ hostedOffer = null }) {

Pricing

- Start with one workflow. Earn the right to scale it. + Choose how you want to start.

- OpenAdapt Community is free. Enterprise work begins with a paid - qualification of one application, one environment, and one - measurable business effect. The managed Cloud subscription is a - separate self-service lane for approved workflows. + Run OpenAdapt yourself, qualify a consequential enterprise + workflow with our team, or subscribe to managed Cloud for an + approved workflow.

-
-
-

OpenAdapt Community

-

- Free -

-

- MIT-licensed local runtime and qualification tools for - self-directed use. -

- -
+ + -
- - Recommended first step - -

Workflow Qualification Sprint

-

- From $15,000 -

-

- Ten-business-day target for a bounded workflow -

-

Native, RDP, and Citrix qualifications are typically - $25,000–$40,000. The sprint is paid even when the correct - outcome is not to automate. + $25,000–$40,000. The sprint is paid even when the + correct outcome is not to automate.

-
- + Qualify one workflow -
+ -
-

Supervised Production Pilot

-

- $30,000–$60,000 -

-

- One workflow, one application, and one environment - running representative cases under supervision or in - shadow mode. -

- -
- - Scope a pilot - -
-
- -
-
-

Production

-

- $48,000–$120,000 annually -

-

- Priced by qualified workflow family, application and - environment, runners, evidence requirements, support, - and requalification obligations—not primarily by seat - or run. -

-
-
-

OEM

-

- $75,000–$150,000 annual minimum -

-

- Embed the governed contract in your product: - - execute(bundle, parameters) → VERIFIED | HALTED → evidence + +

+ + {hostedStatusLabel} - Integration work is scoped separately. -

-
-
- -
-
-
-
-

OpenAdapt Cloud

- - {hostedStatusLabel} - -
-
- - {hostedOffer?.amount || LAUNCH_PRICE_DISPLAY} - - - {hostedOffer?.cadence || LAUNCH_PRICE_CADENCE} - -
{runCapLabel && ( -

{runCapLabel} -

+ )} -

- A separate self-service managed lane for approved - workflows: run history, evidence, usage, and workflow - updates in one control plane. It does not include an - enterprise qualification sprint, production SLA, or - regulated deployment. -

-

- Approved sanitized artifacts may enter Cloud; sensitive - live observations stay inside the declared execution - boundary.{' '} - - Review the security boundary. - -

-
- -

- By subscribing, you agree to the{' '} - - Terms of Service - {' '} - and{' '} - - acknowledge the Privacy Notice - - . + +

+ By subscribing, you agree to the{' '} + + Terms of Service + {' '} + and{' '} + + acknowledge the Privacy Notice + + . +

+

+ Approved sanitized artifacts may enter Cloud; + sensitive live observations stay inside the declared + execution boundary.{' '} + + Review the security boundary. + +

+ +
+ +
+

After a successful qualification

+

+ Move from evidence to production. +

+

+ A sprint ends with a go/no-go decision. When the + workflow qualifies, the next two scopes take it through + representative cases and into an annual production + deployment. +

+ +
+
    +
  1. +

    + 1 · SUPERVISED PRODUCTION PILOT +

    +

    + $30,000–$60,000 +

    +

    + One workflow, one application, and one + environment running representative cases + under supervision or in shadow mode. +

    +

    + Includes measured VERIFIED, HALTED, and + intervention rates, security and deployment + review, and a production acceptance report. +

    +
  2. +
  3. +

    + 2 · PRODUCTION +

    +

    + $48,000–$120,000 annually +

    +

    + Priced by qualified workflow family, + application and environment, runners, + evidence requirements, support, and + requalification obligations. +

    +

    + Pricing is based on the operating scope—not + primarily by seat or run. +

    +
  4. +
+ +
+

+ Embed the governed contract in your product. + Integration work is scoped separately. +

+ + execute(bundle, parameters) +
→ VERIFIED | HALTED +
→ evidence +
+ +
+
+ + Scope the enterprise path +
@@ -339,8 +418,8 @@ export default function Pricing({ hostedOffer = null }) { {hostedOfferAvailable ? 'The Cloud subscription price comes directly from Stripe and is confirmed again at checkout.' : 'Cloud offer details are loaded from the live billing contract.'}{' '} - Enterprise scope, support, security, and continuity terms are - documented in the applicable order form. + Enterprise scope, support, security, and continuity terms + are documented in the applicable order form.

diff --git a/cypress/e2e/basic.cy.js b/cypress/e2e/basic.cy.js index d3dc645..cefc489 100644 --- a/cypress/e2e/basic.cy.js +++ b/cypress/e2e/basic.cy.js @@ -26,14 +26,12 @@ describe('canonical booking destination', () => { assertCanonicalBooking() }) - it('connects the qualification funnel to the canonical booking path', () => { + it('publishes the structured qualification entry point', () => { cy.visit('/qualify') cy.get('form[name="workflow-qualification"]').should('be.visible') cy.contains('Bring one workflow. Leave with a go/no-go answer.').should( 'be.visible' ) - cy.visit('/book') - assertCanonicalBooking() }) }) @@ -433,7 +431,9 @@ describe('public product truth', () => { cy.get('#side-by-side [role="region"]') .should('be.visible') .and('have.attr', 'tabindex', '0') - cy.contains('Qualify one workflow').scrollIntoView().should('be.visible') + cy.contains('Qualify one workflow') + .scrollIntoView() + .should('be.visible') cy.contains('Try locally').should('be.visible') }) @@ -447,7 +447,9 @@ describe('public product truth', () => { cy.viewport(375, 812) cy.visit('/') - cy.get('[data-testid="customer-case-study"]').scrollIntoView().should('be.visible') + cy.get('[data-testid="customer-case-study"]') + .scrollIntoView() + .should('be.visible') cy.document().then((document) => { expect(document.documentElement.scrollWidth).to.be.at.most(375) }) @@ -461,7 +463,10 @@ describe('public product truth', () => { .first() .scrollIntoView() .should('be.visible') - cy.get('a[href="/safety"]').first().scrollIntoView().should('be.visible') + cy.get('a[href="/safety"]') + .first() + .scrollIntoView() + .should('be.visible') cy.document().then((document) => { expect(document.documentElement.scrollWidth).to.be.at.most(375) }) @@ -553,8 +558,7 @@ describe('public product truth', () => { const inScrollContainer = (el) => { let node = el.parentElement while (node) { - const overflowX = - win.getComputedStyle(node).overflowX + const overflowX = win.getComputedStyle(node).overflowX if (overflowX === 'auto' || overflowX === 'scroll') { return true } @@ -594,6 +598,38 @@ describe('public product truth', () => { }) }) + it('presents three entry paths and keeps the Cloud deep link stable', () => { + cy.visit('/pricing#cloud-preview') + cy.location('hash').should('equal', '#cloud-preview') + + cy.get('[role="list"][aria-label="Ways to start with OpenAdapt"]') + .find('[role="listitem"]') + .should('have.length', 3) + + cy.get('#cloud-preview') + .should('be.visible') + .within(() => { + cy.contains('OpenAdapt Cloud').should('be.visible') + cy.get('[data-testid="hosted-run-cap"]').should('be.visible') + cy.get( + '[data-testid="hosted-checkout"], [data-testid="hosted-contact"]' + ).should('have.length', 1) + }) + + cy.get('[aria-labelledby="enterprise-path-title"]').within(() => { + cy.contains(/supervised production pilot/i).should('be.visible') + cy.contains(/production/i).should('be.visible') + cy.contains(/OEM/i).should('be.visible') + }) + + cy.viewport(375, 812) + cy.visit('/pricing#cloud-preview') + cy.get('#cloud-preview').scrollIntoView().should('be.visible') + cy.document().then((document) => { + expect(document.documentElement.scrollWidth).to.be.at.most(375) + }) + }) + it('documents the exact hosted checkout environment contract', () => { cy.readFile('.env.example').then((source) => { expect(source).to.include('STRIPE_SECRET_KEY=')