diff --git a/src/app/[locale]/dashboard/new/page.tsx b/src/app/[locale]/dashboard/new/page.tsx index b5d85ff..20a0609 100644 --- a/src/app/[locale]/dashboard/new/page.tsx +++ b/src/app/[locale]/dashboard/new/page.tsx @@ -81,6 +81,7 @@ export default async function NewInstancePage() { hasOrgBilling={hasOrgBilling} existingOrgBilling={orgBilling} setupFeeChf={pricing.tenantSetupFeeChf} + monthlyFeeChf={pricing.tenantMonthlyFeeChf} /> diff --git a/src/app/[locale]/dashboard/page.tsx b/src/app/[locale]/dashboard/page.tsx index 58a1afa..3bc1e3e 100644 --- a/src/app/[locale]/dashboard/page.tsx +++ b/src/app/[locale]/dashboard/page.tsx @@ -326,6 +326,7 @@ export default async function DashboardPage() { hasOrgBilling={hasOrgBilling} existingOrgBilling={orgBilling} setupFeeChf={platformPricing.tenantSetupFeeChf} + monthlyFeeChf={platformPricing.tenantMonthlyFeeChf} /> diff --git a/src/components/onboarding/onboarding-flow.tsx b/src/components/onboarding/onboarding-flow.tsx index f455cbd..75bf66c 100644 --- a/src/components/onboarding/onboarding-flow.tsx +++ b/src/components/onboarding/onboarding-flow.tsx @@ -31,6 +31,12 @@ interface OnboardingFlowProps { * step. Forwarded straight to the wizard. */ setupFeeChf?: number | null; + /** + * Recurring per-tenant monthly fee (net CHF). Forwarded to the + * wizard's review-step cost summary so the customer sees the ongoing + * commitment, not just the one-time setup fee. + */ + monthlyFeeChf?: number | null; /** * Bug 6: when present, the wizard is rendered in edit mode against * the given pending request. See `OnboardingWizard` for the full @@ -59,6 +65,7 @@ export function OnboardingFlow({ hasOrgBilling, existingOrgBilling, setupFeeChf, + monthlyFeeChf, editingRequest, }: OnboardingFlowProps) { const router = useRouter(); @@ -71,6 +78,7 @@ export function OnboardingFlow({ hasOrgBilling={hasOrgBilling} existingOrgBilling={existingOrgBilling} setupFeeChf={setupFeeChf} + monthlyFeeChf={monthlyFeeChf} editingRequest={editingRequest} onComplete={() => { // Navigate back to /dashboard and re-fetch on the server. The diff --git a/src/components/onboarding/wizard.tsx b/src/components/onboarding/wizard.tsx index abfcf18..3bd7b19 100644 --- a/src/components/onboarding/wizard.tsx +++ b/src/components/onboarding/wizard.tsx @@ -117,6 +117,13 @@ interface WizardProps { * the order skips the Checkout redirect (handled server-side). */ setupFeeChf?: number | null; + /** + * The platform's recurring per-tenant monthly fee (net CHF, before + * VAT). Shown on the review step alongside the setup fee so the + * customer sees the ongoing commitment — not just the one-time + * charge — before submitting. Null/0 hides the monthly line. + */ + monthlyFeeChf?: number | null; /** * Bug 6: when present, the wizard renders in "edit" mode — fields * are pre-populated from the request, the SOUL.md auto-fetch is @@ -157,6 +164,7 @@ export function OnboardingWizard({ hasOrgBilling, existingOrgBilling, setupFeeChf, + monthlyFeeChf, editingRequest, onComplete, }: WizardProps) { @@ -1382,28 +1390,46 @@ export function OnboardingWizard({

{t("confirmNote")}

- {/* Phase 9b: order-time setup-fee notice + amount. The - figure shown is the net platform fee (before VAT); - VAT is added server-side based on the billing - country. We show "+ VAT" rather than a computed - gross to avoid mis-displaying a country-dependent - total. If setupFeeChf is null/0, no charge happens - and the whole block is suppressed. */} - {typeof setupFeeChf === "number" && setupFeeChf > 0 && ( + {/* Cost summary. Surfaces the full commitment before + submitting — not just the one-time setup fee but the + recurring monthly per-assistant fee and the fact that + AI usage is billed by consumption (with the budget-cap + control as the reassurance). All figures are net (before + VAT); VAT is added server-side per billing country, so + we show "+ VAT" rather than a country-dependent gross. + The block is suppressed only when there are no fixed + fees at all. */} + {((typeof setupFeeChf === "number" && setupFeeChf > 0) || + (typeof monthlyFeeChf === "number" && monthlyFeeChf > 0)) && (
- - {t("setupFeeNoticeHeading")} + + {t("costSummaryHeading")} -
- {t("setupFeeAmountLabel")} - - CHF {setupFeeChf.toFixed(2)}{" "} - - {t("setupFeePlusVat")} + {typeof setupFeeChf === "number" && setupFeeChf > 0 && ( +
+ {t("costSetupLabel")} + + CHF {setupFeeChf.toFixed(2)}{" "} + + {t("setupFeePlusVat")} + - +
+ )} + {typeof monthlyFeeChf === "number" && monthlyFeeChf > 0 && ( +
+ {t("costMonthlyLabel")} + + CHF {monthlyFeeChf.toFixed(2)}{" "} + + {t("setupFeePlusVat")} + + +
+ )} +
+ {t("costUsageNote")}
- {t("setupFeeNoticeBody")}
)}