The Stock Movement Report shows stock movements over a specified period of time which is set by the user.

To access the Stock Movement Report select Reports in the main menu followed by Stock Movement Report in the drop-down menu.

Within this report, filters can be applied and columns can be included to further customise the information you wish to access.

It is worth noting that changing the filters can affect the number of movements and stock balance which appears on the report as those quantities will become specific to the filter applied. This is explained in further detail below in the Stock Balance section.

Overview of available fields

1Filter By

Choose what to run the report against.

  • Product: A single product.
  • Customer: All of a specific customer's products.
  • Warehouse location: Shows any product that went through that location during the period.
2Select the <Field Type>

Updates to which Filter By is selected.

  • Product: Select a Product.
  • Customer: Select a Customer
  • Warehouse Location: Select a Warehouse Location. There are additional options to further filter by the pallet # and customer as shown below. The Pallet # will only show for bulk warehouse locations, this is useful when trying to track down storage charges on an invoice.
3Movement Type

Affects what stock will be displayed on the report and its corresponding balance.

  • Physical Movement: Displays the physical amount of stock in the warehouse (With a status of arrival to packed and everything in between). The balance on this report matches what is seen on the Customer Stock Report. 
  • Storage Charges: Storage charges show the stock quantity that is chargeable based on the Customer Charge/Rate Card settings. This option should be selected when trying to understand storage charges over a period. The inbound dates represent the allocation date of the stock. The outbound dates will either show the packed or dispatched date of the Sale Order. This is determined by the Customer Setting "Attempt to deplete Purchase Order Product when Sale Order is updated to"
4Product StatusOnly products with the selected Product status will be included in the report. The balance column will also reflect quantities with this status.
5Column SelectionAdding columns allows the product to be tracked based on that attribute. This can also result in a product being split over more lines within the report. For example, if the warehouse location column is added a Product will be split to a new line for every different location. Movements between locations will also then be displayed.
6Expiry DateMust be ticked and a date chosen to be applied.  Only the balance and quantities with the specified expiry date will be displayed.
7Automatically Scale UnitsIf selected quantities will scale to the highest Unit of Measure set up against the Product, for example, a Product with 50 Cartons to a Pallet and 67 Cartons will show as 1 Pallet + 17 Cartons. This is recommended to be used to make the report easier to read.
8Report Date SpecifiersSelect the starting and ending date of the time period you wish to examine within the report.
9Export ExcelGenerates and automatically downloads the report as an xslx format (Excel) file.
10Show ReportGenerates the report which will display at the bottom of the page within the browser.

Stock Balance

The balance column within the report reflects the quantity of stock for a product based on the filters currently applied. 

Using and combining these filters can be helpful to determine the balance of a product with specific qualities at a specified point in time.

It should be mentioned that the balance is also affected by which Movement Type is selected, however, this will be explained further in the movement type section.

Example Cases

For example, in the month of June, there were a total of 6 pallets of batteries stored within the Warehouse.

However, out of those pallets of batteries, the stock differed in the following ways:

  • 3x Pallets had a status of "OK" and expire on 10/05/2021
  • 2x Pallets also had a status of "OK", but expire on 20/03/2022
  • 1x Pallet is yet to clear customs, and is therefore marked with a status of "Quarantine".  This pallet expires on 10/05/2021.

Running the report to be filtered by Product: Batteries during the month of May will result in the following:

  • With no filters, all 6 pallets will appear in the report. 

  • Out of these pallets if extra columns are added such as Expiry Date and Product status then they will be split onto separate lines of the report based on their differing expiry dates and product status.

  • Adding the Warehouse Location Column will further split the results, as each pallet is split on to a separate line due to having a different warehouse location.

Note: The balance in the screenshot below is being incremented as each pallet is allocated to its warehouse location.

  • Removing the Warehouse Location filter and then filtering by the Product Status "OK" will result in 5 pallets appearing. The pallets will be split onto separate lines of the report based on their differing expiry dates (if the expiry date column is added)

  • Filtering by the Expiry Date of 10/05/2021 will result in 4 pallets appearing. The pallets will be onto separate lines of the report based on their product status (if the product status column is added)

  • Filtering by the  Product Status: OK AND the Expiry Date: 10/05/2021 will show 3 pallets (if the expiry date and product status columns are added)

Info Box

Whenever a stock movement report is run, there is an info box just above the report which explains what filters have been applied.

Internal Movements

Internal movements track the changes to stock while it is in the warehouse, for example, changing the status of a product from "OK" to "Damaged" would show as an internal movement.

One of the most common internal movements is moving a pallet between warehouse locations. 

