Skip to content
Integration & processes

Stocktaking and year-end: preparing the B2B shop

Cut-off date, freeze window, number ranges and price version: how to plan stocktaking and the year-end across warehouse, ERP system and your B2B shop.

14 min read InventurJahreswechselBestandsabgleichERPProzesse

In the fourth quarter, two calendars run against each other inside a trading company. One belongs to the warehouse: counting zones, freeze lists, cut-off date. The other belongs to the shop: orders that keep coming in, availability figures on display, and business customers expecting an order confirmation in the first week of January. Commercial law does not know the shop, it only knows the inventory: every merchant has to draw up a schedule of assets and liabilities at the end of each financial year, and the duration of the financial year must not exceed twelve months (German Commercial Code). Between that sentence and a running B2B shop sit stock freezes, number ranges, price versions, document archives and a maintenance window across the public holidays. This article describes how both calendars can be merged into one schedule from October to January, which simplification procedures the law provides for it, and where the interface between shop, ERP and warehouse sets the pace.

Key takeaways

  • The balance sheet date is fixed, the counting date is not: the special inventory of a shifted stocktake may be drawn up for a day within the last three months (German Commercial Code) before or the first two months after the end of the financial year.
  • Four simplification procedures are available: sampling, perpetual stocktaking, shifted stocktaking and the fixed-value method. Which one holds is not decided by the warehouse but by how completely stock accounting is kept in the ERP system.
  • The freeze window is a shop event: while counting runs, it affects the availability display, the delivery-time promise and reservations from framework contracts, not just the figure in the warehouse program.
  • More than stock levels change on 1 January: invoices need a sequential number that the issuer assigns only once (German VAT Act), and the new price version has to take effect at the same moment as the stock handover.
  • The retention period starts once the accounts are closed: the inventory has to be kept for ten years (German Commercial Code), counted from the end of the calendar year in which it was drawn up. That also covers the document data created in the shop.

Why the year-end is a data project in the shop

Stocktaking is a merchant's duty, not an IT process. Even so, the data model decides how expensive it becomes. Anyone who only knows stock levels in the warehouse counts once and then transfers the result into several systems by hand. Anyone who keeps stock in the ERP system and attaches the shop to it counts once and distributes the result through an interface. The precondition sounds trivial but is not present everywhere: one leading system for stock. According to survey data from the European statistical office, 43.54 percent (Eurostat) of German enterprises with ten or more persons employed use ERP software at all that shares information between different functional areas. The survey does not cover the whole economy: the series covers the activities outside agriculture, forestry and fishing, mining and quarrying, and the financial sector. The others keep stock in spreadsheets, in a warehouse management system without a connection, or in the shop itself, and that is exactly where the year-end turns into manual work.

For a B2B shop there is an additional twist. In consumer business, stock is a number that is either sufficient or not. In business-to-business it is a commitment: framework contracts, call-off orders, reserved quantities and promised delivery times all depend on it. Freezing stock for the count does not only freeze a display, it freezes a sales commitment. How closely availability and delivery time are linked in B2B is described in our article on real-time availability in the B2B shop; stocktaking is the one date in the year when that chain is interrupted on purpose. Anyone also working with framework contracts and call-off orders has to decide whether a call-off during the freeze window is accepted, scheduled or declined.

Stocktaking, inventory, balance sheet - three terms, one chain

Stocktaking is the activity: recording the stock. The inventory is the result: the schedule of assets and liabilities with their values. The balance sheet is the condensed presentation derived from it. Only the first stage is directly noticeable in the shop, because it freezes stock levels for a while. The second and third stages act indirectly: they determine which movement data has to be available, in what form and for how long - and therefore what the shop's document archive has to deliver.

What the law requires of the inventory

