Sales
Deal pipelines, point-of-sale configuration and orders, and storefront ecommerce helpers.
Sales provides the deal pipeline (boards → pipelines → stages → deals with labels, checklists, watchers, and per-deal product/payment data), the POS configuration and order API used by the separate posclient plugin, and a small ecommerce module (wishlists, reviews, addresses, last-viewed items) exposed over HTTP routes and GraphQL. It registers with the platform through meta/: permissions, automations, notifications, the sales:sales.deals and sales:pos.orders segment definitions, sales:deal document generation, record references (including excludeLoyaltyAmount), and the deal property type.
sales_api contains the POS configuration and order APIs. posclient_api and the posclient-front app are the separately deployed storefront; they sync through this plugin's /pos-init, /pos-sync-config, and /get-pos-token routes (src/routes.ts) and the pos.createOrUpdateOrders* tRPC procedures (src/trpc/init-trpc.ts).
For the product catalog itself, see Products; for the deployed POS storefront, see POS Client.
Enabling and ports
ENABLED_PLUGINS=sales
The entry maps to sales_api and sales_ui; dev scripts append _api/_ui to each name in ENABLED_PLUGINS.
| Project | Role | Dev port |
|---|---|---|
sales_api | Federated GraphQL subgraph + tRPC + POS/ecommerce HTTP routes; subscriptions enabled | 3305 |
sales_ui | Module Federation remote | 3005 |
The API port is set in main.ts.
The POS storefront backend (posclient_api, port 3312) and app (apps/posclient-front, dev port 7002) are separate; see Point of Sale and POS Client.
Module map
| Module | What it contains | Key collections | Guide |
|---|---|---|---|
modules/sales/ | Boards, pipelines, stages, deals, labels, checklists; segment fields, documents, references | Deals, Pipelines, Stages, Boards | Deals & Pipelines |
modules/pos/ | POS configs, orders, covers, slots, product groups; POS sync routes | Pos, PosOrders, PosCovers, PosSlots | Point of Sale |
modules/ecommerce/ | Wishlists, product reviews, addresses, last-viewed items | Wishlist, ProductReview, Address, LastViewedItem | Ecommerce |
meta/ | permissions, automations, notifications, segments, documents, references, properties, beforeResolvers, afterProcess | platform extension points | this page and module pages |
Frontend sales_ui modules mirror this: deals/ (boards, pipelines, deal detail, product/payment data), payments/, pos/ (POS settings under settings/sales/*). src/config.tsx registers sales/deals, sales/pos, and settings/sales/* navigation.
How it connects to Core
- Properties:
meta/properties.tsdeclares thedealproperty type with itssystemFields; pipelinepropertyIdsare validated against Coresales:dealfields over tRPC (fields.find). - Segments:
meta/segments.tsmerges thesalesandposmodule definitions:sales:sales.dealsandsales:pos.orderscontent types,customer.deals/company.dealsrelations backed by Core relation records, plusevaluateFields,listSegmentMembers,countSegmentMembers, andapplyMembershipproducers. See Properties, Tags & Segments. - Automations:
meta/automations.tsregisters deal triggers/actions and the POS-order event trigger; see Automations & Approvals. - Documents:
meta/documents.tsregisterssales:dealfor document templates;documents.editorAttributesanddeal.replaceContenttRPC procedures provide the editor merge fields. See Documents. - Payments:
meta.paymentscallbacks apply paid transactions tomobileAmount/mobileAmountson deals and forward POS-order payments toposclientover tRPC. Payment providers are part of the Enterprise Edition. - Import/export: one export type,
sales:pos.posItems, gated byposItemsExportManage.
Configuration
Env vars the plugin reads directly:
| Variable | Purpose |
|---|---|
GET_CP_TOKEN | Shared secret for GET /get-pos-token, which lists POS names and tokens for the client-portal flow |
ALLOW_OFFLINE_POS | When truthy, lets pos.create keep onServer unset (offline-capable POS); otherwise new POS docs are forced onServer |
DOMAIN | Base URL used to build deal/board links ({DOMAIN}/deal/board?...) |
TIMEZONE, NODE_ENV | Timezone for date handling; production flag for the subscription bundle |
POS credentials live on the POS document itself (token, adminIds, cashierIds, paymentIds).