> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lazyapp.in/llms.txt
> Use this file to discover all available pages before exploring further.

# Plans and limits

> Starter, Growth and Pro: prices, add-ons, yearly billing, GST, what each plan includes, and the 402 you get when you reach a limit.

Every plan is a flat price that pays LazyApp. Messages are billed separately by Meta, at Meta's rates, and LazyApp adds 0% to them. See [Pricing](https://docs.lazyapp.in/billing/overview.md) for how the two bills fit together.

## Plans

| Plan | Monthly | Yearly | WhatsApp numbers | Members | Broadcast sends a month |
| - | - | - | - | - | - |
| Starter | ₹499 | ₹4,990 | 1 | 2 | 2,000 |
| Growth | ₹1,499 | ₹14,990 | 1 | 5 | 15,000 |
| Pro | ₹3,999 | ₹39,990 | 3 | 15 | 1,00,000 (fair use) |

* **Starter** gives a small team one number with the inbox, templates, contacts, quick replies and QR links.
* **Growth** adds automations, WhatsApp Flows, payments and your catalog.
* **Pro** adds more numbers, a bigger team, the API with live keys, and webhooks.

Prices are in rupees. Plans are always billed in INR.

### Add-ons

Buy more room on any plan without moving up a plan:

| Add-on | Monthly | Yearly |
| - | - | - |
| Extra member | ₹299 each | ₹2,990 each |
| Extra WhatsApp number | ₹999 each | ₹9,990 each |

Add-ons sit on the same subscription as your plan, so they renew on the same date and at the same interval.

### Yearly billing

A yearly plan costs ten months' price: two months free. Add-ons on a yearly plan are yearly too.

### GST

18% GST is added to plan and add-on prices once LazyApp's GSTIN is registered. Until then no tax is added. The console shows "+ 18% GST" next to prices only when it applies, so the price you see is the price you pay. Add your own GSTIN in **Settings → Billing** to have it printed on your invoices.

### No free plan

There is no free plan. The shared test number is free in test mode, with every feature on, so you can build and test your integration before you pay. Connecting your own WhatsApp number needs a plan.

### Refund

Your first plan payment is refundable in full if you ask within 7 days. The **Billing** page shows this while your next plan payment would be your first.

### Payment

You pay by card through Stripe. Choosing a plan opens Stripe Checkout. After that, **Manage billing** opens the Stripe Customer Portal, where you change your card, download invoices and cancel. Stripe's invoice, with its hosted page and PDF, is your invoice of record. See [How billing works](https://docs.lazyapp.in/billing/mechanics.md).

## Feature gating

LazyApp enforces plans on the server, so the same limits apply in the console and through the API.

| | Starter | Growth | Pro |
| - | - | - | - |
| Inbox, templates, contacts, quick replies, QR links | Yes | Yes | Yes |
| Automations | No | Yes | Yes |
| WhatsApp Flows | No | Yes | Yes |
| Payments | No | Yes | Yes |
| Catalog | No | Yes | Yes |
| API with live keys | No | No | Yes |
| Webhooks | No | No | Yes |
| Your own WhatsApp numbers | 1 | 1 | 3 |
| Members | 2 | 5 | 15 |
| Live broadcast sends a month | 2,000 | 15,000 | 1,00,000 |

How each limit is counted:

* **Numbers** count your own connected WhatsApp numbers. The shared test number does not count.
* **Members** count people in the workspace plus invitations still waiting for an answer. An invitation holds a seat until it is accepted or expires.
* **Broadcast sends** count Live broadcast recipients queued or sent in the calendar month (UTC). The count resets on the 1st. LazyApp checks the count when you start a broadcast and refuses one that would go past it. A broadcast that is already running **pauses** when the month's sends are used up, and the workspace owner is told. Messages you send one at a time, replies and automations do not count.
* **Features** are checked when you create or change something. Opening, pausing, archiving and deleting stay open, so after a downgrade you can still see and tidy up what you built on a bigger plan.

### Test mode is never limited

Test mode uses the shared test number, and nothing in it is limited. Test API keys work on every plan, including with no plan at all. Build against test mode first, then choose the plan that fits what you need in Live.

### In the console

When you reach a limit in the console, LazyApp shows a message that says what to change, with an **Upgrade** or **Buy add-on** button that opens **Billing**.

## Plan limit reached

Through the API, a live key on a plan without the API returns HTTP `402` with the code `plan_limit_reached`. The body uses the standard [error shape](https://docs.lazyapp.in/concepts/errors.md): a `message` written for a person and a stable `code` to branch on.

That is a live key on a workspace below Pro. Every request with that key is refused:

```json theme={null}
{
  "message": "The API is on the Pro plan. Upgrade in Billing to use live keys. Test keys keep working.",
  "code": "plan_limit_reached"
}
```

Other limits are refused with `422` and a plain `message` that names the limit, not with `plan_limit_reached`: a broadcast with more recipients than the month's sends left, or connecting a number past your plan's numbers. On Pro you can still reach those two.

Branch on `code`, not on `message`. The message tells a person what to change in **Billing** and can be reworded. `402` with `plan_limit_reached` is not worth retrying: it keeps failing until the plan changes. Show the `message` to the person who can change the plan.

Test keys never get `plan_limit_reached`.

## Related

* [Pricing](https://docs.lazyapp.in/billing/overview.md)
* [How billing works](https://docs.lazyapp.in/billing/mechanics.md)
* [Payment issues](https://docs.lazyapp.in/billing/payment-issues.md)
* [Errors](https://docs.lazyapp.in/concepts/errors.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.