Approved catalog and automatic display
Commercial direction approved on 13 September 2026: Plus 90/year and Pro 190/year per paid member, with finite included credits and separately purchased eligible top-ups.PROPOSED_WORKSPACE_CATALOG retains
its compatibility export name but now records the approved target version.
GET /api/v1/public/pricing projects only the four explicitly bound, active seat
products from the private billing catalog. Both landing implementations read it
through packages/internal-api; the response exposes amounts and USD currency,
not workspace/customer records or credentials. It has a 30-second shared cache;
visible clients refresh each minute. An invalid or unavailable catalog displays
no numeric price rather than inventing a fallback. Checkout remains authoritative
for currency, tax, seat count, discounts and the final payable amount.
The production product IDs in polar-workspace-product-ids.json were verified in
the authorized Tuturuuu dashboard and reconciled against the private catalog.
The organization ID is f31a1452-88f6-4979-a03f-3d00424a3100.
Legacy fixed-price products share the same display names. Existing subscriptions
retain their pricing; new paid self-service purchases use seat products for both
personal and team workspaces. Free-to-paid changes use checkout; paid-model
changes require an assisted migration. Never silently migrate subscribers.
The TanStack browser pricing query uses VITE_PUBLIC_WEB_API_ORIGIN at build time,
falling back to https://tuturuuu.com. Only use a public API origin for this value;
server-only internal origins and credentials must not be exposed to Vite clients.
Free-to-paid upgrades open Polar checkout; its minimum quantity covers purchased
capacity, members, pending workspace/email invitations, and target bounds. Polar
only supports Free subscriptions in checkout. Paid plan changes and explicit
seat adjustments use the subscription update API after in-app confirmation.
List-price estimates exclude existing discounts, tax and the final prorated
invoice. Seat-only updates do not replace the product, price or discount.
Invoice downloads come from Polar order history, not a subscription-price HTML
receipt. The legacy /api/billing/[wsId]/invoice link redirects to that history.
Checkout confirmation requires workspace billing permission, matching checkout
workspace metadata and a succeeded status; its displayed total includes provider
discounts and taxes. A checkout reference is not an invoice number.
Paid plan changes preserve the current quantity: adjust seats first when a target
minimum or reserved invitations need additional capacity. Paid billing-model
changes require assisted migration. Missing counts or bounds block updates.
Paid updates synchronize the database projection before reporting completion. If
projection fails after Polar succeeds, the UI reports pending synchronization and
disables resubmission. Pending billing dialogs offer a read-only status refresh. They unlock only
when the authoritative plan or seat count converges. A retry reconciles an already-applied
plan or quantity without invoicing the same change again. Pending state survives confirmation-dialog dismissal until
the billing page observes the target plan. Subscription projections insert without
overwriting existing rows, then update only for a newer provider timestamp or an
identical projection at the same timestamp. Equal-version conflicting payloads
are not ordered by arrival time. Older webhook deliveries return no subscription data, preventing stale
seat-assignment or cancellation side effects.
Polar’s subscription update endpoint
locks the provider subscription row. Its seat update service
treats an unchanged absolute quantity as a no-op before invoice generation. Keep
sending absolute quantities; do not implement a client-side increment/retry loop.
This is provider-source evidence, not a live concurrent-charge test.
An invitation alone does not increase the purchased quantity. All quantity
reductions must still cover members and both pending invitation tables.
The legacy preview endpoint returns list-price estimates, not discount- or tax-aware
quotes. Do not use those estimates to authorize payment.
Feature comparison maintenance
The shared comparison covers every app directory, with app/category filters, accent-insensitive search, selectable tiers, differences-only mode, compact status icons, keyboard/tap tooltips and visible numeric quotas. Expanded explanations also support touch users. Internal infrastructure is opt-in in the comparison and is never a purchasable upgrade. Restricted previews remain distinct from tier access. Standard platform gates sharefeature-tier-policy.ts with web.
Add capabilities, explanations in both locales, and source evidence when changing
an app’s public scope. The inventory regression fails when an app is unrepresented.
Approved capacity changes are marked awaiting rollout until the database policy
and required meters are deployed. Current database storage defaults remain
100 MiB / 20 GiB / 100 GiB per workspace for Free / Plus / Pro, subject to
configured overrides. Do not describe those current defaults as per-seat storage.
The ten-workspace account ceiling remains independent of paid plans.
Production allocation rows verified on 13 September 2026 differ from source
seeds: Free has 10,000 credits per person/month, Plus has 40,000 per seat and Pro
120,000 per seat. The approved 1,000 / 10,000 / 30,000 budgets are reductions,
not retained production defaults. Preserve existing grants and purchased packs;
enroll new contracts through a versioned policy and apply notice/grandfathering
before reducing existing entitlements. Do not rewrite global allocation rows as
an unannounced shortcut.
Reconcile Polar after commercial approval
Use the checked product mapping; never choose products by display name. Supply existing authorized production credentials through environment variables, never in source, command arguments, logs or pull request descriptions. Preview:--apply --approve-plan REVIEWED_SHA256. A sandbox preview cannot
authorize production writes. Sandbox IDs require their own explicit mapping.
Application waits for existing webhook/cron reconciliation using read-only
Supabase credentials (NEXT_PUBLIC_SUPABASE_URL, SUPABASE_SECRET_KEY). Only
successful production verification updates approved-workspace-prices.json, which
is an operator snapshot; public cards read the reconciled catalog. No subscription,
customer, discount or direct database mutations are performed by this script.
Deploy compatible webhook handling before changing Polar prices.
Provider updates and webhook processing are not one atomic transaction.
A failure can leave some provider products updated. Inspect all four products and
re-preview before retrying; do not reuse a stale hash or assume a rollback. This
is an explicit operator repricing workflow, with automatic propagation into the
public price cards after successful reconciliation.
The existing 100% discounts are assigned to specific internal Tuturuuu workspaces.
Preserve those arrangements. Attribute consumption to sponsored internal cost;
discounts must not bypass resource budgets, permissions or abuse protections.
Implemented safety controls
- AI rejects unavailable/malformed credit balances and unknown output pricing. Generation output is bounded by the credit-derived budget and a technical ceiling of 65,536 tokens. Larger credit balances do not bypass that ceiling. Existing credit purchases and expiry rules remain in force.
- Drive rejects unknown/invalid quota values and invalid byte arithmetic before issuing uploads. Infrastructure uses the same provider implementation. Deleting existing data to restore capacity is preferable to unexpected overage charges.
- Meet preview caps rooms at two hours from first admission, without extending the deadline on reconnect. Signed participant limits are bounded by server ceilings; the defaults remain eight publishers and 96 viewers. Admission and publishing check capacity; each publisher can register at most six media tracks. The server records participant-milliseconds through the deadline. Expiration disconnects clients and retains provider publication closures for retry. Failed cleanup uses exponential retry intervals from ten seconds to one hour; unconfirmed closures remain recorded instead of being silently discarded. AI and persisted recordings also consume their existing AI/storage allowances.
- Subscription lookup/count failures do not authorize new free subscriptions or additional seats. Trialing and past-due states follow the existing seat policy.
Launch blockers for sustainable usage billing
Track these as required work, not as completed guarantees:- Atomic reservations for concurrent AI jobs, invites and uploads, with idempotent settlement/release. A read-before-write capacity check alone permits races.
- Input tokens, cached tokens, retries, tools, embeddings, live audio, generated media and hosted execution must have trusted prices and workspace attribution. Output-token caps alone do not cover total invocation costs.
- Durable monthly workspace aggregation across rooms and restarts. Meet’s participant-time measure is server accounting; browser-reported bandwidth is partial diagnostic evidence and must not generate invoices.
- Storage byte-hours, egress, operations, orphaned/signed uploads and all storage providers need reconciliation. A stated upload size is not evidence of the final object size; signed uploads require verification and reservation expiry.
- Mail delivery, automation runs, public forms, hosted compute and other expensive product paths need the same reservation/settlement contracts before paid add-ons.
- Reconcile provider invoices against the usage ledger; track unpriced usage separately, refunds/retries/credits explicitly, and contribution margin by tier. Prove limits under concurrent load before relying on them for profitability.
Legal documents
The shared legal registry serves English and Vietnamese terms, privacy, DPA, SLA, subprocessor, acceptable-use and community documents. September 2026 changes are marked review drafts; their draft publication date does not establish a new contractual effective date. Acceptance/version history and existing agreements must be preserved when a reviewed version takes effect. Before publication, confirm the legal entity/address, territorial scope, actual retention/deletion behavior, AI training commitments, processor regions and subprocessor list. Contractual SLA remedies need an executed order and a supported Polar adjustment path; do not promise a general SLA or direct refund workflow that the merchant-of-record arrangement cannot fulfill. Validate consumer cancellation, refund and renewal disclosures for the actual markets served. Legal drafts are not an assertion that operational compliance has been audited. Primary references: Polar product pricing, product updates, Buyer Terms, Merchant terms, Vietnam Law 91/2025/QH15, and EU controller-processor clauses.Catalog delivery checks
Production catalog publication requires an enabled Polar webhook athttps://pay.tuturuuu.com/api/payment/webhooks, the raw format and product.updated event,
and a signing secret matching the trusted deployment environment. The sync
command checks these before changing prices and sends an unsigned probe: the
handler must return its signature rejection, not browser-session authentication
or hosting protection. Credentials remain in the deployment secret store.
Pay allows only the exact webhook POST and registered payment-cron GET paths
to reach their own signature or bearer-secret validators without a browser
session. Other billing APIs retain session checks and all paths retain edge
protection. Webhook signature headers alone never establish trust at the edge;
requests consume the configured rate-limit budget before signature validation.
Do not replace webhook authentication with an anonymous bypass.
On 13 September 2026, the approved four-product catalog was reconciled at
Plus 90/year and Pro 190/year per purchased seat.
The existing webhook had been disabled, and the Pay session middleware also
rejected provider deliveries. The endpoint was re-enabled without rotating its
secret or changing its event subscriptions; the four catalog records were
reconciled through the existing product-sync helper. Existing subscription
financial terms and internal 100% discounts were preserved. Verify successful
provider deliveries after deploying the middleware repair.