Skip to content

CHANGELOG

What shipped, release by release.

Release notes for every tagged OpenLinker version — generated from Conventional Commits (from v0.2.0 onward). v0.1.0 is the hand-curated baseline.

v0.7.0

Released View on GitHub

0.7.0 (2026-08-18)

Features

  • analytics-trust,sync: add analytics data-trust reads (#2037) (cf0beac)
  • invoicing,orders,web: persist and surface the auto-issue block reason (#2100) (#2129) (c9231c9)
  • listings,api: repoint marketplace category reads at the taxonomy projection (#2117) (ab2c963), closes #2074
  • listings,integrations: bootstrap destination taxonomy on connect, delegate shop browse to the projection (#2145) (6956d29), closes #2084 #2085
  • listings,orders,analytics: needs-attention aggregates (#2045) (b849933)
  • listings,sync: derive the taxonomy sync frontier from the projection (#2067) (07fa171)
  • listings,sync: neutral destination-taxonomy read model (browse + search + sync) (#2062) (59fe748)
  • orders: capture order cancellation as first-class record state (#2022) (5e1443c)
  • orders: capture return/refund/withdrawal as a first-class record (#2046) (e4fe656)
  • shared,plugin-sdk: Redis-backed cross-process rate limiter (#2019) (d5e8104)
  • web/listings,mappings: whole-tree category search in the pickers (#2133) (bc59f43)
  • web/listings: redesign /listings with lifecycle tabs and channel-side commercial data (#2032) (805e29c)
  • web: unify the Order identity and Connection cells across the remaining five lists (#2086) (#2150) (14bfc6e)

Bug Fixes

  • core/orders: stop the order upsert resetting fulfillmentState to NULL (#2107) (b3e1506)
  • core/orders: stop the order upsert wiping syncStatus and syncAttempts (#2141) (5bbb63e)
  • dx: resolve the WooCommerce dev-stack container through Compose (#2112) (3df1b54)
  • infakt: stamp the invoice currency instead of booking in the account default (#2108) (a65981b)
  • invoicing,web: lock an order to one invoicing connection (#2047) (#2060) (0788a5f)
  • invoicing: let operators pick the correction line instead of typing it (#2132) (c481678)
  • listings,allegro: taxonomy identity is declared, not inferred from platformType (#2065) (8c64e32)
  • listings: write the status snapshot a create already knows, and make its reconcile reachable (#2039) (#2044) (bded91b)
  • prestashop: refuse an unresolvable order currency instead of defaulting to id 1 (#2142) (4b1bd67)
  • prestashop: tell an unknown tax rate apart from a resolved zero (#2057) (351c78d)
  • prestashop: use the real order_details id as the line id (#2134) (7401126)
  • web: persist explicit config.rateLimit: null on revert-to-default (#2016) (#2017) (3a35ff8)
  • woocommerce: map placedAt from date_created_gmt on order source (#2114) (bd642a0)

v0.6.0

Released View on GitHub

0.6.0 (2026-08-10)

Features

  • allegro,shared: Allegro adopts the connection-bound rate-limit transport (#1977) (ee4ba43)
  • dpd-polska,shared: DPD Polska adopts the connection-bound rate-limit transport (#2005) (2204ad1)
  • erli,shared: Erli adopts the connection-bound rate-limit transport (#1978) (fc15324)
  • infakt,shared: Infakt adopts the connection-bound rate-limit transport (#1997) (570d396)
  • inpost,shared: InPost adopts the connection-bound rate-limit transport (#1981) (1e143a1)
  • ksef,shared: KSeF adopts the connection-bound rate-limit transport (#2004) (b62c351)
  • orders,shipping,invoicing: orderSummary projection for shipments/invoices lists (#2012) (a90645d)
  • prestashop,api,web: rate-limit observability for PrestaShop connections (#1941) (93d04f8)
  • subiekt,shared: Subiekt nexo adopts the connection-bound rate-limit transport (#2006) (7bfb46e)
  • web: add shared AccessGate primitive and gate the MCP capabilities hint (#1994) (1d24560)
  • woocommerce,shared: WooCommerce adopts the connection-bound rate-limit transport (#1980) (73546c0)

Bug Fixes

  • api/auth: clear stale host-only ol_refresh/ol_csrf duplicates on set/clear (#2000) (18fc501)
  • worker,core: heartbeat running sync jobs to survive the stuck-job reclaim sweep (#1957) (7a4d393)

v0.5.0

Released View on GitHub

0.5.0 (2026-08-03)

Features

  • api,web/demo: require session-recording consent to use the demo (#1938) (#1945) (d081195)
  • core,api,web/shipments: persist providerCode on Shipment, re-key failure triage grouping (#1918) (#1925) (f654b22)
  • demo: disclose marketing-UTM tracking on /login and /register (#1895) (7af84a5)
  • demo: PostHog analytics framework, settings panel, and full viewer-event instrumentation (#1817) (a524242)
  • e2e: apps/e2e Playwright framework + golden paths S1-S4 (unattended) and S0-S9 (attended, all 6 systems) (#1480) (525dfb1)
  • listings: category per family and per variant in bulk offer creation (#1930) (f228325)
  • mcp: mapping assistant tools + per-tool scope and role enforcement (#1488) (#1967) (5a181a3)
  • mcp: read-only domain tools with capability-gated dynamic tools/list (#1931) (8907082)
  • mcp: Resource-Server auth via user-issued Personal Access Tokens (#1486) (#1912) (46fea4a)
  • shipments: inline retry from a failed row + carrier-message role visibility (#1905) (b70b071)
  • web/connections: surface the MCP reconnect hint where capabilities change (#1951) (0b8c130), closes #1949

Bug Fixes

  • ci: add workflow_dispatch to CD and PAT for release-please tag push (#1894) (f6da62b)
  • core,inventory: handle full master deletion in inventory sync (#1903) (83c7ca6)
  • core,worker: guard master staleness prunes against rival master connections (#1914) (e8b4c58)
  • core/webhooks: resolve webhook_deliveries.status by lifecycle rank on upsert (#1919) (bb86874), closes #1916
  • infakt: issue corrections via the documented async endpoint (#1899) (8498c45)
  • infakt: read the real v3 list envelope and resolve clients by an actual NIP filter (#1927) (21a7722)
  • infra: align demo Dockerfiles/compose with SysOps container standards (#1915) (3a990f8)
  • listings: close ten bulk-wizard preflight-vs-backend divergences (#1939) (2bd07c9)
  • listings: distinguish all-duplicate/partial-duplicate bulk submit outcomes (#1935) (c950f8c)
  • listings: stop rejecting adapter-supplied params, and mirror the category gate in the wizard (#1963) (02172f7)
  • prestashop: hydrate the buyer e-mail on ingested orders (#1928) (#1929) (b2cf6c5)
  • shipping,allegro: relay a late-arriving waybill to the order source (#1964) (deffd65)
  • shipping: serialise per-order dispatch and recover a lost carrier response (#1921) (28ecb94)
  • web/connections: let a disabled connection be re-enabled from the UI (#1944) (97da368)
  • web/listings: serialize a variant's parameters with its own category schema (#1950) (c3a6a6b)

Performance Improvements

  • test-kit,api: cut integration-suite time - per-test truncation, shutdown sleep, cold jest cache, shared PrestaShop container (#1920) (#1923) (8401f3f)

v0.4.0

Released View on GitHub

0.4.0 (2026-07-27)

Features

  • api/auth: theme-aware transactional email layout derived from app design tokens (#1750) (135605c), closes #1748
  • auth: allow login with username or email (#1730) (d20e998)
  • auth: capture analytics consent at registration, drop post-login prompt (#1744) (42a161b)
  • auth: self-service analytics consent toggle on /settings (#1884) (49a5ae9)
  • dpd: add ConnectionTester so 'Test connection' runs a real auth probe (#1732) (#1733) (b2342e8)
  • erli: fulfillment routing for Erli sources + routing-split bar (#1740) (6224d18), closes #1738 #1739
  • erli: implement OfferReader so listing details render for Erli (#1735) (#1736) (2eee690)
  • infakt: webhook config modal - set signing secret + status (#1770) (#1773) (aebc7cb)
  • listings: per-variant bulk offer config (#1741) (#1757) (c2fc423)
  • listings: reconcile stale terminal offer status against live Allegro publication (#1760) (#1762) (35cfbee)
  • listings: unify offer creation via multi-select picker + bulk wizard (#1754) (#1774) (5fa88bb)
  • listings: unify publish flow + WooCommerce field completeness (epic #1838) (#1870) (65cb8a5)
  • orders: mapping-aware delivery + non-Allegro ship-by (epic #1776) (#1782) (a277764)
  • products: polish product detail page — full-width variant table, rich listing drawer, mobile layout (#1753) (5dde2d4)
  • products: product-detail round-2 — rich variant drawer, single/multi states, master currency & attributes (#1756) (8764423)
  • web/data-table: frozen columns, pinned bulk-action bar, viewport-pinned accordion drawer (#1758) (6e825bc)
  • web/mappings: connection-pair strip, resolved labels, responsive layout (#1784) (#1809) (a318ffd)

Bug Fixes

  • api/auth: add OL_COOKIE_DOMAIN for split-subdomain deploys (#1725) (#1726) (1dcf363)
  • api/integration-tests: disable four core scheduler tasks in the harness (#1889) (7281a10), closes #1888
  • content: allow viewer role read-only access to content tab (#1880) (3c558eb)
  • dpd: carrier population, rejection diagnosability, sender-postcode hint (#1775, #1777, #1778) (#1781) (95bca6d)
  • erli: reconcile frozen-field protection to the verified frozen{} object shape (#1759) (f3a4dd2)
  • inpost: flatten nested ShipX field-errors so target_point rejections classify correctly (#1816) (bafe267)
  • invoicing: thread buyer e-mail to Infakt so send-by-email stops 422ing (#1811) (e824f68)
  • mailer: validate fromAddress shape and reject CRLF header injection (#1771) (dfa897f), closes #1765
  • web/connections: generalize escape-hatch banner copy on advanced setup page (#1746) (8792da9), closes #1745
  • web/connections: WooCommerce setup wizard with capability selection (#1727) (#1731) (4dd3848)
  • web/demo: mask passwords only in PostHog session recordings (#1877) (#1878) (7e23bfa)
  • web/mailer-settings: accept display-name form in From address field (#1761) (7469e3c)
  • web/orders: match products table header alignment and density (#1751) (9a23b17), closes #1747
  • web/orders: surface ShipX per-field validation details in the label-error Alert (#1812) (328a17d)
  • worker: cap master.product.syncAll default page size at 100 (#1723) (#1724) (62ed30b)

v0.3.0

Released View on GitHub

0.3.0 (2026-07-17)

Features

  • ksef: session-lifecycle failure resilience - offline24, crash recovery, query fallback (#1585) (#1711) (eb4305f)
  • orders: responsive orders-table redesign + deep links, invoicing status & empty-state actions (#1715) (86a7d91)
  • products: remove inventory list page, redesign products as catalog cockpit (#1722) (5db487a)
  • web/shipping: scope COD currency to the routed carrier (#1569) (#1716) (c2e2315)

Bug Fixes

  • allegro: allow operator/viewer to read responsible producers (#1707) (#1708) (96b82c0)
  • ci: use SSH_HOSTNAME for ssh-keyscan in deploy workflow (#1717) (cbbb0a3)
  • inpost: authenticate both documented webhook HMAC variants (#1556) (#1721) (dc52cd5)
  • ksef: gate numbering demo mode via useWriteAccess, keep nav open (#1705) (#1712) (6681d7d)
  • listings: auto-retry bulk-wizard resolve step on transient failure (#1710) (7fdf11d), closes #1709
  • listings: gate Erli/bulk offer-creation submits on listings:write (#1704) (#1706) (deef6d7)

v0.2.0

Released View on GitHub

Features

  • analytics: add admin-configurable PostHog settings to /settings (#1687) (dca7eb7)
  • api,web: email-confirmation activation for demo signup (9ba89ef)
  • api: add mailer infrastructure (port + SMTP adapter) (9ba89ef)
  • api: DB-backed mailer/SMTP settings (entity, encrypted credentials, admin controller) (9ba89ef)
  • auth: grant viewer role read-only access to invoicing, customers, and shipments (#1363) (d8d2d2f)
  • auth: rate-limit demo self-registration + scheduled cleanup of demo accounts (#1471) (cb9d96f), closes #1469
  • connections: Erli setup wizard environment select (Production/Sandbox) (#1437) (2dd3f51)
  • demo: add proxy/TLS overlay, parametrize DB credentials, add public-domain deployment guide (#1406) (76d356a)
  • demo: demo-only PostHog session recording via server-gated config seam (#1412) (035bbed)
  • demo: lock AI controls and admin navigation in demo mode (#1379) (#1398) (dd25418)
  • demo: one-command Docker demo environment (API/Web/Worker + PrestaShop) (#1365) (0792f07)
  • erli: category/parameter browsing from Allegro's catalog without a required Allegro connection (#1407) (87bc11a)
  • erli: operator-selectable delivery price list on offer create (#1530) (#1532) (4120c33)
  • infakt: bank-account picker with live inFakt default sync (#1303 follow-up) (#1310) (b279e17)
  • infakt: consume invoice_marked_as_paid webhook + payment-status sync (#1354) (#1361) (861680f)
  • infakt: resend rejected invoice to KSeF from the UI (#1356) (#1360) (8531a56)
  • infakt: send invoice to buyer by email one-click (#1353) (#1358) (24feddc)
  • inpost: close shipping adapter feature gaps (#1540) (#1545) (ef94b44)
  • inpost: model locker (paczkomat) COD in the ShipX adapter (#1693) (ac95491)
  • integrations: validate masterCatalogConnectionId shape on WooCommerce + Erli config (#1505) (c814eae)
  • invoicing: add outbound PaymentMarker capability for inFakt (#1362) (#1475) (cff0c94)
  • invoicing: bulk-issue invoices from the list (#1355) (#1359) (c09ae86)
  • invoicing: inFakt epic - invoice shipping line + label wiring + webhook integration test (#1567) (0452561)
  • invoicing: invoice numbering series module (#1527) (#1684) (35f770c)
  • invoicing: invoice-numbering follow-ups - routing axes, daily/fiscal-year, oświadczenie (#1686) (#1697) (1f51e93)
  • ksef: emit P_6 / P_8A / P_9A in FA(3) documents (#1529) (139bab9)
  • ksef: implement Test connection via the real auth handshake (#1448) (8575253), closes #1447
  • listings,allegro,erli: default marketplace-required condition on offer creation (#1507) (c4bc789)
  • listings,erli,web: operator-selectable responsible producer on offer create (#1531) (#1533) (007a855)
  • listings: expose filled parameter values and productSet linkage in MarketplaceOffer (#1483) (3848e24), closes #1482
  • listings: let a demo viewer reach step 4 (Confirm) of the bulk-create offer wizard (9ba89ef)
  • listings: redesign publish-to-shop dialog and make batch stock/price per-product (#1422) (1901508), closes #1414
  • prestashop: implement getProductCategories on ProductMaster adapter (#1506) (0b1ef42)
  • shipping: distinguish InPost paczkomat (APM) from PaczkoPunkt (POP) via point type (#1434) (db18cbd)
  • shipping: redesign the order-detail shipment panel across all states (#1429) (c81cf5f)
  • shipping: source COD amount from Allegro and gate cash-on-delivery on payment status (#1436) (5ed108a)
  • shipping: surface carrier-rejection details in the log and 502 body (#1431) (2434b7c)
  • users: enforce case-insensitive unique email on registration (9ba89ef)
  • web,api: connection Config tab visible to demo viewers, read-only (9ba89ef)
  • web,api: dashboard Infrastructure panel lists every infra-bearing connection (9ba89ef)
  • web,api: design pass on confirm-email page + HTML confirmation email template (9ba89ef)
  • web,api: show a clear permission error when a demo viewer issues an invoice (9ba89ef)
  • web,erli: add dedicated Callback URL field to Erli's edit-connection form (#1459) (49ba486), closes #1458
  • web/ksef: rebuild FA(3) preview to mirror the official KSeF visualization (#1528) (4f30355)
  • web: connection Actions tab visible to demo viewers, write submit disabled (9ba89ef)
  • web: mailer/SMTP settings tile + edit modal on /settings (9ba89ef)
  • web: orders items preview + fix page-section overflow at narrow widths (9ba89ef)
  • web: polish order invoice-generation panel layout (9ba89ef)
  • web: redesign order-detail Invoice panel to match Shipment panel (#1484) (b27be04), closes #1449
  • web: redesign product detail page with gallery, KPIs and inline listings (#1537) (54b9277)
  • web: responsive orders table with expandable rows and mobile cards (9ba89ef)
  • web: surface the selected carrier in orders list and detail (9ba89ef)
  • web: unify Invoice Detail Page with OrderInvoicePanel redesign (#1514) (921c088), closes #1462
  • woocommerce: add inbound webhook decoder (InboundWebhookDecoderPort, ADR-021) (#1696) (bf1d1cd)
  • woocommerce: propagate inventory to published products (OfferManager stock write-back) (#1508) (3a896fd)

Bug Fixes

  • allegro,web: advertise OfferManager sub-capabilities so bulk wizard shows Allegro category params (#1370) (668717a), closes #1367
  • allegro: detect order cancellation in getOrder (status + fulfillment.status) (#1461) (2d8be18), closes #1460
  • api: allow demo viewer to read connection diagnostics (9ba89ef)
  • api: let demo viewer read mapping options and configuration (9ba89ef)
  • api: raise default demo registration rate limit from 5 to 100 per hour (9ba89ef)
  • auth: scope refresh cookie to versioned /v1/auth path (#1340) (5dad02c), closes #1327
  • ci: resolve migration timestamp collision and flaky connection-form test (#1699) (0121d19), closes #1698
  • core: propagate master-side product/variant deletion (#1599) (#1676) (c2d9111)
  • demo: boot WooCommerce with pnpm demo:up and fix its permanently-unhealthy healthcheck (#1397) (08dc88a), closes #1395
  • demo: harden docker-compose port binding and add multi-instance parametrization (#1402) (8b58024), closes #1400
  • demo: route WooCommerce through the proxy overlay with a scoped X-Forwarded-Proto trust fix (#1421) (78c2d7d)
  • demo: set PRESTASHOP_BASE_URL for the dashboard health check (#1420) (2c7d8b5)
  • demo: use curl instead of PHP file_get_contents for PrestaShop healthcheck (#1393) (a964d8b), closes #1392
  • docker: wire OL_DEMO_MODE + OL_REGISTRATION_ENABLED into the demo compose overlay (#1504) (f87afc8)
  • erli,web: reject inactive Allegro credential-reuse source, gate query on rotate panel (#1466) (0664d1e), closes #1465
  • erli: map buyer-selected pickup point onto neutral IncomingOrder (#1519) (#1678) (a6e200a)
  • erli: sandbox auth, missing bulk category picker, and rejected dictionary attributes (#1443) (a2c9442), closes #1440
  • erli: stop the inbox poll starving on productsNeedSync events (#1453) (c148ab5), closes #1452
  • infakt: issue corrections via the dedicated corrective_invoices endpoint (#1342) (b8984ed)
  • infakt: parse inFakt v3 list envelope as items/pagination, not entities/metainfo (#1374) (0c9ef39)
  • infra: pass WEB_URL through to the api container in demo compose (9ba89ef)
  • inventory: prune stale inventory_items for variants deleted at the master (#1495) (6d2ceaf), closes #1478
  • invoicing: convert invoice_records timezone-naive timestamps to timestamptz (#1389) (25b4a00)
  • invoicing: stamp a distinct KSeF document number per correction (#1451) (462085f)
  • ksef: normalize and validate FA(3) KodKraju + map status 450 to rejected (#1344) (2f49fb7), closes #1343
  • ksef: persist FA(3) P_2 document number on the issued InvoiceRecord (#1341) (46502f6)
  • listings,woocommerce: publish carries the variant SKU (#1485) (#1494) (f1adf81)
  • listings: allow shop-publish master-catalog config and tolerate missing category read (#1418) (e776573), closes #1413
  • listings: make bulk-wizard category resolve mapping-aware (#1522) (#1523) (454a7c6)
  • mappings: grant operator write access to mapping configuration (#1691) (512af83)
  • prestashop-seed: activate the PL country in the dev/demo shop (#1467) (35b23ee), closes #1446
  • shipping: add locker-size field to the generate-label form (#1424) (38a01e2), closes #1423
  • shipping: backfill the InPost tracking number from getTracking (#1430) (23742ca), closes #1426
  • shipping: reject generate-label requests that omit parcel/recipient (#1518) (#1679) (3509437)
  • shipping: use parcel_locker sending method for InPost paczkomat shipments (#1432) (67b43c2), closes #1427
  • subiekt: rebase #1324 onto main; address PR review findings (#1335) (c89afbf)
  • sync: gate platformType-scoped order-poll scheduler tasks by capability (#1455) (e9ee757), closes #1454
  • web: add spacing under section titles (9ba89ef)
  • web: add variant picker to WooCommerce publish-to-shop wizard (#1391) (6102b24), closes #1390
  • web: correct InPost webhook runbook URL, self-service copy, and HMAC secret step (#1477) (73add2f), closes #1473
  • web: dialog overflow/blur, toast z-index, and master stock/price prefill in WooCommerce publish wizard (#1442) (3981c55), closes #1439
  • web: fix bulk-dispatch dialog gap caused by order-id text-wrap explosion (9ba89ef)
  • web: fix orders filter bar overflow on mobile widths (9ba89ef)
  • web: gate trigger-sync jobs by capability, add invoicing reconcile trigger (#1476) (d2deab6), closes #1474
  • web: hide demo-mode banner from admin/operator sessions (#1470) (cac8c5e), closes #1468
  • webhooks: resolve downstream-job link to the concrete SyncJob (#1366 (#1378) (cfd0c15)
  • web: keep demo-mode banner sticky while scrolling (9ba89ef)
  • web: restore contrast and fix layout overflow in marketplace picker modal (#1463) (51faa47), closes #1438
  • web: show AI-suggest/generate-description to demo viewer, block invoke (9ba89ef)
  • web: show Create offer / Publish to shop to demo viewer, block only final submit (9ba89ef)
  • web: show New connection / Retry to demo viewer, block only writes (9ba89ef)
  • web: stop EditConnectionForm's Save changes from clobbering a sibling panel's just-saved config field (#1445) (cc004ed), closes #1441
  • web: stop mobile order cards overlapping badges with the id/copy button (9ba89ef)

Full Changelog: v0.1.0...v0.2.0

v0.1.0

Released View on GitHub

0.1.0

First tracked release — the baseline snapshot of OpenLinker as a self-hosted,
API-first, pluggable e-commerce orchestration platform: sync products, inventory,
listings, and orders between your own shop and the marketplaces you sell on.

Platform & architecture

  • Hexagonal core (ports & adapters) organised into bounded contexts —
    products, inventory, orders, customers, listings/offers, invoicing, content,
    AI, sync, shipping — with a strict CORE ↔ integration boundary.
  • Capability ports so a new platform is new implementations, not core
    changes
    : ProductMasterPort, InventoryMasterPort, OrderSourcePort,
    OrderProcessorManagerPort, OfferManagerPort, InvoicingPort,
    ShippingProviderManagerPort, each with composable sub-capabilities.
  • Plugin SDK (@openlinker/plugin-sdk) — framework-neutral adapter-plugin
    contract, per-connection adapter resolution, and self-registering capability /
    connection-test / webhook-provisioning / validator registries.
  • Identifier mapping from a single unified seed (ol_product_*, ol_order_*,
    ol_variant_*, …) so core logic works in internal IDs regardless of source.
  • Multi-connection per platform type (e.g. two PrestaShop stores from one
    instance), encrypted credentials store, and PII-aware storage (full or
    hash-only).

HTTP API

  • Versioned REST API under /v1 (URI versioning) with a runtime version
    surface at GET /v1/health reporting the product + API version.
  • JWT auth with refresh-token rotation, role-based authorization
    (admin / operator / viewer), and self-service registration + admin approval.
  • Inbound webhook ingestion with HMAC verification, replay protection, and
    Postgres-authoritative dedup.

Core workflows

  • Order sync — cursor-based ingestion from marketplaces and shops, unified
    order model, destination order creation with auto-provisioned guest customers,
    status lifecycle, cancellations/returns, and order-status writeback (ADR-027).
  • Inventory sync — variant-keyed master stock propagated to marketplace
    offers, including per-combination stock for multi-variant products.
  • Listings / offers — offer creation, quantity + field updates, category &
    attribute projection across platforms, seller-policy discovery, offer-status
    snapshots, and a bulk offer-creation flow.
  • Invoicing — country-agnostic InvoicingPort (issue / clear / correct
    fiscal documents), with a browser-based invoice detail + correction surface.
  • Content + AI — per-channel product content with draft write-through and
    provider-agnostic AI description suggestions (Anthropic, OpenAI) plus editable,
    versioned prompt templates.
  • Shipping / dispatch — neutral delivery intent, label generation, pickup
    points, tracking, and shipment-status sync.
  • Customer identity resolution — multi-origin identity with optional
    email-fallback and address reuse.
  • Sync-job orchestration — scheduled + webhook-triggered jobs with retry
    classification and a status-vs-outcome split.

Integrations

Shops:

  • PrestaShop (prestashop.webservice.v1) — full shop surface (catalog +
    inventory reads, order ingestion via date_upd, order creation, lifecycle,
    cancellations, returns); ships the OL Dynamic Carrier module so marketplace
    buyer-paid shipping round-trips correctly.
  • WooCommerce (woocommerce.restapi.v3) — source + destination + inventory.

Marketplaces:

  • Allegro (allegro.publicapi.v1) — order ingestion via the event journal,
    the full OfferManager sub-capability set, OAuth with refresh-on-401, and
    masked-buyer-email normalization.
  • Erli (erli.shopapi.v1) — offers + order source, reconciliation-first
    posture, borrowing Allegro-id taxonomy.

Invoicing:

  • Subiekt nexo (subiekt.invoicing.v1) — first InvoicingPort adapter, via
    the Sfera bridge.
  • KSeF (ksef.publicapi.v2) — Polish national e-invoicing (FA(3) issue +
    clear + KOR corrections through the async submit → poll → UPO model).
  • inFakt (infakt.accounting.v1) — accounting/invoicing with KSeF
    indirection and read-back of clearance status.

Shipping:

  • InPost (inpost.shipx.v1) — ShipX (paczkomat + courier), labels, webhooks.
  • DPD Polska (dpd.polska.rest.v1) — REST labels + protocols, SOAP tracking.

Content:

  • AI router (Anthropic, OpenAI) — content-suggestion completions behind a
    provider-agnostic AiCompletionPort.

Frontend

  • Browser-first admin SPA (React + TypeScript + Vite + TanStack Query) — an
    operator cockpit for connections, orders, products, inventory, listings,
    invoices, jobs & logs, webhooks, and cursors, with a build-time plugin registry
    for per-platform UI.

Ops & docs

  • Real integration tests against Postgres/Redis (and a real PrestaShop install)
    via Testcontainers; TypeORM migrations as the schema source of truth.
  • Architecture Decision Records, per-context engineering standards, and
    per-integration setup guides.