unPLUGDevelopers

Going live

Before we issue live keys, we review a run of your integration in the sandbox against this checklist. Work through it, then send it to support. The review takes about 2 business days.

Available at launch

Checklist#

Each item links to the guide that explains it. We check every one in the review.

Credentials#

  • The secret key lives only on your server, in a secrets manager or environment variable. It isn't in your app binary, your web bundle, your logs or your repo. See Authentication.
  • Your app gets member tokens from your server, which checks the guest's own session before calling POST /v1/member_tokens.
  • Your app handles 401 token_expired by asking your server for a new token and retrying once.
  • Sign out forgets the token and removes the device with DELETE /v1/members/me/devices/{device_id}.
  • You know how to rotate a key and who emails support if one leaks.

Members#

  • Sign-up creates the member with your user id as external_id, and you store the returned member id. See Members and sign-in.
  • You send phone_verified: true only for phone numbers you verified by SMS code.
  • Your app has an in-app account deletion option that calls DELETE /v1/members/me (or your server calls DELETE /v1/members/{id}). Apple and Google both require it.

Checkout and orders#

  • You show only rewards and codes from the preview's applicable list as tappable, and show the message for the rest. See Checkout and orders.
  • Every value-moving call sends an Idempotency-Key: POST /v1/members, /v1/redemptions, /v1/orders, /v1/orders/{id}/refunds and /v1/members/{id}/points_adjustments. Retries reuse the same key.
  • Every order carries your own external_order_id, the same one you use in your order system.
  • You post the order after payment is captured, not before.
  • Abandoned checkouts cancel their redemption with POST /v1/redemptions/{id}/cancel.
  • You handle a redemption that expired before payment finished.
  • Refunds and partial refunds in your order system call POST /v1/orders/{id}/refunds.

Webhooks#

  • Your endpoint verifies webhook-signature against the raw body, rejects timestamps more than 5 minutes off, and compares in constant time. See Webhooks.
  • It dedupes on webhook-id, answers 2xx within 10 seconds and processes the event afterwards.
  • It doesn't assume events arrive in order.

Push and in-app#

  • Support has your production Firebase and APNs credentials, bundle id, package name, deep link scheme and link domain. See Push and in-app messages.
  • Your app registers its device on every start and when the token, permission or signed-in member changes.
  • Your app reads the push payload keys, creates the Android channels marketing and transactional, and ships the iOS Notification Service Extension.
  • In-app messages never show during checkout.

Errors and limits#

  • You retry 429 and 5xx with backoff and the same Idempotency-Key, honor Retry-After, and don't retry other 4xx errors. See Errors.
  • You log the Request-Id header of every failed call.
  • Your peak traffic fits the rate limits: 50 requests a second per secret key, 10 per member token, and 20 previews a second per key. If not, ask support for more before launch.
  • Checkout still works if the loyalty API is down: the guest can pay without a reward, and you post the order once the API is back.

Run the sandbox test#

We review a real run in your sandbox brand, so do one end to end from your app or website on the build you plan to ship:

  1. Sign up a new guest. Use a test phone number from +15005550100 to +15005550199.
  2. Place an order with a reward or a code. Preview, redeem, pay, and post the order.
  3. Refund part of that order. Then refund the rest.
  4. Abandon a checkout after choosing a reward, so we see the cancel.
  5. Delete the account from inside the app.

Write down the Request-Id of each step and the external_order_id values you used.

Send it to support#

Email support@unplugdining.com with the subject "Go-live: your brand name" and include:

  • This checklist, with any item you skipped and why.
  • Your sandbox brand name and the Request-Ids and order ids from your test run.
  • Your planned launch date and the platforms launching (iOS, Android, web).
  • Your technical contact for production, and a second person for security notices.
  • Server egress IPs, if you want an IP allowlist on the live key.

What happens next#

  1. We review your run. About 2 business days. If something needs fixing, we reply with the item and the Request-Id that showed it.
  2. We issue live keys. You get a uk_live_ key for https://api.unplugdining.com/v1, with the scopes you asked for.
  3. You set up production. Register your production webhook endpoint with the live key and confirm it with POST /v1/webhook_endpoints/{id}/test. Map your production location ids from GET /v1/locations.
  4. You launch. Guests who already earn at your registers are linked when they sign up with a verified phone, so their points are waiting.

Warning Live keys move real points and rewards. Never point a test script or a load test at production.