{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-solution-portal/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["admonition"]},"type":"markdown","redocly_category":"Solutions","owner":"MB"},"seo":{"title":"Norce Solution design - Handling subscriptions and recurring orders","description":"How to meet subscription and recurring-order requirements with Norce Commerce, keeping the subscription logic in your own solution layer.","keywords":"business-solution, technical, solution, design, subscription, recurring, recurring-orders"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"handling-subscriptions-and-recurring-orders"},"children":["Handling subscriptions and recurring orders"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Summary:"]}," ","Norce Commerce does not provide a supported, built-in subscription engine. Requirements such as recurring deliveries, \"subscribe and save\", or recurring billing are best solved in your own solution layer, using Norce for the parts it is good at — the catalog, pricing, customers, orders and events — while keeping the subscription agreement and scheduling outside Norce."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"The legacy Subscriptions API"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Subscription"]}," API exists in the Shopping Service (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CreateSubscription"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["UpdateSubscription"]},", and so on). It is ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["legacy"]}," and is retained only to support older solutions. Do not build new solutions on it. Use the approach described below instead."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"where-the-subscription-lives"},"children":["Where the subscription lives"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The subscription itself — who subscribes, to what, how often, the next run date, and whether it is paused — is state that belongs in ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["your solution layer"]},", not in Norce. This can be a dedicated subscription service or a table in your integration layer. Store at least:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The customer (and company, for B2B)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The subscribed products and quantities."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The cadence (for example every 4 weeks) and the next run date."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The status (active, paused, cancelled) and, for pauses, when to resume."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A reference to the payment agreement or token, if the payment provider supports recurring charges."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Keeping this outside Norce gives you full control over pause, resume, skip-a-delivery, and cancellation without depending on platform-specific behavior."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"the-recurring-cycle"},"children":["The recurring cycle"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["On each cycle, a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["scheduler in your solution layer"]}," turns the subscription into an ordinary order in Norce:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["When the next run date is reached, create a basket for the customer and add the subscribed products, using the customer's price list so subscriber pricing and discounts apply."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Take the basket through the normal purchase flow to create an order. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/app-development/working-with-baskets"},"children":["Working with baskets"]}," and ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/app-development/working-with-the-checkout-process"},"children":["The checkout process"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Charge the customer through your payment provider (see ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"#payments"},"children":["Payments"]},")."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Advance the next run date, and react to the order events from Norce (for example order confirmed) if you need to update your subscription store."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Pause, resume, skip and cancel are handled entirely in your store by adjusting the next run date or the status — the scheduler simply does not create an order when a subscription is paused or cancelled."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"pricing-and-offers"},"children":["Pricing and offers"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use standard Norce features for the commercial side:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Price lists"]}," for subscriber-specific or tiered pricing. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/solution-portal/detailed-design/pricing-structure"},"children":["Pricing structure"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Promotions"]}," for introductory offers (for example a discount on the first delivery)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Bundles"]}," when a subscription is a fixed kit of products. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/solution-portal/detailed-design/selling-bundles"},"children":["Selling bundles"]},"."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"payments"},"children":["Payments"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Recurring charges are the responsibility of the payment provider, not Norce. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Norce Checkout (NCO) supports recurring payments for several PSPs"]},", and can store payment tokens for recurring charge flows. The token is saved to the initial order and can be retrieved from there by your solution layer to charge subsequent cycles without requiring the customer to re-enter payment details."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Check the specific ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/app-development/nco/payment-adapters"},"children":["payment adapter"]}," you use to confirm whether recurring payments or token storage are supported. Where recurring payment is not available from the PSP, an invoice-based flow is a common alternative for B2B subscriptions."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"what-norce-provides-to-build-on"},"children":["What Norce provides to build on"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Need"},"children":["Need"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Norce capability"},"children":["Norce capability"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Catalog and product data"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Product model, bundles, relations"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Subscriber pricing"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Price lists, promotions"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Customers and companies"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Customer accounts, B2B company model"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Turning a cycle into an order"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Shopping (basket) and Order APIs"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Recurring payment tokens"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Stored on the initial order via NCO (PSP-dependent)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Reacting to order progress"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/system-integration/using-norceevent"},"children":["Norce Commerce Event"]}," (e.g. order confirmed)"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The scheduling, pause/resume logic, and recurring payment orchestration remain in your solution layer."]}]},"headings":[{"value":"Handling subscriptions and recurring orders","id":"handling-subscriptions-and-recurring-orders","depth":1},{"value":"Where the subscription lives","id":"where-the-subscription-lives","depth":2},{"value":"The recurring cycle","id":"the-recurring-cycle","depth":2},{"value":"Pricing and offers","id":"pricing-and-offers","depth":2},{"value":"Payments","id":"payments","depth":2},{"value":"What Norce provides to build on","id":"what-norce-provides-to-build-on","depth":2}],"frontmatter":{"seo":{"title":"Norce Solution design - Handling subscriptions and recurring orders","description":"How to meet subscription and recurring-order requirements with Norce Commerce, keeping the subscription logic in your own solution layer.","keywords":"business-solution, technical, solution, design, subscription, recurring, recurring-orders"},"metadata":{"redocly_category":"Solutions","owner":"MB"}},"lastModified":"2026-07-10T06:04:35.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/solution-portal/detailed-design/handling-subscriptions","userData":{"isAuthenticated":false,"teams":["anonymous"]}}