FAQs
Q1. What framework and datastore does the Marketplace Service use?
Fastify v5 (TypeScript) running as an AWS Lambda or a standalone server, backed by MongoDB (
marketplacedb_${STAGE}) with optional Redis caching.
Q2. What is the difference between an “app” and a “connector”?
They’re the same registry entity. “Connector” emphasises the deployment/invocation aspect — how the platform loads the code (bundled npm/Maven artifact, Lambda, or external HTTP) and how it reaches a downstream target system (
invocationTarget).
Q3. Which capabilities are actually enforced?
Only
PAYMENThas first‑class handling (a registeredpayment-v1contract, dedicated payment/provider endpoints, and enable‑time gating). Other capability strings are stored as metadata; notification behaviour keys off an app’snotificationcategory, not a capability flag.IAM/ADDRESS_VALIDATIONare not special‑cased.
Q4. How does an app get from creation to being usable in a store?
Register (
draft) → submit (pending) → approve (approved) → enable at business level → (for PAYMENT, configure payment first) → enable at store level (first app for an interface becomes default). Each step is validated and audited.
Q5. What events does the service emit and who consumes them?
It publishes
app.*andbusiness.app.*events on EventBridge (source: marketplace-service). Ruleeq-9-marketplace-event-rulefans everything withdetail-typeprefixapp.out to the User, PIM, Subscription, OMS and Cart service Lambdas. Publishing is disabled whenSTAGE=test.
Q6. How do apps register themselves automatically?
Via
POST /v1/apps/self-registerusing anX-App-Api-Key, or via anapp.deployedEventBridge event from the CI/CD pipeline (source: custom.pipeline) — both trigger the same idempotent self‑registration. Auto‑approve is on unlessMARKETPLACE_APP_AUTO_APPROVE=false.
Q7. What error format should clients expect?
{ errorCode, errorMessage, validations?, details? }with the HTTP status derived from the code (the digits afterEQ-MKT-) and anError-Coderesponse header. Marketplace codes use theEQ-MKT-prefix; some instance errors reuseEQ-INS-.
Q8. How is per‑tenant configuration handled?
Through layered config overrides (
business→store→service) merged into an effective config, including aserviceInstanceMap. There is no separate live per‑instance CRUD API — the instance routes exist in code but are not wired.
Q9. What happens when I disable or drain a payment app?
Drain sets the enablement to
DRAINING(rejects new transactions, lets in‑flight captures/refunds finish) and emitsapp.draining; new work then returnsAPP_DRAINING(422). Disable removes the enablement and, if it was the default, promotes another enabled app; it emitsapp.disabled.
Q10. Is authentication ever skipped?
Only when
AUTH_ENABLED=false(local development), which bypasses both JWT and API‑key authentication. In deployed stages, JWT (or API key for self‑register) is always enforced.
Revision History
2026-08-05 | JP – Created the page and added the content.