The starting point is stated briefly in the German Commercial Code. At the start of a commercial business, every merchant has to record precisely their land, receivables and liabilities, the amount of their cash and their other assets, stating their value; after that, such an inventory has to be drawn up at the end of each financial year. The duration of the financial year must not exceed twelve months (German Commercial Code), and the inventory has to be prepared within the time appropriate to orderly business operations. The law does not name a calendar date for the preparation. That creates room to manoeuvre and at the same time produces the most common wrong assumption in project plans, namely that the deadline can be stretched at will.

When drawing up the inventory, the stock of assets by type, quantity and value may also be determined with the help of recognised mathematical and statistical methods on the basis of samples.

Section 241 (1) German Commercial Code, translated from the German original

There is an exemption from the inventory obligation for small sole traders. Anyone who, on the balance sheet dates of two consecutive financial years, shows no more than 800,000 euros (German Commercial Code) in revenue and no more than 80,000 euros (German Commercial Code) in annual profit in each case does not have to apply the provisions on bookkeeping and inventory. For most operators of a B2B shop this is not a practical option: the threshold is well below what a wholesale, industrial or technical trading business turns over in a year, and the exemption only applies to sole traders anyway, not to corporations.

Alongside the what, the law also governs the how. The German Fiscal Code requires that bookings and the other necessary records be made individually, completely, correctly, in a timely (German Fiscal Code) manner and in an orderly fashion. For a shop with a connected ERP system, the word timely is the practically relevant one. A stock movement that only catches up out of a queue the next morning is an open item on the cut-off date and shows up in the difference list without anyone having miscounted. Anyone planning a stocktake therefore plans the handover between systems first and the counting second. Which patterns hold for that is described in our article on ERP integration in B2B e-commerce.

Four simplification procedures and what the shop notices

The German Commercial Code does not prescribe a particular counting method but allows several routes. The choice is not purely a warehouse decision: each procedure makes a different demand on data quality in the ERP system, and each one affects the shop differently. The following overview sorts the procedures by what they mean for the running order process.

ProcedureLegal basisWhat the shop noticesPrecondition in the system
Cut-off date stocktakingSection 240 German Commercial CodeFreeze window across a few days, stock is frozen completelyMovements are held during the freeze window and caught up afterwards in a defined order
Shifted stocktakingSection 241 (3) German Commercial CodeCounting outside peak load, the shop keeps running normally on the balance sheet dateRoll-forward or roll-back per item up to the end of the financial year, documented and traceable
Perpetual stocktakingSection 241 (2) German Commercial CodeNo central freeze window, instead ongoing partial freezes per storage zoneComplete stock accounting with receipts and issues per item and storage location
Sample-based stocktakingSection 241 (1) German Commercial CodeShorter counting time, the informative value has to equal that of a physical countRecognised mathematical and statistical method, documented and auditable
Fixed-value methodSection 240 (3) German Commercial CodeApplies to plant as well as raw, auxiliary and operating materials, rarely to shop itemsAs a rule a physical count every three years

The sentence that decides the schedule

With shifted stocktaking, the special inventory may be drawn up for a day within the last three months (German Commercial Code) before or the first two months (German Commercial Code) after the end of the financial year. Where the financial year matches the calendar year, that window runs from 1 October to the last day of February - provided a roll-forward or roll-back procedure secures the stock value as at the balance sheet date.

For a shop with pronounced year-end business, shifted stocktaking is typically the quietest route: counting happens in November, the calculation runs through to 31 December, and the order process stays untouched during the days between the years. The price for that is a clean roll-forward procedure - every movement between the counting day and the balance sheet date has to be traceable per item. Where batches or serial numbers are kept, another layer is added; our article on batches and serial numbers in the B2B shop describes how those records hang together in the data model. The unit of measure also plays a part: anyone selling in packs and counting in pieces needs a reliable conversion factor, as described in the article on units of measure and pack sizes.

The schedule from October to January

A stocktaking plan that only comes into being in December is not a plan but a reaction. The following split has proven itself in projects where warehouse, ERP and shop are looked after by different teams. It spreads the work across four months and puts the technical dependencies ahead of the organisational ones.

October: settle the procedure

