{"id":420,"date":"2026-04-09T17:29:22","date_gmt":"2026-04-09T15:29:22","guid":{"rendered":"https:\/\/monikapieczonka.com\/?p=420"},"modified":"2026-04-13T19:03:50","modified_gmt":"2026-04-13T17:03:50","slug":"irregular-orders-arent-random","status":"publish","type":"post","link":"https:\/\/monikapieczonka.com\/?p=420","title":{"rendered":"\u201cIrregular\u201d Orders Aren\u2019t Random"},"content":{"rendered":"\n<p>Order pattern looks <em>irregular<\/em>\u2014so irregular that your first reaction is:<\/p>\n\n\n\n<p class=\"is-style-text-annotation is-style-text-annotation--1\" style=\"font-size:clamp(15.197px, 0.95rem + ((1vw - 3.2px) * 0.765), 23px);\"> \u201cThis is intermittent demand; forecasting will be messy.\u201d <\/p>\n\n\n\n<p>And yes, sometimes it is.<\/p>\n\n\n\n<p>But in many cases, it\u2019s not <strong>\u201cabsolutely irregular.\u201d<\/strong> There are <strong>patterns<\/strong>. The problem is that we often <strong>look for the wrong ones<\/strong>.<\/p>\n\n\n\n<p>Let me walk through a case I\u2019ve seen more than once\u2014and why a standard forecasting approach can produce horrible accuracy, even when the demand is actually quite structured.<\/p>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--2\"><br>Pattern #1: Irregular timing, but a stable weekly \u201cenvelope\u201d<\/p>\n\n\n\n<p>At first glance, the orders arrive at inconsistent intervals. One week you get a hit, next week nothing, then two dips close to each other.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"37\" src=\"https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-3-1024x37.png\" alt=\"\" class=\"wp-image-423\" srcset=\"https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-3-1024x37.png 1024w, https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-3-300x11.png 300w, https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-3-768x28.png 768w, https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-3-1536x56.png 1536w, https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-3-2048x75.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"556\" src=\"https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-1-1024x556.png\" alt=\"\" class=\"wp-image-421\" srcset=\"https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-1-1024x556.png 1024w, https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-1-300x163.png 300w, https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-1-768x417.png 768w, https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-1.png 1366w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Still, when you zoom out, you often see an estimated volume of demand per quarter that is stable. Look at same data on Quarterly granularity:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"932\" height=\"88\" src=\"https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-4.png\" alt=\"\" class=\"wp-image-424\" srcset=\"https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-4.png 932w, https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-4-300x28.png 300w, https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-4-768x73.png 768w\" sizes=\"(max-width: 932px) 100vw, 932px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"633\" src=\"https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-2-1024x633.png\" alt=\"\" class=\"wp-image-422\" srcset=\"https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-2-1024x633.png 1024w, https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-2-300x186.png 300w, https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-2-768x475.png 768w, https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-2.png 1200w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>In other words:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Order timing is irregular\nBut average quarterly throughput is not crazy<\/code><\/pre>\n\n\n\n<p>Pattern &#8211; straight-forward. But only if you zoom out.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--3\">Pattern #2: Volumes repeat \u2014 because quantities are discrete (not continuous)<\/p>\n\n\n\n<p>Some SKUs are ordered only in a specific base quantity (a \u201cbase unit\u201d), always.<\/p>\n\n\n\n<p>If the customer makes an order, it is always:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>exactly the Base Unit, or\na clean multiple of it<\/code><\/pre>\n\n\n\n<p>Example :<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"37\" src=\"https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-5-1024x37.png\" alt=\"\" class=\"wp-image-425\" srcset=\"https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-5-1024x37.png 1024w, https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-5-300x11.png 300w, https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-5-768x28.png 768w, https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-5-1536x55.png 1536w, https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-5-2048x73.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>In such a case, making statistics on \u201cnumber of kg\u201d as if it were a smooth continuous variable often makes no sense. The demand is <strong>quantized<\/strong>.<\/p>\n\n\n\n<p>So even if your weekly forecast is \u201cclose\u201d in an average sense, it can still be <strong>operationally wrong<\/strong> because it predicts values that cannot happen in reality (e.g., 1433 kg when the only feasible outcomes are 792 or 1584 kg).<\/p>\n\n\n\n<p>This is a classic planning trap:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Forecast looks mathematically reasonable\nBut it violates the ordering grammar of that SKU\/customer combination\nResult: big errors, low trust, bad downstream decisions (inventory, production, transport planning)<\/code><\/pre>\n\n\n\n<p><em>Why does this happen?<\/em><\/p>\n\n\n\n<p>Because the demand you observe is not purely consumption-driven\u2014it\u2019s consumption filtered through<strong> ordering constraints<\/strong>, such as:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pack size \/ layer \/ pallet multiples\nminimum order quantities (MOQ)\nfull-truck or delivery-slot economics\ninternal customer ordering habits (\u201cwe always order 2 pallets\u201d)\nsystem constraints (ERP rounding, UoM conversions)<\/code><\/pre>\n\n\n\n<p>The \u201creal\u201d consumption may be <strong>smoother<\/strong>, but your order history is a <strong>rounded<\/strong> and <strong>batched<\/strong> signal.<br>Can SAP IBP help? Yes, in concept\u2014sometimes not in practice<\/p>\n\n\n\n<p>A potential solution direction is using Time Series Properties in SAP IBP (feature engineering for time series):<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"595\" height=\"282\" src=\"https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-7.png\" alt=\"\" class=\"wp-image-427\" srcset=\"https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-7.png 595w, https:\/\/monikapieczonka.com\/wp-content\/uploads\/2026\/04\/image-7-300x142.png 300w\" sizes=\"(max-width: 595px) 100vw, 595px\" \/><\/figure>\n\n\n\n<div class=\"wp-block-essential-blocks-button  root-eb-button-on59v\"><div class=\"eb-parent-wrapper eb-parent-eb-button-on59v \"><div class=\"eb-button-wrapper eb-button-alignment eb-button-on59v\"><div class=\"eb-button\"><div class=\"eb-button-inner-wrapper \"><a class=\"eb-button-anchor  \" href=\"https:\/\/help.sap.com\/docs\/SAP_INTEGRATED_BUSINESS_PLANNING\/feae3cea3cc549aaa9d9de7d363a83e6\/f68deb4a38284397a4fbaefdb253ab6c.html\" target=\"_blank\" rel=\"nofollow noopener\">Link to full SAP IBP Documentation<\/a><\/div><\/div><\/div><\/div><\/div>\n\n\n\n<p>In general, <strong>the concept is great<\/strong>: it encourages you to explicitly describe <strong>characteristics<\/strong> of the series and derive smarter features.<\/p>\n\n\n\n<p>But here\u2019s my observation from the field:<br>The limitation: it may not catch \u201cbase-unit multiple\u201d demand<\/p>\n\n\n\n<p>These discrete-multiple patterns are not just seasonality, trend, or noise. They\u2019re more like a<strong> rule-based quantization<\/strong> of order quantities.<\/p>\n\n\n\n<p>If the feature framework doesn\u2019t explicitly detect and represent \u201corder quantities come in multiples of X,\u201d then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>the model can still average across outcomes\nand it will keep producing \u201cin-between\u201d numbers that never occur<\/code><\/pre>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--4\">Practical way to think about it (what usually works better)<\/p>\n\n\n\n<p>If I had to summarize the right mental model:<br>Don\u2019t forecast \u201ckg\u201d first. Forecast the ordering mechanism.<\/p>\n\n\n\n<p>A robust approach is usually two-layer:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>When will an order occur? (order event \/ probability)\nIf an order occurs, how many base units will it be? (1x, 2x, 3x\u2026)<\/code><\/pre>\n\n\n\n<p>Then <strong>convert back<\/strong> to kg if needed.<\/p>\n\n\n\n<p>Even without building a complex ML stack, you can often improve results by introducing a simple constraint\/post-processing step:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>detect the base unit from history (e.g., most common divisor or most frequent quantity step)\nforecast demand level\nthen snap\/round the forecast to the nearest feasible multiple (with sensible business rules)<\/code><\/pre>\n\n\n\n<p>This alone can drastically reduce \u201cnonsense forecasts\u201d and improve planner trust\u2014even if your underlying model doesn\u2019t change.<\/p>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--5\"><br>Final thought<\/p>\n\n\n\n<p>\u201cIrregular orders\u201d is often a <strong>misleading label<\/strong>. Many series are irregular <em>in timing<\/em>, but highly regular <em>in allowed quantities<\/em>. If you ignore that discreteness, you can spend months tuning models and still get terrible accuracy<strong>\u2014because the model is solving the wrong problem<\/strong>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Order pattern looks irregular\u2014so irregular that your first reaction is: \u201cThis is intermittent demand; forecasting will be messy.\u201d And yes, sometimes it is. But in many cases, it\u2019s not \u201cabsolutely irregular.\u201d There are patterns. The problem is that we often look for the wrong ones. Let me walk through a case I\u2019ve seen more than [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_eb_attr":"","footnotes":"","_wpscppro_dont_share_socialmedia":false,"_wpscppro_custom_social_share_image":0,"_facebook_share_type":"default","_twitter_share_type":"default","_linkedin_share_type":"default","_pinterest_share_type":"default","_linkedin_share_type_page":"","_instagram_share_type":"default","_medium_share_type":"default","_threads_share_type":"default","_google_business_share_type":"default","_selected_social_profile":[],"_wpsp_enable_custom_social_template":false,"_wpsp_social_scheduling":{"enabled":false,"datetime":null,"platforms":[],"status":"template_only","dateOption":"today","timeOption":"now","customDays":"","customHours":"","customDate":"","customTime":"","schedulingType":"absolute"},"_wpsp_active_default_template":true},"categories":[6],"tags":[],"class_list":["post-420","post","type-post","status-publish","format-standard","hentry","category-forecasting"],"_links":{"self":[{"href":"https:\/\/monikapieczonka.com\/index.php?rest_route=\/wp\/v2\/posts\/420","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/monikapieczonka.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/monikapieczonka.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/monikapieczonka.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/monikapieczonka.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=420"}],"version-history":[{"count":1,"href":"https:\/\/monikapieczonka.com\/index.php?rest_route=\/wp\/v2\/posts\/420\/revisions"}],"predecessor-version":[{"id":428,"href":"https:\/\/monikapieczonka.com\/index.php?rest_route=\/wp\/v2\/posts\/420\/revisions\/428"}],"wp:attachment":[{"href":"https:\/\/monikapieczonka.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=420"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/monikapieczonka.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=420"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/monikapieczonka.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=420"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}