Keys and setup
- Secret keys (
sk_) are only on your server and read from the environment. The browser only has a publishable key (pk_), which can read the plan catalog and nothing else. See authentication. - You use the latest Node.js, Python, Go and React SDK releases. See each SDK’s installation page for the current versions.
- The feature, plan, customer and active subscription exist before events are sent. The event name equals the feature code exactly.
- Customer identity comes from your authenticated backend, never from the browser.
- If a customer can hold more than one active subscription, you pass the subscription explicitly.
Events
- Each business event has a stored transaction ID, timestamp and payload. A retry sends all three unchanged; a new ID creates a new event. See idempotency.
- You send an event, then read usage back and see the expected count. Acceptance of a request is separate from asynchronous usage processing, so read after a few seconds.
- Batches have at most 100 events, and you resend a whole batch after an unreadable failure. See events.
- You tested a wrong event name: it is accepted but never counted.
Decisions and credits
-
can()is treated as a point-in-time decision, not a quota reservation. A503(usage_unavailable) is handled as an unavailable decision, never as permission or zero usage, with a bounded retry. You keep the request ID for support. Entitlement changes can take about a minute to refresh. - Credit-backed work uses
usage.trackwith a stable idempotency key per unit of work, and a denial (allowed=false) stops the work. - Initial subscription credit grants are asynchronous: you wait for the expected balance before admitting credit-backed work.
Errors and retries
- Your code retries only network errors, timeouts,
5xxand503withRetry-After, always with the same key and payload. It does not retry4xx. See errors. - You forced each of these once and saw the right behaviour: a bad key (
401), apk_key on a protected call (403), an unknown customer (404), the same idempotency key with a different request (409), and a network failure mid-request. - A retry from a new process passes an explicit
timestampforusage.track, because the SDK only remembers the time it filled in for the client that sent it.
Webhooks
- Your receiver verifies the signature on the raw body, deduplicates on
X-Nozle-Unique-Key, answers2xxwithin 30 seconds and returns200for events it does not handle. See receive webhooks. - You do not rely on delivery order, and you read the object from the API when you need its latest state.
Cost rating
- The Cost Rules and composition for the usage you price are configured and published.
- A test transaction shows its rated amount. An event with
uncostedstatus is recorded but has no rated cost yet: review its reason before it reaches financial reports.
Payments
- Your payment provider is connected and the flows your product exposes work: successful checkout, decline and retry, subscription changes, cancellation, renewal, refunds and authentication challenges. A free subscription or a rendered billing component does not test payment settlement.
- Checkout return URLs are on the allowlist of both Core and the Engine. See create checkout.
Operations
- You monitor your request errors, processing lag and reconciliation differences, and you have tested email delivery, any SSO provider you enable, and your own backup and restore.
- You measured your own workload before promising a capacity or latency SLA. Request acceptance throughput alone does not establish processing capacity.