generated: '2026-08-26' method: derived source: openapi/northmill-flo-api-swagger.json ($ref graph over 173 definitions; live document at https://api.moreflo.com/swagger/docs/v2) description: 'The entity-relationship graph of the Northmill Flo commerce API, derived from the $ref links between the 173 definitions in the Swagger document. The model has three clusters: a CATALOG cluster (Article, ArticleSet, Brand, Group, Supplier, Campaign, Location, availability), a TRANSACTION cluster (Order/OrderV3, BookingOrder, TicketOrder, ServiceOrder, Receipt, Voucher, Payment) and a CONFIGURATION cluster (Store, Settings, AccountingSettings, the OnlineSolutions subscriber settings and WebHook subscriptions). Store is the tenancy root: every collection is addressable as /v2/stores/{externalStoreId}/.' entity_count: 108 definition_count: 173 tenancy_root: entity: Store key: externalStoreId note: A merchant-supplied external store identifier, used as both a path segment and a query parameter on every collection. identifiers: - entity: Article key: ArticleNumber note: client-assigned natural key; also the upsert key for UpdateOnExisting - entity: Order key: ExternalReference note: required on create; the upsert and lookup key (/byExternalReference/{externalReference}) - entity: BookingOrder key: ExternalReference - entity: TicketOrder key: ExternalReference - entity: Customer key: CustomerNumber note: /v2/customers/nextcustomernumber allocates the next one - entity: Receipt key: ReceiptNumber note: plus a system Id (GUID) - entity: Store key: externalStoreId - entity: WebHook key: Id note: system-generated; WebHookCategoryId groups subscriptions clusters: catalog: - Article - ArticleBarcode - ArticleSet - ArticleSetPart - ArticleBookingSettings - ArticlesAvailability - Brand - Group - Supplier - Campaign - CampaignPart - Location - ProductFile transactions: - Order - OrderRow - BookingOrder - BookingOrderRow - TicketOrder - TicketOrderRow - Ticket - ServiceOrder - ServiceOrderArticle - Receipt - Payment - BankCardTransaction - AppsTransaction - Vat - Voucher - VoucherRow - ControlUnit parties: - Customer - CustomerContact - CustomerAddress - Address - BillingAddress - ShippingAddress - Merchant - Recipient - CashierUser configuration: - Store - Settings - AccountCode - VatAccountSetting - IncomeAccountSetting - OtherAccountSetting - SubscriberWebshopSetting - SubscriberCateringSetting - SubscriberSelfscanSetting - SubscriberOnlineExpressOrderSetting - SubscriberBookingSetting - WebHook - WebHookCategory relationships: - from: ArticleCreate type: has_many to: ArticleBarcode via: BarcodeAlternatives - from: ArticleCreate type: has_one to: ArticleBookingSettings via: ArticleBookingSettings - from: Article type: has_many to: ArticleBarcode via: BarcodeAlternatives - from: Article type: has_one to: ArticleBookingSettings via: ArticleBookingSettings - from: ArticleGet type: has_many to: ProductFile via: Files - from: ArticleGet type: has_many to: ArticleBarcode via: BarcodeAlternatives - from: ArticleGet type: has_one to: ArticleBookingSettings via: ArticleBookingSettings - from: ArticlesAvailability type: has_one to: ArticlesAvailabilityTime via: AvailabilityTime - from: ArticlesAvailability type: has_many to: AvailableArticlesItem via: AvailableArticles - from: ArticlesAvailabilityTime type: has_many to: MonthAvailability via: MonthAvailabilities - from: ArticlesAvailabilityTime type: has_many to: DayOfWeekTimeAvailability via: DayOfWeekAvailabilities - from: ArticlesAvailabilityTime type: has_many to: DateAvailability via: SpecificDatesAvailabilities - from: MonthAvailability type: has_many to: MonthDayRange via: AvailabilityDays - from: DayOfWeekTimeAvailability type: has_many to: DayTimePeriod via: AvailabilityTimes - from: DateAvailability type: has_many to: DayTimePeriod via: AvailabilityTimes - from: DayTimePeriod type: has_one to: TimeOfDay via: StartTime - from: DayTimePeriod type: has_one to: TimeOfDay via: EndTime - from: ArticleSetCreate type: has_many to: ArticleSetPart via: articleSetParts - from: ArticleSet type: has_many to: ArticleSetPart via: articleSetParts - from: BookableResource type: has_many to: BookableResourceExcludedArticle via: BookableResourceExcludedArticles - from: BookableResource type: has_many to: BookableResourceIncludeOnlyArticle via: BookableResourceIncludeOnlyArticles - from: BookableResource type: has_many to: AttachedFile via: Files - from: BookingOrderCreate type: has_one to: Customer via: Customer - from: BookingOrderCreate type: has_many to: BookingOrderRow via: Rows - from: BookingOrderCreate type: has_one to: BillingAddress via: BillingAddress - from: BookingOrderCreate type: has_one to: ShippingAddress via: ShippingAddress - from: BookingOrder type: has_one to: Customer via: Customer - from: BookingOrder type: has_many to: BookingOrderRow via: Rows - from: BookingOrder type: has_one to: BillingAddress via: BillingAddress - from: BookingOrder type: has_one to: ShippingAddress via: ShippingAddress - from: Order type: has_one to: Customer via: Customer - from: Order type: has_one to: Address via: BillingAddress - from: Order type: has_one to: Address via: ShippingAddress - from: Order type: has_many to: OrderRow via: Rows - from: CampaignCreate type: has_many to: CampaignPart via: parts - from: Campaign type: has_many to: CampaignPart via: parts - from: CustomerCreate type: has_many to: CustomerContact via: Contacts - from: CustomerCreate type: has_many to: CustomerAddress via: Addresses - from: CustomerUpdate type: has_many to: CustomerContact via: Contacts - from: CustomerUpdate type: has_many to: CustomerAddress via: Addresses - from: SubscriberCateringSetting type: has_many to: AttachedFile via: SiteLogotypes - from: SubscriberCateringSetting type: has_many to: AttachedFile via: SiteFavicons - from: SubscriberCateringSetting type: has_many to: SubscriberOnlineCateringCheckoutFieldEntry via: CheckoutFields - from: SubscriberCateringSetting type: has_many to: SubscriberOnlineRoomEntry via: Rooms - from: SubscriberCateringSetting type: has_many to: SubscriberOnlineFeaturedGroupResult via: FeaturedGroups - from: SubscriberCateringSetting type: has_many to: SubscriberOnlinePaymentMethodEntry via: PaymentMethods - from: SubscriberOnlineFeaturedGroupEntry type: has_many to: AttachedFile via: GroupImages - from: SubscriberOnlineExpressOrderSetting type: has_many to: AttachedFile via: SiteLogotypes - from: SubscriberOnlineExpressOrderSetting type: has_many to: AttachedFile via: SiteFavicons - from: SubscriberOnlineExpressOrderSetting type: has_many to: SubscriberOnlineFeaturedGroupResult via: FeaturedGroups - from: SubscriberOnlineExpressOrderSetting type: has_many to: SubscriberOnlinePaymentMethodEntry via: PaymentMethods - from: SubscriberOnlineExpressOrderSetting type: has_many to: SubscriberOnlineTableEntry via: Tables - from: SubscriberSelfscanSetting type: has_many to: AttachedFile via: SiteLogotypes - from: SubscriberSelfscanSetting type: has_many to: AttachedFile via: SiteFavicons - from: SubscriberSelfscanSetting type: has_many to: SubscriberOnlinePaymentMethodEntry via: PaymentMethods - from: SubscriberWebshopSetting type: has_many to: AttachedFile via: SiteLogotypes - from: SubscriberWebshopSetting type: has_many to: AttachedFile via: SiteFavicons - from: SubscriberWebshopSetting type: has_many to: AttachedFile via: ContentHomePageHeaderImage - from: SubscriberWebshopSetting type: has_many to: SubscriberOnlineFeaturedGroupResult via: FeaturedGroups - from: SubscriberWebshopSetting type: has_many to: AttachedFile via: ContentHomePageImage - from: SubscriberWebshopSetting type: has_many to: SubscriberOnlinePaymentMethodEntry via: PaymentMethods - from: OrderCreate type: has_one to: Customer via: Customer - from: OrderCreate type: has_one to: Address via: BillingAddress - from: OrderCreate type: has_one to: Address via: ShippingAddress - from: OrderCreate type: has_many to: OrderRow via: Rows - from: OrderCreate type: has_many to: AttachedFile via: AttachedFiles - from: Order type: has_many to: AttachedFile via: AttachedFiles - from: ReceiptGet type: has_one to: Merchant via: Merchant - from: ReceiptGet type: has_one to: Rounding via: Rounding - from: ReceiptGet type: has_one to: ControlUnit via: ControlUnit - from: ReceiptGet type: has_many to: Customer via: Customers - from: ReceiptGet type: has_many to: Article via: Articles - from: ReceiptGet type: has_many to: Payment via: Payments - from: ReceiptGet type: has_many to: Vat via: Vat - from: ReceiptGet type: has_many to: OrderReference via: Orders - from: ReceiptGet type: has_many to: ReceiptDiscount via: Discounts - from: ReceiptGet type: has_many to: Recipient via: Recipients - from: ReceiptGet type: has_many to: ReceiptTextRow via: TextRows - from: ReceiptGet type: has_one to: ClientDetails via: ClientDetails - from: ReceiptGet type: has_one to: Voucher via: Voucher - from: Article type: has_many to: ArticleDiscount via: Discounts - from: Article type: has_many to: ReceiptArticleAttribute via: Attributes - from: Article type: has_many to: ArticleTextRow via: TextRows - from: Payment type: has_one to: AppsTransaction via: AppsTransaction - from: Payment type: has_one to: BankCardTransaction via: BankCardTransaction - from: Voucher type: has_many to: VoucherRow via: Rows - from: Receipt type: has_one to: Merchant via: Merchant - from: Receipt type: has_one to: Rounding via: Rounding - from: Receipt type: has_one to: ControlUnit via: ControlUnit - from: Receipt type: has_many to: Customer via: Customers - from: Receipt type: has_many to: Article via: Articles - from: Receipt type: has_many to: Payment via: Payments - from: Receipt type: has_many to: Vat via: Vat - from: Receipt type: has_many to: OrderReference via: Orders - from: Receipt type: has_many to: ReceiptDiscount via: Discounts - from: Receipt type: has_many to: Recipient via: Recipients - from: Receipt type: has_many to: ReceiptTextRow via: TextRows - from: Receipt type: has_one to: ClientDetails via: ClientDetails - from: Receipt type: has_one to: Voucher via: Voucher - from: ServiceOrderCreate type: has_one to: ServiceOrderCustomer via: Customer - from: ServiceOrderCreate type: has_many to: ServiceOrderArticle via: Articles - from: ServiceOrder type: has_one to: ServiceOrderCustomer via: Customer - from: ServiceOrder type: has_many to: ServiceOrderArticle via: Articles - from: SubscriberBookingSetting type: has_many to: AttachedFile via: Gallery - from: SubscriberBookingSetting type: has_many to: AttachedFile via: Logotypes - from: TicketOrderCreate type: has_one to: Customer via: Customer - from: TicketOrderCreate type: has_many to: TicketOrderRow via: Rows - from: TicketOrderCreate type: has_one to: BillingAddress via: BillingAddress - from: TicketOrderCreate type: has_one to: ShippingAddress via: ShippingAddress - from: TicketOrderRow type: has_many to: Ticket via: Tickets - from: Ticket type: has_one to: ShowInformation via: ShowInformation - from: TicketOrder type: has_one to: Customer via: Customer - from: TicketOrder type: has_many to: TicketOrderRow via: Rows - from: TicketOrder type: has_one to: BillingAddress via: BillingAddress - from: TicketOrder type: has_one to: ShippingAddress via: ShippingAddress notes: - Create/Update variants (ArticleCreate, OrderCreate, CustomerUpdate ...) mirror their base entity and are kept in the graph because they carry the write-side fields (UpdateOnExisting, upsert keys). - 'Receipt is the richest aggregate in the model: it fans out to Merchant, ControlUnit, Rounding, Customers, Articles, Payments, Vat, Orders, Discounts, Recipients, TextRows, ClientDetails and Voucher.' - ControlUnit (UnitId + ControlCode) is the Swedish tax control-unit stamp required of a certified cash register - see conformance/northmill-conformance.yml. - The relationship set is derived purely from $ref edges; scalar id-reference fields (BookableResourceId, WebHookCategoryId, ArticleNumber on rows) imply further edges that the Swagger document does not express as $ref.