Decision first, technology second: cut-off date, shifted, perpetual or sample-based. The choice determines whether there is a freeze window at all and how long it turns out to be.

October: cut the counting zones

Storage locations, zones and freeze areas are cut so that they match the posting units in the ERP system. A counting zone the system does not know produces differences without a cause later on.

November: clean up master data

Items without movement, duplicate numbers, missing conversion factors and decommissioned storage locations are settled before counting. Every open master data question costs a multiple of that during the counting week.

November: preliminary count

With shifted stocktaking, counting happens now. The counting day gets its own timestamp, and from that moment the roll-forward runs per item up to the balance sheet date.

December: freeze window

Posting cut-off, stock freeze and the agreed behaviour of the shop take effect together. What stays orderable during this time and which delivery time is displayed is a sales decision, not a warehouse one.

January: catch-up and release

Difference postings, full sync to the shop, release of the availability display and closing of the number ranges. Only after that is the availability display a commitment again.

  • The counting day and the balance sheet date are two separate date fields, even where they coincide
  • Every stock movement carries a timestamp with a time zone, not just a date
  • The freeze window has a start and an end including the time of day, both stored in the shop
  • The full sync after the catch-up is scheduled and does not depend on a release passed on by word of mouth
  • For every storage location it is settled whether it feeds into the shop's availability display
  • The schedule names a responsible role per step, not just a date

What stands out is how many of these points have nothing to do with counting. The actual stocktaking work takes a few days; the preparation of the data path determines whether those days pass quietly. Anyone drawing up the schedule for the first time should walk through the steps together in an e-commerce consulting session and record which decision is stored in which system.

Stock freeze and freeze window: what the shop displays during that time

A freeze window is not a maintenance mode. The shop stays reachable, catalogues, prices and customer accounts keep working; what is frozen is the stock figure. That raises a question rarely asked in consumer business: may a business customer order during this time, and with what commitment? Three answers are common, and all three are defensible - they just have to be decided in advance and stored in the shop.

The first answer freezes the last figure before the block and allows orders, but moves the promised dispatch time to the first working day after the catch-up. The second holds the stock figure, accepts orders and shows them as a scheduled call-off without reserving a quantity. The third puts the affected items into a status without an availability commitment and offers an enquiry instead. Which variant fits depends on the assortment: for stock items with a high turnover rate the first variant is common, for project goods with long lead times the second.

stocktaking-window.json
{
  "stocktaking": {
    "financial_year_end": "2026-12-31",
    "method": "shifted",
    "special_inventory": "2026-11-18",
    "roll_forward_until": "2026-12-31"
  },
  "freeze_window": {
    "start": "2026-12-19T18:00:00+01:00",
    "end": "2027-01-04T06:00:00+01:00",
    "storage_locations": ["HL-01", "HL-02", "AUSSEN-03"],
    "shop_behaviour": {
      "stock_source": "last_value_before_freeze",
      "orderable": true,
      "delivery_time_text": "dispatch_from_05_01",
      "framework_contract_reservation": "unchanged"
    }
  },
  "catch_up": {
    "difference_postings_until": "2027-01-12",
    "shop_full_sync": "2027-01-12T05:00:00+01:00"
  }
}

What matters is that these details exist as data and not as a verbal arrangement. A freeze window that only lives in a calendar entry typically ends when somebody happens to think of it. A freeze window with a start, an end and defined shop behaviour ends at the stored moment, and the full sync then runs as a scheduled job. The connection for that sits in the same ERP interfaces through which stock levels, prices and orders travel during the rest of the year.

The silent fault: stock keeps moving, the display does not

If stock transfer is simply switched off during the freeze, the movements pile up in the queue and catch up in arbitrary order once the window ends. The shop then displays values for hours that did not match the actual stock at any point in time. The opposite is cleaner: the transfer keeps running, but the shop switches to a fixed source and only takes the ERP values again after the full sync.

Number ranges, price version and documents on 1 January

