Integration Checklist
The normative go-live gate: the checklist your integration must satisfy before LoyaltyPlant activates it for production. Use it to self-assess before certification; LoyaltyPlant verifies the same items.
How to use: every box must be checked (or explicitly N/A with a reason) before go-live. Items are stated in wire/contract terms, so they apply whether you built with the SDK or the raw API. Links point to the section that explains each requirement.
Contract conformance
-
GET /v1/capabilitiesandGET /v1/healthare implemented and return valid bodies. - At least one payment-initiation endpoint is implemented —
authorize(two-phase) orsale(single-phase). - Every operation you support returns business outcomes as HTTP 200 +
status(SUCCESS/PENDING/DECLINED/RETRIABLE/UNKNOWN). ↳ - HTTP
4xx/5xxare used only for infrastructure errors; transient failures use5xxor200 RETRIABLE(never4xx). ↳ - Operations you don't implement return
501(raw-API services return it explicitly; the SDK does it automatically for un-overridden methods). -
transactionReferenceis returned on everySUCCESSandPENDINGresponse.
Capabilities declared honestly
-
GET /v1/capabilitieslists only operations you've implemented and tested. ↳ - Two-phase integrations declare
CAPTUREand implementauthorize+capture(+reverse); single-phase declareSALEand implementsale. - Refunds (
DIRECT_REFUND), redirect (REDIRECT_FLOW), webhooks (DIRECT_WEBHOOK), and status polling (STATUS_POLLING) are declared only if actually supported. - Wallet/tokenization capabilities, if declared, are handled inside
authorize/sale.
Idempotency
- Mutating operations are idempotent — a retried request never double-charges. Dedupe on
the
Idempotency-Keyheader (raw API) or onpaymentId/ your PSP's own idempotency (SDK, where the header isn't passed to thePaymentIntegrationmethod). - A replay of the same logical operation returns the same response / has no second side effect (verified with a real duplicate request). ↳
Asynchronous flow & result callback (if you use 3DS/redirect)
-
authorize/salereturnsPENDINGwith aredirectUrland atransactionReference. - Your PSP webhook endpoint verifies the signature before acting.
- You POST the result to
/gate/integration/{integrationId}/resultusing the inbound token and anIdempotency-Key. ↳ - The callback's
transactionReferencematches the one from thePENDINGresponse. - Tested end-to-end against a real PENDING transaction — the suspended payment resumes.
- Callback retries until
200; replays are no-ops.
Error handling
- PSP decline codes are mapped to standard
PaymentErrorCodevalues where possible (unmappable → passed through; LoyaltyPlant falls back toGATEWAY_ERROR). ↳ - Business declines surface as
200 DECLINED(not as an HTTP error, nor a genericUNKNOWN). - Wire values are sent exactly as in the spec (e.g.
FAILURE_3DS_CHECK).
Security
- TLS with a valid certificate; no plaintext.
- The outbound token is validated (constant-time) on every
/v1/*request; mismatches →401. ↳ - The inbound token (callback credential) is stored as a secret and never logged.
- Tokens are not in source control; rotation is supported (overlapping old+new).
- No full PANs/tokens/secrets in logs or
reasonstrings.
Health, limits & reconciliation
-
GET /v1/healthreflects real PSP connectivity (returnsDOWN/503when unhealthy). - Synchronous endpoints respond well within the request timeout (default 10 s). ↳
- The service behaves correctly under the configured rate/concurrency limits.
- If you use async flows,
STATUS_POLLING(inquire-status) is implemented for reconciliation. ↳
Onboarding & certification
- All values are provisioned by LoyaltyPlant:
integrationId, outbound token, inbound token,settings, limits, callback host. ↳ - Separate credentials are used for staging vs production.
- LoyaltyPlant's certification test cases pass in staging.
- Test report with
orderIdfor all test cases are provided to and validated by LoyaltyPlant. - Demo is conducted for LoyaltyPlant.
- LoyaltyPlant confirms the integration is certified.
When every box is checked and certification passes, you're ready for go-live.
← Back to Overview