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:

DrillExpected system behavior
Insufficient wallet balanceNRS is not called; the invoice stays recoverable; operators see 402 GW_BILLING_WALLET_DECLINED guidance
Invalid NRS documentThe rejection is recorded; no blind retry loop starts
Pass-through successOne charge and one durable sign result are linked to the IRN, idempotency identity, and request ID
Duplicate Pass-through attempt409 enters original-result recovery; no random key is generated
GW_SIGN_OUTCOME_UNCONFIRMEDAutomation freezes that IRN and opens a reconciliation case with requestId
Stored intake response lostThe exact request is resent with the same key and resolves to one invoice
Stored invoice stays pendingThe poller backs off and alerts after its own deadline without resubmitting
Transmission timeoutThe system reads the current state and retries delivery only; it never signs again
Rate limitThe caller backs off with jitter, caps concurrency, and honors Retry-After when present
GW_REQUEST_BODY_TIMEOUTThe caller sends the complete body promptly and keeps the same mutation identity
GW_GATEWAY_CAPACITY_EXCEEDEDThe 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:

Reconciliation chain
Your sign commands
↔ Gateway request ID/idempotency/IRN
↔ NRS result or reconciliation state
↔ Duplo signing fee movement/reversal

Cut over to live

Moving to live is a controlled process with Duplo, not a dashboard toggle:

  1. Stop test invoice producers and reconcile every in-flight sign, billing attempt, Stored invoice, and unresolved transmission.
  2. Coordinate with Duplo to place the domain in draining and complete the Duplo Dashboard state change. Expect the old key, represented-business access, and domain approval to stop working.
  3. Sign in again, confirm that Duplo Dashboard shows live, and generate a live API key.
  4. Configure the live webhook and caller IPs on that key. If you rely on IP restriction, confirm that Duplo has enabled enforcement in live.
  5. Wait until the domain status is approved in live with the expected mode and version.
  6. Onboard each represented business in live and save the new mappings.
  7. 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.
  8. Send one controlled invoice, keep its full audit trail, transmit it, and reconcile its signing fee.
  9. 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:

SignalOwnerImmediate actionEscalation data
401 surgeSecurity/integrationVerify secret deployment and key status; stop rotation loopsHost, state, timestamps, key prefix/last four only
409 state or mode driftPlatform ownerPause intake and read the current domain configurationDomain status, mode/version, request ID
GW_BILLING_WALLET_DECLINEDFinance + operationsPause billed intake; check wallet and account readinessRequest ID, IRN, represented-business ID, UTC time, sanitized error
GW_SIGN_OUTCOME_UNCONFIRMEDReconciliation ownerFreeze the IRN and preserve evidence; don't re-signRequest ID, operation ID when present, idempotency key, NRS lookup
GW_TRANSMIT_ATTEMPT_ALREADY_PROCESSEDReconciliation ownerUse the returned operation ID; don't bypass the existing claimRequest ID, operation ID, IRN, idempotency key
GW_TRANSMIT_OUTCOME_UNCONFIRMEDReconciliation ownerFreeze transmission and reconcile its claim; don't resendRequest ID, operation ID, IRN, idempotency key, NRS lookup
Stored pending beyond your SLOOperationsKeep polling bounded and open an investigationInvoice ID, IRN, represented-business ID, timestamps
Webhook outageApplication ownerRestore a 2xx receiver and reconcile through the invoice APIDelivery and invoice IDs, outage window
NRS resource rejectionTax/integrationRefresh the current catalog and review your payload mappingNRS 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

On this page