Going Live
Going live for a destination is a clean cutover, not a code rewrite. Your integration uses the same API shapes and follows the same flow. What changes is the App ID you send, the merchants you’re transacting against, and that real money starts moving. Production also runs on different hosts than the sandbox, so the base URLs change too — Firmly provides them at go-live.
This page covers what you should validate before going live, what Firmly reviews, and what to expect in the first hours and weeks of production traffic.
What “going live” actually means
| Before going live | After going live |
|---|---|
| Sandbox App ID | Production App ID |
| Test merchants only | Real merchants you’re approved for |
Test cards (4111111111111111, etc.) |
Real cards, wallets, real payment methods |
| Test orders — no money moves | Real orders, real charges, real fulfillment |
| Catalog has sample data | Catalog reflects real merchant inventory and pricing |
How the cutover works
| Stage | What happens |
|---|---|
| Pre-launch review | You schedule a working session with Firmly to walk through the integration. See Onboarding Phase 3 |
| Production App ID issued | Firmly issues a separate production App ID and enables your approved production merchants |
| You swap config | Your code reads the new App ID and the production base URLs from configuration. No SDK change, no protocol change |
| First production order | Smoke-test with a small order against a known production merchant before scaling traffic |
| Ramp traffic | Gradually increase live traffic — start with a small percentage of users, watch error rates and order success rates |
The cutover is a configuration change on your side — the new App ID. The base URL stays the same; the same Firmly platform serves both environments. What changes is your configuration and the merchants you’re scoped to, not your code.
Pre-launch checklist
Before requesting your production App ID, confirm you have these working in sandbox:
Auth and credentials
- App ID is read from configuration, not hard-coded in source
- Token renewal is implemented — browser sessions expire after ~1 hour; your code handles renewal without dropping user flows
- Server-to-server secrets (if used) are stored in your secrets manager, not in source
- The App ID is never logged or surfaced in error messages
Order placement
- Duplicate-order safety is handled: the core REST endpoints do not deduplicate on
Idempotency-Keytoday, so guard client-side (re-readcart_statusbefore any retry of a cart mutation or the order-placement call —complete-orderfor a cart built across calls, orplace-orderfor the one-shot path). SendIdempotency-Keyon the endpoints that do accept it (UCP bridge). See Errors & Conventions - Idempotency keys are stable for retry windows — same logical operation, same key
- Order success is validated against the response’s
cart_statusfield (submittedindicates success) - The merchant’s order identifier is captured for reconciliation
Error handling
- 4xx errors are surfaced to the user with appropriate messaging
- 5xx errors trigger retry with exponential backoff (cap at ~30 seconds — see Errors & Conventions)
- Specific error codes —
ucp_disabled,DomainNotFound, decline codes — have specific handling, not generic catch-all - Payment declines distinguish between hard declines (don’t retry) and soft declines (offer alternative payment)
Observability
- Request IDs are logged so you can correlate with Firmly’s logs during incident review
- Order placement attempts are logged with the idempotency key, merchant domain, and outcome
- A dashboard or log query exists for “orders attempted vs orders completed” so you can spot regressions
Cart and checkout flow
- Multi-shipment carts are handled — shipping method is set per shipment, not globally
- Shipping methods are read from each shipment’s inline
shipping_method_options(populated byset-shipping-info), not fromget-availability get-availability(delivery dates / time slots / pickup) is optional; merchants that don’t support it return501 NotImplemented, which your code tolerates and skips- The user’s chosen shipping address is validated client-side before submission to reduce 4xx on
/shipping-info
Production readiness
- Your monitoring is wired up — alerts on elevated error rates, failed orders, or auth failures
- Your team knows where to find Firmly request IDs in logs for incident triage
- Rate limits are documented and your code respects them — see Rate Limits
- Outbound network allows the sandbox hosts
api.firmly.workandcc.firmly.work. Production uses different hosts — allowlist the production base URLs Firmly gives you at go-live before you cut over
What Firmly reviews
The pre-launch review (Onboarding Phase 3) walks the same checklist from Firmly’s side. Common items the review surfaces:
- Idempotency not being sent on all mutations
- Token renewal not implemented (manifests as 401 errors after ~1 hour of activity)
- Retry storms on 503 — backoff missing or too aggressive
- Test cards still hard-coded — sandbox-only credentials present in code paths that will run in production
- Order success determined by HTTP status alone, not by the response body (a payment decline surfaces as a
422 CreditCardDeclinederror, so confirm success againstcart_status: "submitted"rather than assuming any 2xx means the order was placed)
After going live
Day 1
Smoke-test with one real production order. Confirm the merchant’s order shows up in their order management system. Watch your error rates for the next hour.
First week
Ramp traffic gradually. Watch order success rates, payment decline rates, and average time-to-order-placement.
First month
Review your funnel and attribution in the Destination Dashboard — your destination identifier should be on every order. Reconcile against Firmly’s reporting if discrepancies appear.
When something goes wrong
| Symptom | First thing to check |
|---|---|
| All requests returning 401 | App ID env-var swap missed — production App ID isn’t loaded |
| Specific merchant returning 404 | That merchant isn’t in your production App ID’s approved scope. Contact Firmly |
Specific endpoints returning 404 ucp_disabled |
The merchant hasn’t opted into the relevant capability. Firmly can confirm |
| Elevated decline rate | Card payments hitting a real-world decline rate (~5–10% is normal). If higher, check your test cards aren’t leaking into production paths |
| Orders placed but not in merchant OMS | Reconciliation issue. Capture the Firmly request ID and contact Firmly for triage |
What stays stable after go-live
After go-live, your integration is stable. The same App ID continues to work. Firmly may add new merchants to your scope (you get an email; no code change needed) or add capabilities behind feature flags — both are additive. Breaking changes go through advance notice and a deprecation window.
Related
- Onboarding — the full handshake, especially Phase 3 pre-launch review
- Destination Dashboard — track your funnel, orders, and attribution post-launch
- Authentication — auth model details
- Errors & Conventions — error catalog and retry patterns
- Rate Limits — production rate-limit posture