Builder (89/yr) includes a 14-day free trial. The trial is the refund policy: cancel during the trial and you’re never charged; charge lands on day 15 if you stay subscribed. This page covers the trial mechanics, how the Stripe Customer Portal works, and what happens on payment failure.Documentation Index
Fetch the complete documentation index at: https://docs.chatblocks.ai/llms.txt
Use this file to discover all available pages before exploring further.
The trial
Upgrade from /settings/billing
Workspace owner only can upgrade. Pick monthly or annual; both run through Stripe Checkout.
Provide a card
Card is required up-front — no card, no trial. The card is verified at Checkout but not charged.
Workspace flips to Builder immediately
On
checkout.session.completed (the webhook lands within seconds), workspaces.plan becomes builder. All Builder caps unlock instantly — you don’t have to wait 14 days to use scheduled runs or blocks.create.Trial-end reminder (day 11)
Stripe sends a
customer.subscription.trial_will_end webhook 3 days before the trial converts. The receiver logs this for now; an email reminder is a future enhancement.First charge on day 15
Unless you’ve cancelled, Stripe charges the card and the subscription transitions to
active. If the charge fails, see Payment failure below.Refund policy
No refunds. The trial is the refund. This is stated in two places:-
On the Stripe Checkout page via
custom_text.submit.message:14-day free trial included. All sales final after the trial.
-
On
/settings/billingin the workspace UI, near the upgrade and portal buttons.
The Customer Portal
The portal is hosted by Stripe — zero billing UI on our side. From/settings/billing → “Manage subscription,” workspace owners get redirected to a Stripe-hosted page that handles:
- Plan switching — monthly ↔ annual. Stripe computes the proration.
- Cancellation — schedules the subscription to end at the period boundary, or cancels immediately (your choice).
- Card update — replace the saved payment method.
- Invoice history — every charge and receipt.
The portal session is minted via
createPortalSession on the Convex side, which calls stripe.billingPortal.sessions.create. The return URL defaults to https://chatblocks.ai/settings/billing. Owner-only — co-members can’t open the portal.What customers see during trial vs after
| Day | Status | Builder caps | Card charged? |
|---|---|---|---|
| 0 (checkout) | trialing | Active | No |
| 1 – 14 | trialing | Active | No |
| 15 (first bill) | active | Active | Yes — full price |
| Cancelled mid-trial | canceled after day 14 | Drops back to Free at period end | No |
| Cancelled after bill | canceled at period end | Builder until period end, then Free | Already charged for current period |
"free" when Stripe’s customer.subscription.deleted webhook arrives — usually at the period boundary.
Payment failure
If the first charge (or any renewal) fails:- Stripe sends
invoice.payment_failed. - Our receiver flips
stripeSubscriptionStatustopast_dueorunpaid(whatever Stripe set). - Stripe’s smart retry schedule attempts the card again over the next few days.
- The workspace stays on Builder during this window — we don’t immediately yank access.
- After Stripe gives up (typically ~3 weeks), the subscription cancels and the workspace flips to Free.
Webhook events the receiver handles
The Convex webhook endpoint is at/webhooks/stripe-billing and dedupes events via billingWebhookEvents.externalEventId. It listens for 6 event types:
| Event | What it does |
|---|---|
checkout.session.completed | Stamps stripeSubscriptionId, flips plan to builder. |
customer.subscription.updated | Syncs stripeSubscriptionStatus + stripeCurrentPeriodEnd. |
customer.subscription.deleted | Flips plan back to free. |
invoice.payment_failed | Updates stripeSubscriptionStatus to past_due / unpaid. |
invoice.payment_succeeded | Confirms active + updates period end. |
customer.subscription.trial_will_end | Logged (no email yet). |
Frequently asked
Can I get a refund?
Can I get a refund?
No. The 14-day trial is the refund. Cancel during the trial and you pay $0.
What happens if I downgrade with over-cap resources?
What happens if I downgrade with over-cap resources?
Existing resources are preserved. New creates fail with
LIMIT_REACHED until you delete enough to get under the Free caps. The data isn’t lost — it’s just frozen at over-cap.Can I switch monthly → annual mid-month?
Can I switch monthly → annual mid-month?
Yes — open the Customer Portal, pick annual. Stripe prorates the difference and bills the rest immediately.
Do I get my BYOK keys back when I re-upgrade?
Do I get my BYOK keys back when I re-upgrade?
Yes. Downgrading doesn’t delete BYOK rows — they just can’t be used while you’re on Free (the panel is gated). Re-upgrading restores access.
Can a co-member upgrade for me?
Can a co-member upgrade for me?
No. Upgrade is owner-only. The owner is the immutable
ownerAuthUserId set on workspace creation — the paying operator.What’s next
Plans
Pricing and the full cap table.
Workspaces
Owner vs admin vs member — who can do what on a Builder workspace.