Internal movements will show for any filterable column such as Product Status, Warehouse Location, Pallet #, Expiry Date and POP Custom Fields

In the screenshot below, we can see a status change on the first line and a location movement on the second line.

The changed column indicates the quantity being moved (and as it is an internal movement, the balance is not affected).

This can be used to trace back stock which has gone missing, provided those movements were recorded within CartonCloud.

Important: Internal changes will only appear if the column of the change is added to the report e.g. Warehouse Location when moving around stock.

Note: A Pallet # internal movement will only show if the pallet stayed in the same Bulk Warehouse Location but the Pallet # changed 

Breaking down charges within a Storage Period

When looking at Location-Based Storage charging on an invoice summary, it can often be confusing as to why a particular warehouse location is being charged. Generally, the workflow is:

  • Pallet comes into to Bay 1 (new charge)
  • Pallet remains in Bay 1 until the next period (existing charge)
  • Pallet is packed and dispatched on a Sale Order, it has a depleted date within the second period so does not show on the third storage summary.

First Period

Second Period

The formula for existing storage charges:

Existing storage = (Previous Period) New Storage Pallets + Existing Storage Pallets - Depleted Pallets

When investigating Storage Period charges make sure the Movement Type is set to Storage Charges.

Scenario One: new storage charge Warehouse Location (or Pallet) does not match next periods existing storage charge Warehouse Location (or Pallet)

Occasionally you might see that after the first-period new charge is Bay 1, the second-period existing charge is Bay 2. To find out why run the report over the start and end dates of the first period with the warehouse location and pallet # column selected. On the stock movement report you should find an internal movement between the two locations (or pallets):

Bay 1 â†’ Bay 2 indicates the stock was relocated. The charge is on existing stock however it has moved to a new location.

Scenario Two: The existing storage charge does not match the next periods existing storage charge

When no new storage charges were introduced and the existing storage period location has changed, this is very similar to scenario one were an internal movement occurred on existing stock

Scenario Three: The existing storage charge is larger than Existing + New - Depleted

This occurs because of a split during the period. To find out why run the report over the start and end dates of the first period with the warehouse location column and pallet # selected. On the stock movement report you should find an internal movement that represents the split (this may not be in chronological order if partial split happened)

When running these reports, it is helpful to filter by the warehouse location being investigated.


Backdating, or in broader terms, changing the allocated date of stock on a Purchase Order is a crucial part of storage charges. Backdating usually occurs when stock arrives into the warehouse but is failed to be allocated to a location. An administrator or packer notices this and then changes the allocated date of that stock to ensure storage is charged for the entire time it is in the warehouse. If stock has been backdated then it is indicated on the report under the date in red text as shown below.

One of the most useful tools in this report is the links on the report to other pages of CartonCloud. Some links are simple and take you to where you would expect. For example, clicking the Purchase Order link takes you to that Purchase Order (similar for Customer and pallet #)

When clicking on the In/Changed/Out link it will take you to the Purchase Order Product or Sale Order Product history for that movement. This helps identify which employee performed the action. If multiple Purchase Order Products or Sale Order Products are associated with that move then a Purchase Order Product record will provide all the associated links.

Clicking on either a Product or Warehouse Location link will take you to that Product/Warehouse location record, but directly to the Stock Movement tab. The date range and Movement Type are automatically set, and the report automatically run. This can be very useful for quickly jumping between specific perspectives to see where stock ended up.

Unique Custom Field Tracking

When using a unique Purchase Order Product Custom Field, it can often be difficult to track where it came from. If I move a Purchase Order Product between warehouse locations, a new purchase order product is created. The original purchase order product has the unique custom field removed as there can only be one purchase order product with that unique field. The Stock Movement Report checks past records and calculates where that unique custom field would have existed, then shows it on the report. This can sometimes be confusing when clicking on the link to access the Purchase Order Product as it won't show that it had the unique custom field.


The stock movement balance does not match the customer stock report?

Check that your movement type is set to Physical Stock.

I have no new orders for the storage period, but the storage charges have increased?

This is likely caused by some stock being split from one warehouse location to two or more warehouse locations. Adding the warehouse location column to the report will allow you to identify this behaviour and investigate the difference in charges further (Ensure Movement type is set as Storage Charges).

Why has the balance changed when applying filters?

Filters affect the balance of the report, for example, filtering by Product Status "OK", the balance will reflect the total number of "OK" stock in the warehouse.

I can’t find an internal movement on the report?

Whether Internal movements appear is subject to which column headers were selected. For example, if you are looking for warehouse location movements then you must have the warehouse location column header selected before running the report.