Skip to content

Capability & Sub-capability Reference

The canonical, code-synced inventory of every capability port, its base contract, and its composable sub-capabilities. This is the developer-facing counterpart to the integration showcase in the README; for the why of the capability-ports + sub-capabilities design see ADR-002 and the Architecture Overview.

How to read this: core depends on capability ports (business roles). The base port carries only the method every adapter of that role must implement; optional behaviour is split into sub-capabilities — independent interfaces in domain/ports/capabilities/, each with a co-located is{Capability}(adapter) type-guard. Call sites narrow with the guard before invoking, and degrade gracefully when an adapter doesn’t implement it.

Source of truth. Every name below is generated from libs/core/src/**/domain/ports/**. When you add a port or sub-capability, update this file in the same PR. If a table here disagrees with the code, the code wins — fix the doc.


PortContextRegistry capabilityWhat it doesBase method(s)
ProductMasterPortproductsProductMasterSource of truth for the product catalog — read/write products, variants, and categories.getProduct · getProducts · createProduct · updateProduct · deleteProduct · getProductVariants · upsertProductVariant · getProductCategories · assignCategories · searchProducts · listExternalIds
InventoryMasterPortinventoryInventoryMasterSource of truth for stock levels; carries the (largely dormant) reservation surface.getInventory · listInventory · adjustInventory · reserveInventory · releaseInventory · getAvailableQuantity
OrderSourcePortordersOrderSourceCursor-based, read-only ingestion of orders from any source (marketplace journal or shop watermark).listOrderFeed · getOrder
OrderProcessorManagerPortordersOrderProcessorManagerCreate orders on a destination shop.createOrder
OfferManagerPortlistingsOfferManagerManage marketplace offers/listings; base contract is the inventory-driven quantity update.updateOfferQuantity
ShopProductManagerPortlistingsProductPublisherPublish a product as a native listing on a shop (the shop-publish flow).publishProduct
ShippingProviderManagerPortshippingShippingProviderManager (open-world — see note)Generate shipping labels, read tracking, and list supported shipping methods.generateLabel · getTracking · getSupportedMethods
InvoicingPortinvoicingInvoicingIssue fiscal documents, fetch them, upsert a customer, and report supported document types.issueInvoice · getInvoice · upsertCustomer · getSupportedDocumentTypes
ContentPublisherPortcontent(internal — not registry-resolved)Publish a content field (e.g. a product description) to a channel or the master.publish

Open-world capability vocabulary (#576). The closed, well-known set is CoreCapabilityValues = ProductMaster, InventoryMaster, OrderSource, OrderProcessorManager, OfferManager, ProductPublisher, CategoryProvisioner, Invoicing. Adapters may register additional capability strings at runtime without a core change — ShippingProviderManager is the live example (declared in the InPost / DPD / Allegro manifests, resolved through the registry, but intentionally not a member of the closed set). The runtime gate validates a connection’s request against the adapter’s supportedCapabilities, not against the closed union.

Which integration implements what is each adapter’s own declaration: its supportedCapabilities manifest (libs/integrations/<p>/src/<p>-plugin.ts) is the source of truth, and the capability-level showcase across all integrations lives in the root README. This file stays the platform-neutral vocabulary — the ports and sub-capabilities themselves.


Each is an independent interface + co-located is{Capability} guard. Adapters declare what they support via implements <BasePort>, <SubCapability>, ….

Sub-capabilityWhat it doesMethod(s)Guard
OfferListerPage through the seller’s existing offers.listOffersisOfferLister
OfferReaderFetch a single offer by external id.getOfferisOfferReader
OfferEventReaderRead the marketplace’s incremental offer-event journal.listOfferEventsisOfferEventReader
OfferCreatorCreate a new offer / listing.createOfferisOfferCreator
OfferFieldUpdaterPartially update offer fields (e.g. description text).updateOfferFieldsisOfferFieldUpdater
OfferStatusReaderRead an offer’s live publication status.getOfferStatusisOfferStatusReader
OfferStockRestorerRestore offer stock after a cancellation.restoreStockOnCancellationisOfferStockRestorer
OfferQuantityBatchUpdaterBulk-update quantities for many offers in one call.updateOfferQuantitiesBatchisOfferQuantityBatchUpdater
OfferSmartClassificationReaderFetch the marketplace’s smart/auto classification for an offer.getOfferSmartClassificationisOfferSmartClassificationReader
CategoryBrowserBrowse the marketplace category tree.fetchCategoriesisCategoryBrowser
CategoryBarcodeMatcherAuto-detect a category from a product barcode.matchCategoryByBarcodeisCategoryBarcodeMatcher
CategoryParametersReaderRead the parameter schema a category requires.fetchCategoryParametersisCategoryParametersReader
EanCategoryMatcherResolve categories for a batch of products by EAN.resolveCategoriesForBatchByEanisEanCategoryMatcher
CatalogProductReaderLook up marketplace catalog products by barcode / id.findProductsByBarcode · getProductisCatalogProductReader
SellerPoliciesReaderSurface the seller’s saved return / shipping / warranty policies.fetchSellerPoliciesisSellerPoliciesReader
ResponsibleProducerReaderList GPSR responsible-producer entries.fetchResponsibleProducersisResponsibleProducerReader
SafetyAttachmentUploaderUpload a GPSR safety attachment (manual, label, …).uploadSafetyAttachmentisSafetyAttachmentUploader
TaxonomyBorrowerReuse another platform’s resolved taxonomy for a destination.getBorrowedTaxonomyisTaxonomyBorrower

Adapter coverage: Allegro implements every sub-capability except OfferQuantityBatchUpdater (see the README Implementations section); Erli implements a reconciliation-first subset (ADR-025).

Sub-capabilityWhat it doesMethod(s)Guard
CategoryProvisionerCreate / ensure a category exists on the destination shop before publishing. Also a registry-level capability (CategoryProvisionerCoreCapabilityValues).provisionCategoryisCategoryProvisioner
ShopCategoryBrowserBrowse the shop’s existing category tree (drill-down by parent) so an operator can pick a placement — the shop-side sibling of the marketplace CategoryBrowser. Every node is selectable (no leaf gate). Advertised-without-dispatch (not in CoreCapabilityValues): declared in the manifest for discovery, resolved by narrowing the ProductPublisher adapter.browseCategoriesisShopCategoryBrowser
ShopAttributeReaderRead the shop’s store-wide global product attributes + their predefined terms so an operator can pick a structured attribute (linked on publish as pa_* + term ids), with free-text custom attributes as the fallback. Advertised-without-dispatch (not in CoreCapabilityValues): declared in the manifest for discovery, resolved by narrowing the ProductPublisher adapter.listAttributes, listAttributeTermsisShopAttributeReader
ShopProductStatusReaderRead a previously-published product’s live shop-side publication status for the steady-state ShopStatusSyncService reconcile (#1845) — the shop-side sibling of OfferStatusReader. Optional getShopVariationStatus reads a grouped/multi-variant publish’s CHILD variation status scoped under its parent (a variation lives at a different shop-native resource than a standalone simple product). Advertised-without-dispatch (not in CoreCapabilityValues): declared in the manifest for discovery, resolved by narrowing the ProductPublisher adapter.getShopProductStatus, getShopVariationStatus?isShopProductStatusReader

Adapter coverage: WooCommerce implements CategoryProvisioner (write), ShopCategoryBrowser (read, #1834), ShopAttributeReader (read, #1835), and ShopProductStatusReader (read, #1845, including the grouped-variation-aware read) on its ProductPublisher adapter.

OrderProcessorManagerPort / OrderSourcePort (orders) — 5

Section titled “OrderProcessorManagerPort / OrderSourcePort (orders) — 5”
Sub-capabilityWhat it doesMethod(s)Guard
OrderFulfillmentUpdaterPush a post-create status + tracking update to a destination order.updateFulfillmentisOrderFulfillmentUpdater
OrderStatusWritebackRelay an order-status change back to the originating marketplace (event-as-data).writeisOrderStatusWriteback
FulfillmentStatusReaderRead a destination order’s current fulfillment status.getFulfillmentStatusisFulfillmentStatusReader
DestinationOptionsReaderList a destination’s carriers / order-statuses / payment-methods for mapping.listCarriers · listOrderStatuses · listPaymentMethodsisDestinationOptionsReader
SourceOptionsReaderList a source’s order-statuses / delivery-methods / payment-methods for mapping.listOrderStatuses · listDeliveryMethods · listPaymentMethodsisSourceOptionsReader

The canonical OL-owned order-lifecycle state machine (authoritative updateOrderStatus / cancelOrder / processReturn / getOrders) is deferred — see #1032.

ShippingProviderManagerPort (shipping) — 4

Section titled “ShippingProviderManagerPort (shipping) — 4”
Sub-capabilityWhat it doesMethod(s)Guard
LabelDocumentReaderFetch the label document for an already-registered shipment.fetchLabelisLabelDocumentReader
DispatchProtocolReaderGenerate a handover / dispatch protocol for a batch of shipments.generateProtocolisDispatchProtocolReader
PickupPointFinderSearch the carrier’s pickup points / lockers (e.g. Paczkomat).findPickupPointsisPickupPointFinder
ShipmentCancellerCancel / void a registered shipment.cancelShipmentisShipmentCanceller
Sub-capabilityWhat it doesMethod(s)Guard
RegulatoryStatusReaderRead the clearance status of a previously-submitted document.getClearanceStatusisRegulatoryStatusReader
RegulatoryTransmitter (extends RegulatoryStatusReader)Submit a document to the tax authority for clearance (+ read its status).submitForClearanceisRegulatoryTransmitter
RegulatoryResubmitterRe-trigger transmission of an ALREADY-ISSUED document (e.g. the operator “resend to KSeF” action on a rejected document) — flat, not extends RegulatoryStatusReader.resubmitForClearanceisRegulatoryResubmitter
RegulatoryDocumentReaderRetrieve the authority’s confirmation document (e.g. the PL UPO) or a rendered view for a cleared document.getRegulatoryDocumentisRegulatoryDocumentReader
CorrectionIssuerIssue a correcting document (e.g. KSeF KOR) against an original.issueCorrectionisCorrectionIssuer
OfflineResubmitterRetransmit a document issued with legal effect during a clearance-authority outage (degraded-mode pending-submission) once the authority recovers.resubmitisOfflineResubmitter
RegulatoryRecordLocatorLast-resort crash-recovery lookup: query the authority by business coordinates (seller id, document number, issue-date window) to learn whether an interrupted submit actually landed.locateByQueryisRegulatoryRecordLocator
BankAccountsReaderList the seller’s payable bank accounts known to the provider (live picker for Transfer invoices).listBankAccountsisBankAccountsReader
BankAccountDefaultSetter (extends BankAccountsReader)Mark an account as the provider’s own default, keeping it in sync with the account OL stamps on Transfer invoices.setDefaultBankAccountisBankAccountDefaultSetter
PaymentStatusReaderAuthoritative re-read of a document’s payment state (a provider payment webhook is only a trigger, never trusted as the system of record).getPaymentStatusisPaymentStatusReader
PaymentMarkerPush an authoritative “paid” state to the provider for an order settled elsewhere (e.g. a marketplace order the seller’s bank statement can’t auto-match).markPaidisPaymentMarker
InvoiceEmailSenderTrigger the provider to render and email the already-issued invoice to the buyer.sendByEmailisInvoiceEmailSender
DocumentNumberConsumerMarker: the adapter relies on OpenLinker to allocate the legal, sequential document number from the connection’s numbering series (OL-numbered provider, e.g. KSeF FA(3) P_2). Providers that number documents themselves (inFakt/Subiekt) do NOT implement it.consumesDocumentNumber (marker) · numberingTimeZone · maxDocumentNumberLength?isDocumentNumberConsumer

Adapter coverage: KSeF implements RegulatoryTransmitter and CorrectionIssuer; Infakt implements RegulatoryStatusReader (it relays to KSeF rather than transmitting directly), CorrectionIssuer, RegulatoryDocumentReader, and BankAccountsReader / BankAccountDefaultSetter; Subiekt nexo implements RegulatoryStatusReader, CorrectionIssuer, and BankAccountsReader / BankAccountDefaultSetter (see the README Integrations section).

See ADR-026 for the country-agnostic invoicing design.


  1. Portlibs/core/src/<ctx>/domain/ports/<name>.port.ts; export from the context barrel. If it should be registry-resolvable, decide whether it joins the closed CoreCapabilityValues set or stays an open-world string (#576).
  2. Sub-capabilitylibs/core/src/<ctx>/domain/ports/capabilities/<name>.capability.ts: the interface plus the co-located is{Capability} guard. Export both from the context barrel.
  3. Update this file in the same PR — add the row(s) above. The counts in each section heading are part of the contract; bump them.