Quotas and billing
Nervly operates on a transparent, predictable pricing model designed for developers bringing their own provider credentials. The same plans are published on the Nervly pricing page.
Pricing model
| Plan | Monthly Fee | Ingest Rate Limit | Monthly Event Quota | Channels & Features |
|---|---|---|---|---|
| Pro (Active) | ₦50,000 / month | 100 RPS | 500,000 events | All 8 providers, circuit breakers, 2-tier rate limiting, RLS isolation |
| Free / Expired Grace | ₦0 / month | 1 RPS | 1,000 events | Testing, evaluation, and degraded fallback |
- Zero channel markups: You pay upstream providers directly under your own commercial terms. Nervly charges only the flat platform fee.
- Paystack integration: Subscriptions are tokenized and billed monthly via Paystack with automated NGN card settlement.
Platform path pricing
Platform mode's price is the ₦50,000 base plus the sum of the configured
provider contributions: platform_price = ₦50,000 base + Σ configured provider contributions. The contribution table (PLATFORM_PROVIDER_RATES) is owned by
operations, and an empty selection is the base-only price.
The Platform path composer on the console's Providers page:
- Reads
GET /console/providers/delivery-mode, which returnsplatform_path_options: [{provider, option, contribution_kobo}]— the configured contributions, normalised and sorted. - Renders only when
effective_delivery_modeisplatformandplatform_delivery_availableis true; otherwise it shows Platform delivery as unavailable and disables submit. - Submits
POST /console/billing/subscribewith the selection, for example{"platform_path":[{"provider":"postmark","option":"email"}]}. An omittedplatform_pathkeeps the stored selection; an explicit empty array clears it (base-only).
The server is authoritative and fails closed on refusal — no partial price, no silent default and no charge on refusal. The named refusals are:
| Refusal | Meaning |
|---|---|
platform_delivery_unavailable | The deployment carries no platform credentials, so Platform delivery cannot be priced or selected. |
platform_rate_unconfigured | A selected provider option has no configured contribution. |
invalid_platform_path | The selection is malformed or repeats an option. |
Managing your subscription
Subscription management is restricted to workspace Owners via the dashboard at Settings → Billing:
- Subscribe: Click Upgrade to Pro to initialize Paystack checkout. You will be redirected to the secure Paystack payment modal.
- Server-Side Verification: Paystack redirects back to
app.nervly.io/settings(appending the transactionreference), where the app opens the billing tab and the control plane verifies the transaction server-side (POST /console/billing/verify) and activates the 100 RPS / 500k quota immediately. - Cancel Anytime: Click Cancel Subscription to disable recurring billing. Your Pro limits remain active until the end of the current billing period (
current_period_end).
Ingest quota enforcement
Nervly tracks usage in real time using atomic Redis counters in the ingestion path:
- Key Format:
usage:{workspace_id}:{YYYYMM}with a 35-day rolling TTL. - Atomic Metering: The gateway atomically increments this counter on each valid trigger call. If a call is rejected by rate limits or validation, the counter is decremented.
- Nightly Reconciliation: A nightly control plane job reconciles Redis counters against the authoritative count of
messagesrows in PostgreSQL.
When your workspace exceeds its monthly event quota (500,000 events), subsequent trigger requests return 429 Too Many Requests until the next billing period or limit adjustment.
Payment failures and dunning
If an automatic monthly renewal fails, Nervly initiates a structured 7-day grace period:
Day 0: Payment fails ──► Webhook invoice.payment_failed marks status 'past_due'
Email 1: 'Action required: payment failed for your Nervly subscription' sent to owner
(Active limits preserved during grace)
│
Day 4: Mid-grace check ─► Email 2: 'Final notice: your Nervly workspace falls back in 3 days' sent
│
Day 7: Grace expires ──► Automated quota sweep cuts limits:
rate_limit_rps = 1, monthly_event_quota = 1,000
Email 3: 'Your Nervly workspace limits are degraded' sent
│
Day 14: Still unpaid ─► Workspace suspended (workspaces.status = 'suspended')
Gateway rejects outbound requests with 403 Forbidden
- 7-Day Grace: During the grace period, traffic continues to process normally at 100 RPS so unexpected card expires do not disrupt production users.
- Degraded Free Tier: If unpaid after 7 days, limits drop to 1 RPS / 1,000 monthly events and the owner receives the "limits degraded" notice.
- Suspension: Prolonged non-payment — 14 days after the failed payment — or explicit subscription disablement marks
workspaces.status = 'suspended', causing the gateway to reject calls with403 Forbidden.