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/'],