More data fields than stock depend on the turn of the year. The German VAT Act requires every invoice to carry a sequential number with one or several number series, assigned only once (German VAT Act) by the issuer to identify the invoice. A year-based number range is therefore permitted but not mandatory; anyone using one has to carry out the switch in every system that creates invoices - in the shop, in the ERP and in a possibly separate dispatch system. If numbering continues in two places, duplicate assignments arise that can later only be cleaned up with credit notes. How the invoicing path attaches to the ERP system as a whole is described in the article on the e-invoicing mandate in the B2B shop.

The second change concerns prices. New list prices, changed tiers, adjusted surcharges and, in many companies, new freight costs take effect on 1 January. So that the stock handover and the price version do not drift apart, both belong in the same window: the full sync of stock levels and the activation of the new price list are two steps of the same procedure, not two tasks in two calendars. Anyone working with daily quotations will find the mechanics for that in the article on daily prices and surcharges in the B2B shop. The turn of the year also includes maintaining tax attributes on customer records; how VAT identification numbers can be checked and maintained is described in the article on VAT in the B2B shop.

  1. Name the number ranges for quotation, order, delivery note and invoice per system and settle who owns them
  2. Store the switching moment as a timestamp, not as a date without a time of day
  3. Give price lists, tiers and surcharges a validity start and check them in a preview beforehand
  4. Activate freight cost tables and small-quantity surcharges at the same moment as the prices
  5. Mark open quotations carrying last year's price version and check their validity period
  6. After the switch, run a sample across document, price and tax disclosure before the first bulk dispatch

Archive and retention: what remains after closing

Closing the accounts does not end the work on the data, it only changes its character. The German Commercial Code sorts the documents into three periods: commercial books, inventories, opening balance sheets, annual financial statements and management reports have to be kept for ten years (German Commercial Code), accounting vouchers for eight years (German Commercial Code) and the other listed documents for six years (German Commercial Code). For tax purposes, the German Fiscal Code applies the same graduation with ten years (German Fiscal Code) for books and records. What matters for planning is when the period starts: at the end of the calendar year in which, among other things, the inventory was drawn up. An inventory drawn up as at 31 December 2026 therefore has to be retained until the end of 2036.

For a shop system, one requirement in this is genuinely new: readability across a very long period. Where commercial books and records are kept on data media, it has to be ensured that the data remains available (German Commercial Code) for the duration of the retention period and can be made readable at any time within a reasonable period. A PDF in the customer account only satisfies that as long as the customer account exists and the system delivers the file. A more robust route is an export in a system-independent format that carries the document data together with the stock movements of the financial year and that is tested along with every version change of the shop.

What belongs in the annual export

Document header and document lines with item number, description, quantity, unit of measure, unit and total price, tax rate and tax amount; the assignment to customer, customer group and price list; the stock movements per item and storage location with timestamps; the inventory schedule with counting day, procedure and valuation approach; and the roll-forward logs where counting was shifted or perpetual. The export belongs in the maintenance of the shop, so that it runs again after every version change instead of only surfacing during a tax audit.

The interface as the pacemaker between shop, ERP and warehouse

During the stocktaking week it becomes visible how robust the data path was for the rest of the year. Three patterns show up regularly. First: transferring stock as a complete extract makes the full sync easy but produces load and delay in day-to-day operation. Transferring only changes is faster in everyday use but additionally requires a complete sync at a defined moment for the year-end. Second: a stock value without a timestamp cannot be reconstructed during the catch-up. Third: reservations from framework contracts, open picks and goods in quality inspection are states of their own and not deductions from a single figure.

  • Full sync and delta sync are separate operating modes with their own logging
  • Every transferred stock value carries the storage location, a timestamp and the identifier of the triggering process
  • Reserved, blocked and freely available quantities are separate fields, not an arithmetic operation in the shop
  • Error cases run into a queue with retries, not into a log without a reader
  • For the freeze window there is a documented switch that can be set without development work
  • After the full sync, the number of synchronised items is counted against the stock in the leading system

