Skip to main content

Domain services

Evolve's backend is split into domain services, each focused on a specific area of the commerce experience. These services integrate with SAAS backends (commerce engines, CMS platforms, search engines, payment providers) and expose a unified GraphQL API through GraphQL Federation.

Service overview

Catalog

Owns the product catalog: product search, product detail, categories, and product listing configuration. Integrates with the commerce backend for product data and optionally with a dedicated search engine (Algolia) for search and faceting.

CMS

Integrates the content management system into the platform. Owns content pages, catalog page content, site layout (header, footer, navigation), and reusable content snippets. Evolve supports both Contentful and Storyblok as CMS backends, with interchangeable implementations behind the same GraphQL schema.

Checkout

Manages the shopping cart and the checkout process. Handles line item operations (add, update, remove), discount codes, shipping and payment method selection, address validation, and order creation. Orchestrates payment flows by delegating to the appropriate payment service.

Account

Covers customer identity and account management: registration, login, password management, address book, and session handling. Also owns B2B-specific account features like business unit management, associate invitations, roles, and shopping lists. Issues and manages authentication tokens used by all other services.

Orders

Handles post-purchase order management: order history, order detail, and order status. Operates in both B2C (scoped to the customer) and B2B (scoped to the business unit) contexts.

Quotes

Manages the B2B quote workflow: creating quote requests from carts, tracking quote status, and converting accepted quotes into orders. See B2B & B2C architecture for the full quote flow.

Payment

Payment processing is split into separate services per payment provider. Each payment service handles payment creation, webhook processing, and transaction management for its provider:

ServiceProvider
payment-commercetools-stripeStripe
payment-commercetools-adyenAdyen
payment-commercetools-buckarooBuckaroo
payment-commercetools-paynlPayNL
payment-commercetools-invoiceInvoice (pay on account)

Payment services expose REST endpoints (for webhooks and payment creation) rather than GraphQL, since payment providers communicate through callbacks and redirects. See Payment architecture for the full flow and REST endpoints & webhooks for the webhook contract.

Email

Sends transactional emails (order confirmations, password resets, account invitations) using React-based email templates. Integrates with any SMTP-compatible email service. See Email & notifications for the full architecture.

GraphQL gateway

The gateway is not a domain service itself but the entry point for all clients. It composes the subgraphs from all domain services into a single supergraph using Apollo Federation. It handles query planning, request routing, and response merging.

Supporting services

Beyond the core domain services, Evolve includes supporting services for infrastructure concerns:

  • Event router: routes events between services (e.g., order created events triggering email notifications)
  • PIM integration: synchronizes product data from external PIM systems (e.g., Bluestone PIM) into the commerce backend
  • Product feed: generates product feeds for external channels (Google Shopping, marketplaces)
  • Monitoring: service health monitoring and alerting

Team organization

The domain-driven service structure maps naturally to team organization. Services group along the customer journey, allowing teams to be structured around business areas:

AreaServices
Pre-purchaseCatalog, CMS
PurchaseCheckout, Payment
AccountAccount (including B2B)
Post-purchaseOrders, Quotes

Small teams can own the entire platform. Larger organizations can assign services to dedicated squads, using tools like GitHub's CODEOWNERS to enforce ownership boundaries. Because services communicate only through GraphQL Federation, teams can work independently without blocking each other.