Appearance
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
adaptersconfig 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