Plans, prices, monthly active users, and what happens on renewal, plan changes and failed payments.
Plans
| Plan | Base price | Usage | Team members |
|---|---|---|---|
| Free | $0 | Up to 10 MAU | Up to 10 |
| Premium | $19 / month | $0.03 per MAU | Up to 1 |
| Pro | $99 / month | $0.01 per MAU | Up to 3 |
| Team | $399 / month | $0.01 per MAU | 10 included, then $15/month per additional member |
A paid plan is its base price plus every monthly active user (MAU). No MAU is included, and a paying account always pays its base price, even at 0 MAU. Plans renew monthly through Stripe, and usage is never charged mid-month: a changed MAU applies at the next renewal. Agent Notify is in every plan. See the pricing page.
New accounts start with a 7-day free trial. After it, a Free account with more than 10 MAU must upgrade to keep sending.
Premium, 800 MAU: $19 + 800 × $0.03 = $43
Premium, 2,400 MAU: $19 + 2,400 × $0.03 = $91
Pro, 12,500 MAU: $99 + 12,500 × $0.01 = $224
Team, 20,000 MAU, 12 members: $399 + 20,000 × $0.01 + 2 × $15 = $629
Some older accounts are on a legacy Pro tier: $399/month including 50,000 MAU, then $0.00325 per additional MAU, with up to 3 team members. It isn't offered to new accounts.
Team members
A Team member beyond the included 10 is charged the prorated amount for the rest of the billing period when they join, then $15/month from the next renewal. Removing a member credits the unused part on your next invoice, and a pending invite costs nothing until it's accepted. Roles, invites, limits and what happens after a downgrade: Team members.
What each plan includes
| Feature | Free | Premium | Pro | Team |
|---|---|---|---|---|
| Push to all devices, and to one subscriber (all its devices) | Yes | Yes | Yes | Yes |
| Notification inbox: Classic mass and individual, the push API inbox and the web bell | Yes | No | Yes | Yes |
| Group pushes, and push API sends to more than one subscriber or device | Yes | No | Yes | Yes |
The legacy Pro tier includes everything, like Pro. On Premium, the features marked No answer with an explanation and nothing is sent or changed:
- Push API.
403with the error codeplan_upgrade_required, from every inbox call and from a send to a group, or to more than one subscriber or device. Registration, groups and memberships work on every plan, so an upgrade can send to existing groups right away, and notifications sent on Premium are already in the inbox. - Expo Push (Classic). A group push answers
201with a membership explanation instead ofSuccess!, and so does every mass and individual inbox call (listing, unread counts, marking read, deleting), so the SDK shows an empty inbox. Topic and follow pushes deliver nothing. See Topic push.
An agent checks a plan before calling with plan_features from the MCP server's get_account tool (GET /api/mcp/account): { "inbox": false, "group_sends": false } on Premium, true for both on every other plan.
How monthly active users are counted
Your MAU is the number of distinct devices, plus subscriber ids with no devices, that used your apps in the last 30 days.
- Registration counts. A device counts when your app registers on open:
registerNNPushToken,registerIndieIDor a device registration. - Whole account. One number across all your apps.
- Each device once. A phone with a device token and a subscriber id is one device. A reader with a phone and a tablet is two.
- Subscriber ids with no devices count one each.
- Shared ids count per device. When many people register under one subscriber id, such as a church or club, each member's device counts: 40 phones under one id count 40.
Native Notify recomputes your MAU every night. It's the Usage card under Settings → Plan & Usage in Native Notify and mau in get_account. It decides whether a Free account is within 10 MAU and sets a paid plan's usage charge.
Upgrades, downgrades and cancelling
| Change | Takes effect | Billing |
|---|---|---|
| Upgrade (Premium → Pro, Pro → Team) | Immediately | Prorated: you're charged the difference for the rest of the billing period right away. |
| Downgrade between paid plans (Pro → Premium) | Immediately | The lower price starts with your next billing period. |
| Cancel (Downgrade to Free) | End of the current billing period | Your plan and sending work until then, then the account moves to Free. A plan with a failed payment is cancelled right away. |
In Native Notify, open Settings (the gear icon, top right) → Plan & Usage and pick a plan. Cancel with Downgrade to Free under Settings → Danger Zone. There are no prorated refunds for the unused part of a billing period (see the Terms of Service). Your apps and data stay in your account.
Failed payments
- A renewal payment fails. Stripe retries, you're asked to update your card, and Native Notify shows a past-due banner. Sending keeps working for 7 days from the first failure.
- Still unpaid after 7 days, or once Stripe stops retrying: sending pauses at any MAU, since the Free plan's 10 MAU never apply to a paid plan. Registrations and inbox reads keep working.
- Update your card or pay the open invoice in the Billing portal. Sending resumes automatically when the payment succeeds.
Nothing is deleted at any point: your Stripe customer record, subscription, apps, devices, subscribers and inbox messages are all kept.
What the API returns while sending is paused
Send endpoints answer as they do when a free trial has ended, so an integration that already handles an expired trial needs no changes. A refused send isn't queued: send it again once sending resumes. Device registration and the inbox GET endpoints are unaffected.
Classic endpoints answer as their pages document for an expired trial. POST /api/notification and POST /api/indie/notification, for example, respond 201 with this text instead of Success!:
You must login to NativeNotify.com to become a paying member for push notifications to work. Your free trial period has ended.
POST /api/universal/notifications/send and POST /api/universal/test-send respond 403 with the error code trial_expired:
{
"error": {
"code": "trial_expired",
"message": "You must login to NativeNotify.com to become a paying member for push notifications to work. Your free trial period has ended."
}
}
Billing state for agents
The refusal mentions a free trial even on a paid account. To tell the causes apart, call the MCP server's get_account tool (GET /api/mcp/account). Its user object includes:
| Field | Meaning |
|---|---|
billing_status | The Stripe subscription status: active, past_due, unpaid, canceled, … |
billing_paused | true while sending is paused for an unpaid invoice. |
past_due_since | When the renewal payment first failed. |
billing_grace_ends_at | When the 7-day grace period ends. |
billing_period_end | When the current billing period ends, the next renewal. |
cancel_at_period_end | true after Downgrade to Free: the account moves to Free at billing_period_end. |
It also carries the plan as sub_name (0 Free, 1 Premium, 2 Pro, 3 legacy Pro, 4 Team), paid_sub and mau. Read it like this:
billing_pausedistrue: sending is paused for an unpaid invoice, whatever the MAU. The owner updates the card or pays the invoice in the Billing portal, and sending resumes on its own.billing_statusispast_dueandbilling_pausedisfalse: the grace period is running, and sending works untilbilling_grace_ends_at. Remind the owner to update the card.- Otherwise, on a Free account (
sub_name0): the 7-day trial is over and the account has more than 10 MAU, so it needs a paid plan.
Billing portal
Update your card, pay an open invoice, and download invoices and receipts in Stripe's Billing portal. Open it with Open Billing Portal under Settings → Plan & Usage in Native Notify.