Pricing and billing¶
Plans¶
| Free | Pro | |
|---|---|---|
| Price | ₹0 | ₹399 a month or ₹3,990 a year |
| Chat | Unlimited | Unlimited |
| Generations (presentations, research, exam prep, recaps, images, quick reads) | 10 a month, one shared pool | Unlimited, priority |
| Artifact previews | Full | Full |
| Downloads and copying from previews | Locked | Yes |
| Practice Hub | Top chapter per subject | Every chapter |
| Study Plan | 1 active plan | 3 active plans |
| My Space | 10 documents, 5 MB each | Unlimited, 25 MB each |
| Chat attachments | Capped per conversation and per week | Unlimited count |
Persona never changes limits. A free parent and a free learner get the same thing with different wording.
How locks behave¶
- Every mode is open. When the pool runs out, generation chips lock and open the paywall.
- The paywall appears on the attempt to download or copy, not on opening a feature.
- A plain oversize chat attachment is a validation error, not a paywall, because Pro has the same size limit.
- A persistent footer for free users links to pricing.
- Limits are enforced in the backend, not just hidden in the UI.
Payments¶
Checkout uses Razorpay (UPI, cards, netbanking) from any paywall.
- Activation happens on Razorpay's webhook, not on the browser's success callback. The webhook survives a dropped connection and Razorpay retries it for 24 hours.
- Webhooks are signature-checked, deduplicated by event ID, rejected if older than 5 minutes and checked for the right amount.
- Each order carries the user ID in Razorpay's signed notes, so a payment can only activate the account that created it.
- Every paid period is a row in
user_subscriptions, andusers.b2c_plancaches the current plan for fast reads.
Recurring subscriptions¶
Pro renews automatically through Razorpay Subscriptions. In Settings → Manage subscription a learner can:
- Cancel: Pro continues until the end of the paid period.
- Pause for up to 30 days, then it resumes automatically.
- Re-subscribe after cancelling.
Refunds are handled by ops in the Razorpay dashboard and applied through the refund webhook. There's no in-app refund button and no money-back guarantee. Learners who bought the older one-time monthly window keep it until expiry.
Account¶
Pause and delete live in Settings → Account. See Data protection.
Where it lives¶
Learner code lives in MySetu-AI/kwiloai-b2c; paths below are relative to its apps/web/src and apps/backend/src.
- Backend:
core/b2c_plans.py,services/b2c_quota.py,api/v1/payments.py,services/b2c_subscription.py - Web:
components/monetization/PaywallModal.tsx,QuotaPill.tsx,DownloadLockButton, Settings subscription tab - Site: pricing page and billing FAQ