All documentation

Subscription / All-Access Plans

Recurring revenue for tutors and institutions — students subscribe once, access everything you publish.

Tutors · Institutions7 min read
Who this is for
Tutors and institutions who'd rather sell access than sell individual batches. Best for high-volume content creators and coaching centres with continuous course launches.

Overview

A subscription plan is a recurring product owned by a tutor or institution. A student who subscribes gets unlimited enrolment access to that owner's batches for the duration of the subscription.

Billing runs through Razorpay Subscriptions. The actual recurring charge, retry logic, and dunning are handled by Razorpay; Tuition.in listens to webhook events to keep subscription status in sync.

Creating a plan

  1. Open Tutor dashboard → Subscriptions → New plan.
  2. Fill in name (e.g. "All-Access Annual"), priceMonthlyInr, and optionally priceAnnualInr.
  3. Add a description and a feature list (string array).
  4. Save.
Razorpay plan must exist
Each subscription plan needs a matching Razorpay plan ID. The first subscription request creates it on Razorpay's side and stores the ID on the plan row. Pricing changes after that require a new plan (Razorpay plans are immutable on pricing).

Monthly vs annual

priceMonthlyInr is required. priceAnnualInr is optional — if set, the student sees both options at checkout and picks one. Common pattern: annual = 10× monthly (2 months free).

On annual subscriptions, Razorpay charges once and renews yearly. Monthly auto-renews every month until cancelled.

Plan features

features is a string array shown as a bullet list on the plan page. Example:

features: [
  "Unlimited access to all batches",
  "Live class replays",
  "Weekly DPP",
  "Mock test series included",
  "Direct WhatsApp support",
]

Use them to sell — keep them concrete and concise.

Razorpay subscription flow

  1. Student clicks Subscribe on a plan page.
  2. Tuition.in creates a Razorpay customer (if not exists) and a subscription against the plan.
  3. The student is redirected to Razorpay's checkout to authorise the mandate (eMandate / card).
  4. On successful authorisation, the first charge runs immediately.
  5. Razorpay POSTs a subscription.activated webhook → Tuition.in marks the local subscription ACTIVE.

Webhook events

Configure the Razorpay dashboard to POST to /api/webhooks/razorpay-subscription. Events handled:

  • subscription.activated — mark local sub ACTIVE, grant enrolment access.
  • subscription.charged — record successful renewal, extend access until next cycle.
  • subscription.cancelled — mark CANCELLED but keep access until paid-through date.
  • subscription.completed — terminal state at end of paid period; revoke access.
  • subscription.pending, subscription.halted — payment retry / failure states.

Webhook auth uses Razorpay's HMAC signature header; mismatched signatures are rejected with 401.

Managing subscribers

From Subscriptions → Subscribers:

  • List all active and past subscribers with start date, current cycle, next charge date.
  • See payment history per subscriber from the Razorpay subscription ID.
  • Filter by status — ACTIVE, CANCELLED, HALTED, COMPLETED.

Cancellation & refunds

Students cancel from their own dashboard. Cancellation flows:

  1. Tuition.in calls Razorpay's cancel-subscription endpoint with cancel_at_cycle_end: true.
  2. Razorpay schedules cancellation at the end of the current billing cycle.
  3. The student keeps access through the paid-through date.
  4. The subscription.completed webhook fires at the end → access revoked.

Refunds during a cycle require manual action: refund through the Razorpay dashboard and then revoke access on Tuition.in if you want the cancellation to be immediate.


Header Logo