From a3440e4db8ded4ce688470bae1d97e2df8ceb2f9 Mon Sep 17 00:00:00 2001 From: Gerard Louis Recinto Date: Fri, 2 Oct 2026 14:25:39 -0700 Subject: [PATCH] add a payment link switch for the pro request flow, empty until a live link exists --- demo/index.html | 11 +++++++++++ docs/MONETIZATION_AND_TIERS.md | 2 ++ tests/homepage.spec.ts | 14 ++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/demo/index.html b/demo/index.html index b53020dea..9f54161f0 100644 --- a/demo/index.html +++ b/demo/index.html @@ -2043,6 +2043,12 @@

${res.title}

} }); + // Stripe Payment Link for Pro. Empty keeps the email-only fallback below. + // Set this to the live-mode link (https://buy.stripe.com/...) once Pro is + // sold through Stripe; a test-mode link must never ship here. Pro is + // fulfilled by hand after payment, there is no license automation yet. + window.JOLTRIN_PRO_PAYMENT_LINK = ''; + async function initiateProCheckout(e) { e.preventDefault(); const form = e.target; @@ -2095,6 +2101,11 @@

${res.title}

return; } + if (window.JOLTRIN_PRO_PAYMENT_LINK) { + window.location.href = `${window.JOLTRIN_PRO_PAYMENT_LINK}?prefilled_email=${encodeURIComponent(email)}`; + return; + } + // No billing backend reachable from this static site (e.g. this is the // GitHub Pages deployment, which serves static files only). Be honest // about that instead of faking a checkout session. diff --git a/docs/MONETIZATION_AND_TIERS.md b/docs/MONETIZATION_AND_TIERS.md index 9b21210db..a2cbec40f 100644 --- a/docs/MONETIZATION_AND_TIERS.md +++ b/docs/MONETIZATION_AND_TIERS.md @@ -15,6 +15,8 @@ Commercial tiers are focused entirely on **enterprise governance, compliance, po | **Enterprise Governance** | **Custom** / Annual Contract | Self-Hosted Enterprise | Commercial | • Enterprise SSO: **Okta** & **Microsoft Entra ID**
• Multi-tenant RBAC & tenant isolation boundaries
• Real-time audit streaming (SIEM / Kafka)
• Custom safety invariant enforcement engine
• Fine-grained barrier verification rules
• Dedicated enterprise compliance & SLA guarantees | **Foundation Implemented** (`governance/`) | | **Hosted Cloud** | *Usage-based* | Managed Cloud SaaS | Commercial | • Managed Joltrin instances (zero-ops)
• Cloud-hosted MCP hub & multi-agent routing
• Multi-region database replication
• Managed agent coordination network
• Automated off-site snapshots & backup verification | **Planned / In Development** | +Pro is sold through a Stripe Payment Link on the homepage and fulfilled by hand: after payment, setup and license details are emailed within one business day. The webhook and checkout code in `governance/` still switch the hosted server's own tier, but nothing issues a license key to a self-hosted install yet, so the hosted app is not used to sell Pro. + --- ## 2. Architectural Boundary: The `governance/` Package diff --git a/tests/homepage.spec.ts b/tests/homepage.spec.ts index 05378bff4..54f81b7f7 100644 --- a/tests/homepage.spec.ts +++ b/tests/homepage.spec.ts @@ -51,6 +51,20 @@ test.describe('Homepage', () => { await expect(page.locator('#pro-checkout-status a[href^="mailto:"]')).toBeVisible(); }); + test('requesting Pro goes to the Stripe payment link with the email prefilled once one is set', async ({ page }) => { + await page.route('https://buy.stripe.com/**', (route) => + route.fulfill({ status: 200, contentType: 'text/html', body: 'stripe stub' })); + await page.goto('/', { waitUntil: 'domcontentloaded' }); + await waitForWasmReady(page); + await page.evaluate(() => { (window as any).JOLTRIN_PRO_PAYMENT_LINK = 'https://buy.stripe.com/live_example'; }); + await page.locator('#pricing').getByRole('button', { name: /request pro/i }).click(); + const modal = page.locator('#pro-checkout-modal'); + await page.fill('#pro-team-name', 'example-team'); + await page.fill('#pro-admin-email', 'admin@example.test'); + await modal.getByRole('button', { name: /^request pro$/i }).click(); + await page.waitForURL('https://buy.stripe.com/live_example?prefilled_email=admin%40example.test', { timeout: 10_000 }); + }); + test('canonical and social metadata point at joltrinhq.com on all three pages', async ({ request }) => { for (const [path, expected] of [ ['/', 'https://joltrinhq.com/'],