The last point is, in our experience, the awkward one. A sync that ends without an error message has not necessarily transferred everything: an aborted run, a filter on active items or a timeout can leave part of the assortment unchanged. A count comparison across both sides costs a few minutes and is the statement that makes the difference between completed and silently skipped visible. We set up that comparison as a fixed step in the connection, together with the other interfaces between shop and ERP.

Maintenance window and availability across the holidays

For system changes, the days between the years are both the most convenient and the most delicate period. Convenient, because order load in many B2B assortments is low; delicate, because staffing is thin and a fault goes unnoticed for longer. The legal framework is clear: employees must not be employed on Sundays and public holidays from 0 to 24 hours (German Working Hours Act), unless one of the statutory exemptions applies. Which days are public holidays is largely determined by state law; the only one settled by federal law is 3 October (Unification Treaty) as the Day of German Unity. For a shop with customers in several federal states this means: the holiday calendar belongs in the delivery-time calculation as a data source, not in a footnote.

In practice it has proven useful to place the maintenance window at the end of the freeze window and to communicate both in the same announcement. The shop stays reachable, larger interventions in interfaces and version levels run within an announced period with agreed on-call availability. Anyone planning a version change anyway should not put it in the same week; the reasons are set out in the article on maintenance strategy for the Shopware upgrade. Which response times apply during that period is governed by the maintenance agreement and not by the availability of individual people.

How we approach it

We start at the data path, not at the counting sheet. As a rule the work begins with a survey of what is transferred between warehouse, ERP and shop today: which fields, in which direction, at what interval and with what error behaviour. From that it follows which stocktaking procedure the system can actually support. Only after that does the schedule take shape, with dates, responsibilities and the behaviour of the shop during the freeze window.

  1. Survey of the existing transfer between ERP, warehouse and shop, including error handling and logging
  2. Comparison with the chosen stocktaking procedure and naming of the gaps that have to be closed before the counting day
  3. Setting up the freeze window, shop behaviour and full sync as configurable steps instead of one-off interventions
  4. Preparation of number ranges, price versions and freight tables with a validity start on 1 January
  5. Trial run on a copy of the shop, followed by a count comparison across both systems
  6. Support during the freeze window and the catch-up with agreed availability across the holidays

For companies that serve their customers through a portal anyway, the customer view is worth a look: a B2B portal can carry the freeze window, changed delivery times and the new price version as a notice in the customer account instead of generating every enquiry in sales. For the technical implementation in the shop itself, the same path applies as during the rest of the year, described under Shopware development and in our services.

Sources and legal bases

This article draws on: German Commercial Code, Section 239 (4) (keeping records on data media), Section 240 (inventory, financial year, fixed value), Section 241 (stocktaking simplification procedures), Section 241a (exemption for sole traders) and Section 257 (retention and start of the period); German Fiscal Code, Section 146 (1) (rules of order) and Section 147 (3) (retention periods); German VAT Act, Section 14 (4) (invoice details); German Working Hours Act, Section 9 (1) (Sunday and public holiday rest); Unification Treaty, Article 2 (2) (Day of German Unity); and Eurostat, survey on the use of information and communication technologies in enterprises, dataset isoc_eb_iip, enterprises with ten or more persons employed in Germany, excluding agriculture, forestry and fishing, mining and quarrying, and the financial sector.

Related Articles

Integration & processes

Supplier Portal: Digital Purchasing and Goods Receipt

Purchase order, order confirmation, despatch advice and goods receipt as a transaction with a status instead of a mail attachment: closing the document chain.

14 min read
Law & compliance

Automating Sanctions Screening in B2B Shops

AWG amendment 2026: how to automate sanctions screening in a B2B store at four points, release matches through human review and log each check audit-proof.

14 min read
Integration & processes

SAP ECC 2027: Shop Integration for the S/4HANA Switch

SAP ECC ends in 2027: how a decoupled middleware makes your shop integration migration-proof, keeps shop and ERP switch in sync and makes the move plannable.

15 min read