Skip to content

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, and users.b2c_plan caches 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