Go-Live Checklist
Prove your NRS Invoice Gateway integration in test state, run the failure drills, and cut over to live as a controlled release.
Use test state to prove your whole integration, including how it handles failures, then move to live as a separate, controlled release. A successful sign in test isn't enough on its own. You also need durable mappings, billing recovery, delivery handling, and security controls.
This checklist follows that order: prove your integration in test, run the failure drills, cut over to live, then watch the signals after launch.
Prove your integration in test
Work through each group in test state. Your progress is saved in this browser.
Account and credentials
Represented businesses
cryptoVersion: 0 is a valid production state. It means no QR material is stored, and QR generation never blocks onboarding, signing, or transmission.
Invoice data
Validate a set of representative invoices before your first sign test:
- The smallest and largest invoices you expect, with multiple lines and tax subtotals.
- A commercial invoice plus every note type your product supports.
- A receiver that is connected and one that is unavailable.
- An invalid TIN, an outdated resource code, a bad total, a duplicate IRN, and a malformed body.
- Unexpected NRS responses: additive fields, changed types, malformed success JSON,
202,204,401,403,429, a redirect, a timeout, and an oversized body. - A payload near your size limit. The Gateway's default limit is 10 MiB.
Your mode
Your deployment should record the approved mode and its version, and alert on a state or mode conflict instead of retrying. Then check the list for your mode.
Pass-through
Stored
Webhooks
Skip this group if inbound receipt isn't in your launch scope. Inbound receipt needs separate approval from Duplo for each environment, so read the webhooks guide before you include it.
Security
Run the failure drills
Prove these behaviors in an authorized test environment:
| Drill | Expected system behavior |
|---|---|
| Insufficient wallet balance | NRS is not called; the invoice stays recoverable; operators see 402 GW_BILLING_WALLET_DECLINED guidance |
| Invalid NRS document | The rejection is recorded; no blind retry loop starts |
| Pass-through success | One charge and one durable sign result are linked to the IRN, idempotency identity, and request ID |
| Duplicate Pass-through attempt | 409 enters original-result recovery; no random key is generated |
GW_SIGN_OUTCOME_UNCONFIRMED | Automation freezes that IRN and opens a reconciliation case with requestId |
| Stored intake response lost | The exact request is resent with the same key and resolves to one invoice |
| Stored invoice stays pending | The poller backs off and alerts after its own deadline without resubmitting |
| Transmission timeout | The system reads the current state and retries delivery only; it never signs again |
| Rate limit | The caller backs off with jitter, caps concurrency, and honors Retry-After when present |
GW_REQUEST_BODY_TIMEOUT | The caller sends the complete body promptly and keeps the same mutation identity |
GW_GATEWAY_CAPACITY_EXCEEDED | The caller honors Retry-After and doesn't fan out to another host or key |
Finance and engineering should also be able to trace any sign in a chosen period through this chain:
Your sign commands
↔ Gateway request ID/idempotency/IRN
↔ NRS result or reconciliation state
↔ Duplo signing fee movement/reversalCut over to live
Moving to live is a controlled process with Duplo, not a dashboard toggle:
- Stop test invoice producers and reconcile every in-flight sign, billing attempt, Stored invoice, and unresolved transmission.
- Coordinate with Duplo to place the domain in
drainingand complete the Duplo Dashboard state change. Expect the old key, represented-business access, and domain approval to stop working. - Sign in again, confirm that Duplo Dashboard shows
live, and generate a live API key. - Configure the live webhook and caller IPs on that key. If you rely on IP restriction, confirm that Duplo has enabled enforcement in live.
- Wait until the domain status is
approvedin live with the expected mode and version. - Onboard each represented business in live and save the new mappings.
- Run the connection check, NRS resource reads, a recipient lookup, and a validation before the first billed sign. These checks don't prove that the wallet is funded or that a mapping is correct.
- Send one controlled invoice, keep its full audit trail, transmit it, and reconcile its signing fee.
- Ramp volume in stages while you watch billing, NRS latency and errors, Stored queue age where applicable, and webhook delivery.
Do not bypass reapproval
A state or mode mismatch returns 409 by design. Don't change the hostname,
forge state or mode fields, reuse a revoked key, or call NRS directly to work
around it. Finish the controlled domain workflow and preserve in-flight
reconciliation.
After launch
Decide who owns each signal before launch:
| Signal | Owner | Immediate action | Escalation data |
|---|---|---|---|
401 surge | Security/integration | Verify secret deployment and key status; stop rotation loops | Host, state, timestamps, key prefix/last four only |
409 state or mode drift | Platform owner | Pause intake and read the current domain configuration | Domain status, mode/version, request ID |
GW_BILLING_WALLET_DECLINED | Finance + operations | Pause billed intake; check wallet and account readiness | Request ID, IRN, represented-business ID, UTC time, sanitized error |
GW_SIGN_OUTCOME_UNCONFIRMED | Reconciliation owner | Freeze the IRN and preserve evidence; don't re-sign | Request ID, operation ID when present, idempotency key, NRS lookup |
GW_TRANSMIT_ATTEMPT_ALREADY_PROCESSED | Reconciliation owner | Use the returned operation ID; don't bypass the existing claim | Request ID, operation ID, IRN, idempotency key |
GW_TRANSMIT_OUTCOME_UNCONFIRMED | Reconciliation owner | Freeze transmission and reconcile its claim; don't resend | Request ID, operation ID, IRN, idempotency key, NRS lookup |
| Stored pending beyond your SLO | Operations | Keep polling bounded and open an investigation | Invoice ID, IRN, represented-business ID, timestamps |
| Webhook outage | Application owner | Restore a 2xx receiver and reconcile through the invoice API | Delivery and invoice IDs, outage window |
| NRS resource rejection | Tax/integration | Refresh the current catalog and review your payload mapping | NRS status, resource version and time |
For escalation, send Duplo the billing support packet. Never include full credentials or private cryptographic material.
How is this guide?
Last updated on