Skip to main content

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​

PlanMonthly FeeIngest Rate LimitMonthly Event QuotaChannels & Features
Pro (Active)₦50,000 / month100 RPS500,000 eventsAll 8 providers, circuit breakers, 2-tier rate limiting, RLS isolation
Free / Expired Grace₦0 / month1 RPS1,000 eventsTesting, 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:

  1. Reads GET /console/providers/delivery-mode, which returns platform_path_options: [{provider, option, contribution_kobo}] — the configured contributions, normalised and sorted.
  2. Renders only when effective_delivery_mode is platform and platform_delivery_available is true; otherwise it shows Platform delivery as unavailable and disables submit.
  3. Submits POST /console/billing/subscribe with the selection, for example {"platform_path":[{"provider":"postmark","option":"email"}]}. An omitted platform_path keeps 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:

RefusalMeaning
platform_delivery_unavailableThe deployment carries no platform credentials, so Platform delivery cannot be priced or selected.
platform_rate_unconfiguredA selected provider option has no configured contribution.
invalid_platform_pathThe selection is malformed or repeats an option.

Managing your subscription​

Subscription management is restricted to workspace Owners via the dashboard at Settings → Billing:

  1. Subscribe: Click Upgrade to Pro to initialize Paystack checkout. You will be redirected to the secure Paystack payment modal.
  2. Server-Side Verification: Paystack redirects back to app.nervly.io/settings (appending the transaction reference), 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.
  3. 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 messages rows 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
  1. 7-Day Grace: During the grace period, traffic continues to process normally at 100 RPS so unexpected card expires do not disrupt production users.
  2. 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.
  3. Suspension: Prolonged non-payment — 14 days after the failed payment — or explicit subscription disablement marks workspaces.status = 'suspended', causing the gateway to reject calls with 403 Forbidden.

Next​