Skip to content

ADR-003 — CommerceAdapter + ProductAdapter Split

Status: Accepted
Date: 2026-05-21

Context

E-commerce platforms serve two distinct data domains: order/customer operations (commerce) and product catalogue (PIM). Some platforms handle both (WooCommerce), others separate them (LunarPHP + Akeneo).

Decision

Two separate adapter interfaces: CommerceAdapterContract and ProductAdapterContract. Plus a third for support channels: ChannelAdapterContract.

Rationale

Akeneo is a PIM only — it has no order or customer data. Treating it as a CommerceAdapter would be wrong. Contact A uses WooCommerce (commerce) + Akeneo (product). Contact B uses LunarPHP (commerce) + Google Sheets (product). Each adapter pair is independently configurable per tenant.

Build order

CommerceAdapter: LunarPHP → WooCommerce → Medusa → Shopify → Magento → Odoo
ProductAdapter: Google Sheets → Akeneo Community → others on demand
ChannelAdapter: Chatwoot → Freshchat → Email (IMAP)

Consequences

  • Each tenant's adapters config stores three independent adapter types
  • Adapters can be mixed: a tenant can use WooCommerce + Akeneo + Freshchat without any code changes
  • Each interface has a factory that resolves the right implementation from the tenant's config