{
  "title": "SKU.io Changelog",
  "description": "User-facing changes to SKU.io, dated and tagged by area and impact. The `sop_impact` field on each entry describes what a customer's internal SOP may need to change. Machine-readable companion to https://docs.sku.io/changelog . Agents: fetch this file, filter `entries[]` by `date >= your-last-sync-date`, and read the linked `docs[]` pages (append `.md` for clean markdown).",
  "impact_legend": {
    "added": "New capability. Usually additive to existing SOPs.",
    "changed": "Existing behaviour changed. Review SOPs that rely on it.",
    "moved": "UI location / navigation changed. High risk of breaking step-by-step SOPs.",
    "fixed": "A bug was fixed; behaviour now matches the docs.",
    "deprecated": "Still works but scheduled for removal.",
    "removed": "No longer available."
  },
  "entries": [
    {
      "id": "2026-09-17-product-types-and-channel-categories",
      "date": "2026-09-17",
      "area": "Listings",
      "type": "added",
      "title": "Set a channel category once per product type, not once per product",
      "summary": "You can now build your own product type tree under Settings → Products → Product Types, put one type on each product, and map each type to a channel category once per sales channel under Publish → Categories. Every listing you publish then fills its category in automatically. Individual products can be pinned to a different category where they are the exception, and SKU.io can propose a type for a batch of untyped products for you to review.",
      "sop_impact": "If your SOP has someone pick a channel category by hand on every listing, that step goes away for any product whose type is mapped — map the type once instead, and reserve the manual pick for genuine exceptions. Note that Product type is a different field from the long-standing Type column (Standard, Kit, Bundle…), including in spreadsheet imports.",
      "docs": [
        "/guides/listings/product-types/",
        "/guides/listings/product-types/map-product-types-to-channel-categories",
        "/guides/listings/product-types/product-type-vs-type"
      ]
    },
    {
      "id": "2026-09-17-import-template-product-type-column",
      "date": "2026-09-17",
      "area": "Products",
      "type": "fixed",
      "title": "The product import template can now set a product type",
      "summary": "The downloadable product import template gained a product_type column, so you can assign product types in bulk from the template rather than building a sheet by hand. Its Field Guide now also distinguishes the type column (the product's shape — standard, kit, bundle and so on) from product_type (your own taxonomy).",
      "sop_impact": "If your import SOP told people to add a product type column by hand, or warned that the template could not set one, drop that workaround — download a fresh template instead.",
      "docs": [
        "/guides/listings/product-types/import-and-export-product-types",
        "/guides/products/importable-columns-reference"
      ]
    },
    {
      "id": "2026-09-15-get-help-and-track-support-tickets",
      "date": "2026-09-15",
      "area": "Support",
      "type": "added",
      "title": "Support moved inside SKU.io",
      "summary": "Support tickets are now raised and tracked inside SKU.io. The help icon (or N) opens a ticket from the page you're on and attaches the technical details for you; every ticket your company raises is listed under Support, where you can reply, add colleagues, and resolve. support@sku.io still works — email from the address you sign in with.",
      "sop_impact": "If your SOP sends people to the old support portal at support.sku.io, point it at Support in the left-hand menu (or the help icon / N on any page) instead; the portal address now belongs to the SKU.io support team.",
      "docs": [
        "/guides/support/get-help-and-track-support-tickets"
      ]
    },
    {
      "id": "2026-09-13-inventory-debt-documented",
      "date": "2026-09-13",
      "area": "Inventory",
      "type": "added",
      "title": "Inventory debt documented end to end",
      "summary": "New guides cover shipping an order when the stock is not there, working through the Fulfillment Debt report, settling a claim from stock that has since arrived, clearing debt no delivery will ever repay, undoing a debt shipment, and closing a month with debt outstanding — plus concept pages on what the debt costs, what it posts to your ledger, how it repays itself, and which policy applies to a given shipment. Two of the how-tos have narrated walkthroughs.",
      "sop_impact": "If you allow shipping below zero, your picking SOP can now cite a per-task guide. Two things to write in explicitly: an unmapped channel SKU may sit in **Shipped, Not on the Ledger** permanently and that is a valid end state, not a backlog item; and debt is never written off — it clears by stock arriving, by a counted adjustment, or by undoing the shipment.",
      "docs": [
        "/guides/inventory/inventory-debt",
        "/guides/inventory/inventory-debt/ship-an-order-when-the-stock-isnt-there",
        "/guides/inventory/inventory-debt/settle-a-claim-from-received-stock",
        "/guides/inventory/inventory-debt/the-fulfillment-debt-report"
      ]
    },
    {
      "id": "2026-09-13-sales-orders-debt-filter-finds-channel-shipments",
      "date": "2026-09-13",
      "area": "Sales Orders",
      "type": "fixed",
      "title": "The Fulfillment Debt order filter now finds every kind of debt",
      "summary": "Filtering sales orders on Fulfillment Debt matched only orders carrying an outstanding claim. An order whose debt is a channel shipment SKU.io could not record — the unmapped-SKU case — has no claim to match, so it was missed entirely. A tenant whose whole exposure is unmapped channel SKUs got an empty result.",
      "sop_impact": "Any saved view or procedure that used Fulfillment: Out of Sync as a workaround can move to the Fulfillment Debt filter. Out of Sync was never equivalent — an unmapped SKU deliberately does not mark its order out of sync.",
      "docs": [
        "/guides/inventory/inventory-debt/find-the-orders-that-owe-stock"
      ]
    },
    {
      "id": "2026-09-13-debt-report-filters-no-longer-hide-their-own-section",
      "date": "2026-09-13",
      "area": "Inventory",
      "type": "fixed",
      "title": "A debt filter that matches nothing no longer removes the filter",
      "summary": "On the Fulfillment Debt report, narrowing **Shipped, Not on the Ledger** to a Coverage value with no matches removed the whole card — search, filters and table — while the filter stayed in the address bar, so reloading did not bring it back. An empty result now renders as an empty table you can widen again.",
      "sop_impact": "None. Any note telling staff to edit the URL to escape this can be deleted.",
      "docs": [
        "/guides/inventory/inventory-debt/the-fulfillment-debt-report"
      ]
    },
    {
      "id": "2026-09-13-debt-report-dead-filter-options-removed",
      "date": "2026-09-13",
      "area": "Inventory",
      "type": "changed",
      "title": "Two debt filter options that could never match are gone",
      "summary": "The claims **Status** filter offered **Cancelled** and the **Source** filter offered **Repair**. Neither is a state anything produces, so both could only ever return nothing. Outstanding and Settled remain, as do Operator and Channel.",
      "sop_impact": "If a procedure told anyone to check the Cancelled filter for written-off debt, remove that step — debt is never written off. It clears by stock arriving, by a counted adjustment, or by undoing the shipment.",
      "docs": [
        "/guides/inventory/inventory-debt/claim-statuses-and-sources"
      ]
    },
    {
      "id": "2026-09-13-debt-report-mobile-fields",
      "date": "2026-09-13",
      "area": "Inventory",
      "type": "fixed",
      "title": "Debt on a phone shows real labels, and the order and warehouse",
      "summary": "On a phone the Fulfillment Debt report printed internal reason codes instead of the readable reason, and every claim card showed a dash for Order and Warehouse even though both were on screen at desktop width.",
      "sop_impact": "None.",
      "docs": [
        "/guides/inventory/inventory-debt/the-fulfillment-debt-report"
      ]
    },
    {
      "id": "2026-09-13-debt-affected-products-count",
      "date": "2026-09-13",
      "area": "Inventory",
      "type": "fixed",
      "title": "Affected Products agrees between the debt report and the dashboard",
      "summary": "The report card and the Fulfillment debt dashboard widget disagreed on how many products were affected, and both could read low: each combined the claims side and the channel side with an approximation instead of counting the distinct products across the two. They now count the union, so a product owing on both sides counts once and a product owing on only one is never dropped.",
      "sop_impact": "If you track affected-product counts over time, figures before this date may read low.",
      "docs": [
        "/guides/inventory/inventory-debt/read-the-fulfillment-debt-report"
      ]
    },
    {
      "id": "2026-09-13-settle-preview-eligibility-wording",
      "date": "2026-09-13",
      "area": "Inventory",
      "type": "fixed",
      "title": "The settle preview no longer claims a restriction that never existed",
      "summary": "The settle-from-stock preview said stock dated after the debt was incurred would never be used to repay it. That was never true and could not be — debt exists precisely because the stock had not arrived, so the stock that repays a claim is normally dated after it. Consignment stock genuinely is excluded, and still is.",
      "sop_impact": "If a procedure told staff not to expect a claim to settle from a late delivery, remove it — a later receipt is the ordinary way debt repays.",
      "docs": [
        "/guides/inventory/inventory-debt/how-debt-repays-itself"
      ]
    },
    {
      "id": "2026-09-13-close-over-generation-backlog",
      "date": "2026-09-13",
      "area": "Accounting",
      "type": "added",
      "title": "A stuck generation backlog can no longer trap a month open",
      "summary": "Ledger generation — individual entries is counted across your whole account rather than for the month you are closing, so a queue from unrelated later work could hold a month open indefinitely. It can now be closed over with a recorded reason, by anyone holding the period-override permission, exactly like outstanding inventory debt.",
      "sop_impact": "If your close SOP says this row must be green before you can close, add the override path: the month can now be signed off over it, and the reason goes on the record.",
      "docs": [
        "/guides/accounting/month-end-close/fix-a-failing-check",
        "/guides/accounting/month-end-close/blocking-checks-and-warnings"
      ]
    },
    {
      "id": "2026-09-13-close-override-visible",
      "date": "2026-09-13",
      "area": "Accounting",
      "type": "added",
      "title": "A month closed over a blocking check now says so",
      "summary": "When a blocking check is closed over, the closed month's banner now shows the check, the reason that was given, who closed it, and the exposure as it stood at that moment. Previously the reason was recorded but could not be read back anywhere.",
      "sop_impact": "Month-end review can read the override off the closed month itself — drop any step that asks somebody to remember or re-derive why a month closed with a check failing.",
      "docs": [
        "/guides/accounting/month-end-close/close-over-inventory-debt",
        "/guides/accounting/month-end-close/blocking-checks-and-warnings"
      ]
    },
    {
      "id": "2026-09-13-close-settings-screen",
      "date": "2026-09-13",
      "area": "Accounting",
      "type": "added",
      "title": "Close tolerances and your own checklist items are editable",
      "summary": "Accounting → Settings → Close is a new panel holding the three close-check tolerances (inventory vs ledger, provider documents, trial balance per account) and an editor for your own manual checklist items. All of these previously needed a support request.",
      "sop_impact": "Any SOP step that says to raise a ticket to change a close threshold or add a checklist item should now point at Accounting → Settings → Close.",
      "docs": [
        "/guides/accounting/month-end-close/close-settings-and-custom-items"
      ]
    },
    {
      "id": "2026-09-13-close-override-reachable",
      "date": "2026-09-13",
      "area": "Accounting",
      "type": "fixed",
      "title": "Closing over inventory debt is reachable again",
      "summary": "Close period stayed disabled whenever any blocking check failed, including the one check designed to be closed over — so the sign-off dialog that handles it could never be opened. Only checks that genuinely cannot be closed over disable the button now.",
      "sop_impact": "The documented close-over-debt procedure works as written; no SOP change needed if you had recorded it as blocked.",
      "docs": [
        "/guides/accounting/month-end-close/close-over-inventory-debt"
      ]
    },
    {
      "id": "2026-09-13-capture-balances-message",
      "date": "2026-09-13",
      "area": "Accounting",
      "type": "fixed",
      "title": "Capture provider balances reports success correctly",
      "summary": "A successful capture reported “No provider trial balances captured”, which read as a failure when the figures had in fact been pulled.",
      "sop_impact": "Remove any workaround step telling people to ignore that message or re-run the capture.",
      "docs": [
        "/guides/accounting/month-end-close/capture-provider-balances"
      ]
    },
    {
      "id": "2026-09-12-month-end-close-docs",
      "date": "2026-09-12",
      "area": "Accounting",
      "type": "added",
      "title": "Month-end close is documented",
      "summary": "A 27-page section covering the whole close workspace: closing a month end to end, fixing a failing check, the nine close reports, the exported pack, verifying a closed month and reopening one, plus concepts and a reference for all fourteen automated checks.",
      "sop_impact": "If your month-end SOP was written from memory or from a spreadsheet, replace its steps with the Close a month guide — the checklist, the acknowledgements and the lock behave differently from a manual close-off.",
      "docs": [
        "/guides/accounting/month-end-close",
        "/guides/accounting/month-end-close/close-a-month"
      ]
    },
    {
      "id": "2026-09-12-close-deep-links",
      "date": "2026-09-12",
      "area": "Accounting",
      "type": "fixed",
      "title": "Close checklist rows open the records they counted",
      "summary": "Each checklist row's arrow now opens exactly the records behind its number, scoped to the month. Links into the close can also name a month directly, and the debt report honours that scope.",
      "sop_impact": "An SOP that told people to open a report and filter it by hand can now link straight to the row's arrow instead.",
      "docs": [
        "/guides/accounting/month-end-close/fix-a-failing-check"
      ]
    },
    {
      "id": "2026-09-12-close-pack-content-type",
      "date": "2026-09-12",
      "area": "Accounting",
      "type": "fixed",
      "title": "The exported close pack downloads as a workbook",
      "summary": "The close pack is an Excel workbook and was being served with a CSV content type. It now downloads with the correct type, carries one timestamp format throughout, and explains a report it could not produce instead of leaving a blank sheet.",
      "sop_impact": "If a step worked around the download opening in the wrong application, that workaround can be removed.",
      "docs": [
        "/guides/accounting/month-end-close/export-the-close-pack"
      ]
    },
    {
      "id": "2026-09-11-vendor-credit-several-purchase-orders",
      "date": "2026-09-11",
      "area": "Orders",
      "type": "changed",
      "title": "A vendor credit can cover goods from several purchase orders",
      "summary": "A vendor credit may now include lines from any number of the same supplier's purchase orders — a rebate that settles goods bought on many orders is one credit, added with Add from PO → Add from Another PO or by import. The credit's Import gains PO Number, PO Line ID and Cost Impact columns, so each row names the order and line it credits and what it does to the goods.",
      "sop_impact": "If your SOP raised one vendor credit per purchase order for a rebate or price allowance, raise a single credit for the supplier and add each order with Add from PO → Add from Another PO (or upload the lines with the PO Number, SKU, Quantity, Unit Cost and Cost Impact columns).",
      "docs": [
        "/guides/orders/vendor-credits/reduce-cost-with-a-vendor-credit"
      ]
    },
    {
      "id": "2026-09-10-reduce-cost-with-a-vendor-credit",
      "date": "2026-09-10",
      "area": "Orders",
      "type": "added",
      "title": "Vendor credits can reduce the cost of goods you keep",
      "summary": "A vendor credit now states what each line does to the goods — return them, write them off, reduce their cost, or financial only — with the default set from a new Reason for credit. A price-correction credit re-prices the purchase order line's stock: units still on hand get cheaper and the already-sold share posts as a COGS true-up, previewed in a Cost Impact panel before you authorize and routed through the Cost Change Inbox.",
      "sop_impact": "If your SOP records a supplier overcharge by editing the original purchase order or bill, record a vendor credit instead: set Reason for credit to Overcharged — price correction, add the goods from the PO, enter the credit per unit, authorize, then approve the change in Inventory → Cost Changes.",
      "docs": [
        "/guides/orders/vendor-credits/reduce-cost-with-a-vendor-credit"
      ]
    },
    {
      "id": "2026-09-10-cogs-restatement-visible",
      "date": "2026-09-10",
      "area": "Inventory",
      "type": "changed",
      "title": "Cost corrections on already-sold stock now show as a restatement on the order",
      "summary": "When a supplier invoice or landed cost corrects a FIFO layer after its stock has shipped, the order's Profit tab now shows the restatement as its own figure alongside the cost the sale was booked at, and the FIFO layer breakdown reports the as-booked cost so it agrees with the COGS above it. Previously the breakdown showed the layer's current cost while COGS showed the shipment-time cost, with nothing explaining the difference.",
      "sop_impact": "If your SOP reads COGS off an order's Profit tab, note that COGS is still the cost the stock was sold at; any later correction now appears next to it as a separate Restatement figure rather than changing that number. Daily margin reporting continues to use the as-booked cost.",
      "docs": [
        "/guides/inventory/correcting-cogs"
      ]
    },
    {
      "id": "2026-09-09-channel-accounting-internal-row",
      "date": "2026-09-09",
      "area": "Accounting",
      "type": "changed",
      "title": "The internal SKU.io channel shows and edits its own accounts in Channel Accounting",
      "summary": "The SKU.io (internal) row in Accounting > Settings > Channel Accounting previously showed Default in every account column, even when internal orders were posting to an override set on the channel's own settings page. The row now shows the accounts it actually posts to, and Edit sets them like any other channel. The channel's settings page still shows the same accounts — it is one setting in two places.",
      "sop_impact": "If your SOP reads the Channel Accounting matrix to confirm where internal orders post, the SKU.io (internal) row is now trustworthy on its own — before, a Default there could hide a real override and you had to check Apps & Integrations > SKU.io > Settings to be sure. Steps that send someone to that settings page to CHANGE the accounts can now use Edit on the matrix row instead; both routes still work.",
      "docs": [
        "/guides/accounting/use-different-accounts-per-sales-channel"
      ]
    },
    {
      "id": "2026-09-08-bulk-import-recipes",
      "date": "2026-09-08",
      "area": "Manufacturing",
      "type": "added",
      "title": "Import manufacturing recipes in bulk",
      "summary": "Recipes (BOMs) can now be imported from a spreadsheet, one row per component. Products, Import, then Import Recipes. A product's default recipe can also ride along on the product import itself, and the recipe columns come back out on export.",
      "sop_impact": "If your SOP builds recipes one at a time in the recipe editor, they can now be loaded in bulk from a sheet — Products > Import > Import Recipes. Rows are grouped into a recipe by product SKU plus recipe name together, so a recipe with four components is four rows.",
      "docs": [
        "/guides/manufacturing/bulk-import-recipes"
      ]
    },
    {
      "id": "2026-09-08-saving-and-pinning-table-views",
      "date": "2026-09-08",
      "area": "Across the app",
      "type": "changed",
      "title": "Saving a table view is now one clearly-labelled button",
      "summary": "Every list's views bar now has a single, always-enabled save control whose label follows what you are doing — Save view, Save as view, or Update view. The old greyed-out Save current chip is gone, and All Views is now Views: a list that leads with saving, shows who shared each view, and keeps pinning as a star per row. Deleting a view is now limited to its owner and admins.",
      "sop_impact": "If your SOP says to click Save current or open All Views, those labels no longer exist. Save from the button at the left of the views bar, and browse or pin from Views at the right. Steps that told a non-owner to delete a shared view will no longer work — only the owner or an admin can.",
      "docs": [
        "/guides/saving-and-pinning-table-views"
      ]
    },
    {
      "id": "2026-09-07-sales-reps-single-home",
      "date": "2026-09-07",
      "area": "Contacts",
      "type": "moved",
      "title": "Sales Reps now lives in one place, under Contacts",
      "summary": "Sales Reps briefly appeared in two places — under Orders and under Contacts — listing the same records. It is now a single screen at Contacts → Sales Reps, and that one screen carries everything: the rep list, groups, and the commission reports. The old paths redirect, so existing links and bookmarks still work.",
      "sop_impact": "If your procedure says to open Sales Reps under Orders, change it to Contacts → Sales Reps. Steps that reach the commission reports or rep groups from their own menu entries should now go to that screen and pick the Groups or Reports tab.",
      "docs": [
        "/guides/contacts/sales-reps/track-sales-rep-commissions",
        "/guides/contacts/sales-reps/manage-sales-reps"
      ]
    },
    {
      "id": "2026-09-04-handle-component-shortfalls",
      "date": "2026-09-04",
      "area": "Manufacturing",
      "type": "changed",
      "title": "Manufacturing component shortfalls are tracked as backorders",
      "summary": "Confirming a manufacturing order now reserves what your stock covers and records the rest as backorder demand, instead of leaving the gap untracked. Shortfalls appear on the order's materials readiness strip, and in the Backorder Queue alongside sales-order demand.",
      "sop_impact": "Backordered component demand reduces that component's Available to Sell, so confirming a build against thin stock lowers the quantity pushed to your sales channels. If your SOP confirms manufacturing orders ahead of time, expect channel quantities for those components to drop at confirmation rather than at production start.",
      "docs": [
        "/guides/manufacturing/handle-component-shortfalls"
      ]
    },
    {
      "id": "2026-09-03-link-a-shipment-to-a-bill",
      "date": "2026-09-03",
      "area": "Orders",
      "type": "added",
      "title": "Link one inbound shipment to several bills",
      "summary": "A shipment can now be linked to more than one purchase invoice. A consolidated container that carries lines for several purchase orders is billed once per order, so link it from each order's bill; the link dialog shows where else a shipment is already billed, and each bill's Payment Schedule dates its per-shipment installments from that shipment's own dispatch and receipt. Cash-term orders now read as Invoiced on the Deposits tab once their bill is linked, instead of waiting on a trigger that never fires.",
      "sop_impact": "If your SOP creates a second shipment so a consolidated container can be billed on a second order, stop: link the existing shipment to that order's bill instead, so the goods are not counted twice. Bills entered after the goods shipped should be linked to the shipment before payment is scheduled.",
      "docs": [
        "/guides/orders/purchase-invoices/link-a-shipment-to-a-bill"
      ]
    },
    {
      "id": "2026-09-02-set-pricing-on-multiple-listings",
      "date": "2026-09-02",
      "area": "Listings",
      "type": "added",
      "title": "Set pricing on many listings at once",
      "summary": "The listings table has a Set Pricing action for a selection: pin every selected listing to one master of price and pricing tier, or clear their overrides so they inherit the channel's levels again, with a preview of every price that would change and what the next push would do with it.",
      "sop_impact": "If your SOP sets a listing's master of price or tier one listing at a time, select the listings on Inventory > Listings and use Set Pricing in the toolbar instead; review the preview before applying.",
      "docs": [
        "/guides/listings/set-pricing-on-multiple-listings"
      ]
    },
    {
      "id": "2026-09-02-price-amazon-mfn-listings-differently",
      "date": "2026-09-02",
      "area": "Integrations",
      "type": "added",
      "title": "Amazon MFN listings can follow their own pricing levels",
      "summary": "The Amazon channel's price push has a lane for merchant-fulfilled (MFN) listings: a sequence of pricing levels checked before the channel's FBA levels, falling through to them when a product has no MFN price. The channel's Pricing page now shows the fulfillment type of each listing and which lane priced it.",
      "sop_impact": "If your SOP prices MFN listings by pinning them one at a time, set the lane once instead: Apps & Integrations > Amazon > Amazon Settings > Pricing Sync > Which price to send > Price MFN listings differently. Pinned listings keep their pins.",
      "docs": [
        "/guides/integrations/price-amazon-mfn-listings-differently"
      ]
    },
    {
      "id": "2026-08-31-set-up-b2b-pricing-for-shopify",
      "date": "2026-08-31",
      "area": "Integrations",
      "type": "added",
      "title": "B2B pricing for Shopify",
      "summary": "SKU.io can now publish each wholesale buyer's own prices to their Shopify company location, resolved from the same tiers, contracts and volume breaks used for quotes and invoices. A preview must be approved before anything reaches the storefront.",
      "sop_impact": "If your SOP maintains wholesale prices by hand in Shopify, it can now stop: set the customer's tier in SKU.io and publish from Apps & Integrations > your Shopify store > B2B Pricing. Buyers you do not map keep their existing Shopify pricing.",
      "docs": [
        "/guides/integrations/set-up-b2b-pricing-for-shopify"
      ]
    },
    {
      "id": "2026-08-31-payment-terms-and-credit-limits-for-customers",
      "date": "2026-08-31",
      "area": "Contacts",
      "type": "added",
      "title": "Payment terms and credit limits now apply to customers and sales orders",
      "summary": "Payment terms used to be a purchasing-only idea. They now work on the sales side too: each term records whether it applies to purchasing, sales, or both, a customer can carry default terms, and every order they place inherits a payment due date that Receivables ages the balance against. Customers also gain a credit limit and a manual credit hold, with live exposure and available-credit figures on their overview. A new account-wide setting — Settings → General → Sales Orders → Credit limit enforcement — decides what happens when an unpaid order would take a customer past their limit: nothing (Off), a warning on the order form (Warn), or approving the order into Reserved with a credit hold until it is released or paid (Hold). Paid orders are never checked, and channel orders are checked on the same terms as manually entered ones.",
      "sop_impact": "Credit enforcement ships Off, so nothing changes until you turn it on. If you switch it to Hold, add a step to your order-release SOP for working the credit-hold queue — filter the Sales Orders list by Credit hold status. Granting or changing a credit limit or hold needs the Manage customer credit permission.",
      "docs": [
        "/guides/settings/set-up-payment-terms",
        "/guides/contacts/customers/set-payment-terms-and-credit-limit",
        "/guides/orders/sales-orders/manage-credit-holds"
      ]
    },
    {
      "id": "2026-08-31-one-credit-line-per-customer",
      "date": "2026-08-31",
      "area": "Contacts",
      "type": "changed",
      "title": "A customer now has one credit line covering both unpaid orders and on-account charges",
      "summary": "Charging a register sale to a customer's account and leaving a sales order unpaid both extend them credit, but they used to be measured separately against the same credit limit — so a customer at their limit on unpaid orders could still run an unbounded tab at the till, and a customer on credit hold could keep charging. Both now draw on one credit line: available credit is the limit minus everything owed across the two, and a credit hold refuses On Account at the register as well as holding new sales orders. It does not stop the sale — cash and card tenders are unaffected, and paying an existing balance down is always allowed. The feature is now called “Pay on account” throughout; the term “house account” has been retired.",
      "sop_impact": "Customers who have both unpaid orders and on-account charges will show less available credit than before — that is the corrected figure. If an SOP says a credit hold only affects sales orders, update it: the register now refuses On Account too. Anywhere your SOPs say “house account”, the screen now says “Pay on account”, and the Receivables sub-tab is “On-Account Charges”. Switching on Pay on account now requires the Manage customer credit permission.",
      "docs": [
        "/guides/contacts/customers/set-payment-terms-and-credit-limit",
        "/guides/orders/sales-orders/sell-at-the-point-of-sale"
      ]
    },
    {
      "id": "2026-08-26-channel-revenue-line-mapping",
      "date": "2026-08-26",
      "area": "Integrations",
      "type": "changed",
      "title": "Mapping a channel product to a revenue line no longer creates a SKU product",
      "summary": "Non-inventory items a channel sells — package protection, gift wrapping, extended warranties, service fees — can be mapped to a revenue line so their orders book as revenue instead of moving stock. Previously this quietly created a full catalog product to carry the setting, even though a revenue line never touches inventory; now no product is created at all. The setting also moved from the product to the individual channel listing, so it applies per store rather than to every channel selling that product, and it is now honoured by every connected channel rather than only Shopify and TikTok Shop.",
      "sop_impact": "If your SOP includes a clean-up step for the empty product created by a revenue mapping, delete that step — there is no longer a product to remove. If it maps a product on one store expecting every store to follow, map each store's listing separately. Existing revenue mappings were migrated and any leftover empty products removed.",
      "docs": [
        "/guides/integrations/map-a-channel-product-to-a-revenue-line"
      ]
    },
    {
      "id": "2026-08-25-pricing-level-sequences",
      "date": "2026-08-25",
      "area": "Integrations",
      "type": "added",
      "title": "Pricing level sequences and MAP floors",
      "summary": "A sales channel can now resolve prices from an ordered list of price levels instead of one: for each product the first level that has a price wins, and anything missing falls through to the next. The price floor and ceiling can also read a pricing level per product — point the floor at MAP and each product is measured against its own, and raised to it rather than refused.",
      "sop_impact": "If your SOP says to pick a single Pricing Tier for a channel, that is now an ordered list under 'Which price to send' on the Pricing Sync tab — the existing tier becomes the first entry, so nothing changes until you add a fallback. If you enforce MAP manually, set the price floor to 'Pricing level' and choose your MAP level instead.",
      "docs": [
        "/guides/integrations/sync-prices-with-sales-channels"
      ]
    },
    {
      "id": "2026-08-23-channel-price-sync",
      "date": "2026-08-23",
      "area": "Integrations",
      "type": "added",
      "title": "Push prices to your sales channels, with guardrails",
      "summary": "Every channel with a Pricing Sync tab can now send SKU.io's prices out on a schedule, or read the channel's prices back in — you choose per channel with Master of Price. Outgoing prices pass a price floor, a price ceiling and a maximum-change limit that are checked on every path, including imports and repricing rules. Each channel also gets its own Pricing page comparing your price with the channel's, listing by listing, and a run history that records what happened to every listing and why.",
      "sop_impact": "If your SOP updates marketplace prices by hand or by spreadsheet, set Master of Price and a pricing tier per channel, then set the guardrails — and run Preview changes before the first live push. The maximum-change limit will refuse a bulk price move that exceeds it, so an SOP that relies on large one-off repricing needs the limit raised for that run.",
      "docs": [
        "/guides/integrations/sync-prices-with-sales-channels"
      ]
    },
    {
      "id": "2026-08-19-supplier-certificate-register",
      "date": "2026-08-19",
      "area": "Suppliers",
      "type": "added",
      "title": "Supplier certificate register",
      "summary": "Suppliers now have a Compliance tab for NSF, GMP, TIC, insurance and audit certificates, with required-certificate types per supplier and renewal reminders at 90, 60, 30 and 15 days before expiry. A compliance indicator appears on the supplier header and as a column on the supplier list.",
      "sop_impact": "If your SOP tracked supplier certificates in a spreadsheet, upload them to the supplier's Compliance tab and set the required types there — the renewal reminders replace any manual diary step.",
      "docs": [
        "/guides/manufacturing/lot-compliance/track-supplier-certificates"
      ]
    },
    {
      "id": "2026-08-19-lot-compliance-documented",
      "date": "2026-08-19",
      "area": "Inventory",
      "type": "added",
      "title": "Lot compliance documented end to end",
      "summary": "New guides cover product quality specs, capturing certificates at receipt and on production, filing documents on a lot, entering COA results, reserve samples, and the cross-lot document archive — plus a concept page on what each COA verdict does to your stock.",
      "sop_impact": "Quality procedures can now cite a step-by-step guide per task; note that an incomplete COA does not quarantine stock, so any SOP relying on that must place a stock hold explicitly.",
      "docs": [
        "/guides/manufacturing/lot-compliance/how-the-release-gate-works",
        "/guides/manufacturing/lot-compliance/record-coa-results",
        "/guides/manufacturing/lot-compliance/compliance-reference"
      ]
    },
    {
      "id": "2026-08-19-lot-quarantine-visible",
      "date": "2026-08-19",
      "area": "Inventory",
      "type": "fixed",
      "title": "A quarantined lot now says so on its own page",
      "summary": "A lot quarantined by an out-of-spec COA showed its available quantity in green with no indication the stock was held — the quarantine was only visible from the Documents tab. The lot now carries a Quarantined chip and a banner linking to the hold.",
      "sop_impact": "No procedure change; a step that said to check the Documents tab to find out whether a lot is held can now read the lot's own page.",
      "docs": [
        "/guides/manufacturing/lot-compliance/how-the-release-gate-works"
      ]
    },
    {
      "id": "2026-08-18-apply-a-vendor-deposit-to-a-bill",
      "date": "2026-08-18",
      "area": "Vendor Deposits",
      "type": "added",
      "title": "Application settings on a vendor deposit",
      "summary": "A paid deposit's auto-apply and proportional-apply settings can now be changed at any time, from the deposit's Overview. Previously they could only be set when a deposit was created by hand, so deposits created from payment-term milestones could never use proportional apply.",
      "sop_impact": "If your SOP corrects deposit applications by hand after each partial bill, replace that step: turn on \"Apply proportionally on partial bills\" on the deposit once, and each bill takes only its share of the order automatically.",
      "docs": [
        "/guides/orders/vendor-deposits/apply-a-vendor-deposit-to-a-bill"
      ]
    },
    {
      "id": "2026-08-16-update-your-payment-method",
      "date": "2026-08-16",
      "area": "Account & Billing",
      "type": "added",
      "title": "Self-serve subscription billing",
      "summary": "Admins can now update the credit card on file, download invoices, and change billing details themselves: Settings → Account & Billing opens the secure billing portal (also reachable directly at billing.sku.io).",
      "sop_impact": "If your SOP says to email support to change the card on file, it can now say: go to Settings → Account & Billing → Open Billing Portal (admins only).",
      "docs": [
        "/guides/settings/update-your-payment-method"
      ]
    },
    {
      "id": "2026-08-13-set-up-a-multi-stage-co-manufacturing-chain",
      "date": "2026-08-13",
      "area": "Manufacturing",
      "type": "added",
      "title": "Multi-stage co-manufacturing chains with tolling rates and inter-stage freight",
      "summary": "A new Chain Builder (Manufacturing → Recipes / BOMs, Manufacturing Orders, or Contractors → New Multi-Stage Chain) models production that moves through several outside vendors: per-stage contractors with saved per-unit tolling rates or flat fees, in-house stages where you run a step yourself, planned quantities that step down by each stage's expected yield, receipts that compute the service fee from received quantity, inbound freight captured at receipt and capitalized into landed cost, and full lot genealogy across every stage.",
      "sop_impact": "If your SOP priced contractor fees by hand at receipt, the fee now computes automatically from the contractor's saved rate — enter an amount only to override. Middle-mile freight bills are entered on the stage receipt, not as standalone expenses, and downstream stage quantities are planned from expected yield rather than the full run size.",
      "docs": [
        "/guides/manufacturing/set-up-a-multi-stage-co-manufacturing-chain"
      ]
    },
    {
      "id": "2026-08-13-choose-who-calculates-tax",
      "date": "2026-08-13",
      "area": "Accounting",
      "type": "added",
      "title": "Choose who calculates tax (Xero & QuickBooks)",
      "summary": "A new Tax Treatment setting on the accounting connection decides whether SKU.io posts tax as a ledger line (US default) or your accounting system calculates it from per-line tax rates (for BAS/GST/VAT filing). Includes a tax-rate mapping table with per-rate codes.",
      "sop_impact": "If your organisation files BAS/GST/VAT, open Accounting → Settings → Tax, switch to Provider calculates tax, and map every tax rate to a tax code — documents using unmapped rates will not sync until mapped. (Tax Rates and Tax Treatment were merged into the single Tax sub-tab.)",
      "docs": [
        "/guides/accounting/choose-who-calculates-tax"
      ]
    },
    {
      "id": "2026-08-13-committed-spend-billing",
      "date": "2026-08-13",
      "area": "Purchasing",
      "type": "added",
      "title": "Committed-spend billing: bills at purchase order submission",
      "summary": "A new Bill Creation Policy can create a committed-spend bill the moment a purchase order is submitted. The bill tracks the order's unbilled amount, adjusts automatically as supplier invoices are recorded, and is removed once the order is fully billed. The settings page formerly named Invoice Reminders is now Invoicing & Bills.",
      "sop_impact": "If your SOP references Settings → Purchasing → Invoice Reminders, that page is now Invoicing & Bills; committed-spend bills appear in Purchase Invoices with a Committed badge and can be hidden with the new Committed filter.",
      "docs": [
        "/guides/orders/purchase-invoices/committed-spend-billing"
      ]
    },
    {
      "id": "2026-08-12-relink-provider-accounts",
      "date": "2026-08-12",
      "area": "Accounting",
      "type": "added",
      "title": "Re-link accounts to QuickBooks or Xero from the app",
      "summary": "Each SKU.io account's provider-account link is now editable: Change or Unlink it on the account's page (Accounting → Settings → Nominal Codes), pin a name-matched pairing with Make explicit, and see every QuickBooks account's link state in the new Mapping column. Sync errors caused by an unmapped account now offer a Map account shortcut.",
      "sop_impact": "If your SOP for a mis-mapped account says to contact support, replace that step: open the account, click Change in the provider-account card, pick the correct account, and confirm.",
      "docs": [
        "/guides/accounting/map-your-accounts-to-quickbooks",
        "/guides/accounting/fix-entries-posting-to-the-wrong-account"
      ]
    },
    {
      "id": "2026-08-12-accounting-gl-mapping-docs",
      "date": "2026-08-12",
      "area": "Accounting",
      "type": "added",
      "title": "GL account mapping, per-channel accounts, and channel grouping documented",
      "summary": "New guides cover mapping SKU.io accounts to QuickBooks Online, tracing and fixing entries that post to the wrong account, setting per-sales-channel Sales/COGS accounts in the Channel Accounting matrix, and how entries group per channel (including the internal SKU.io channel).",
      "sop_impact": "If your accounting SOP still points at a per-integration Accounting tab, per-channel accounting settings are now edited centrally under Accounting → Settings → Channel Accounting; the internal SKU.io channel's accounts are set under Apps & Integrations → SKU.io → Settings.",
      "docs": [
        "/guides/accounting/map-your-accounts-to-quickbooks",
        "/guides/accounting/fix-entries-posting-to-the-wrong-account",
        "/guides/accounting/use-different-accounts-per-sales-channel",
        "/guides/accounting/how-entries-are-grouped-by-channel"
      ]
    },
    {
      "id": "2026-08-11-third-party-vendor-deposits",
      "date": "2026-08-11",
      "area": "Vendor Deposits",
      "type": "added",
      "title": "Vendor deposits can reference another supplier's purchase order",
      "summary": "A deposit paid to a service provider (freight forwarder, customs broker, inspection agency) can now reference the purchase order it belongs to, even though that order is owned by a different supplier. The PO Deposits tab gains a Third-Party Deposits card, third-party deposits carry a 3rd party badge everywhere, and applying such a deposit suggests the referenced order's invoice first.",
      "sop_impact": "If your SOP records DDP freight or duty prepayments as unlinked deposits with a note, switch to the new Reference another supplier's PO toggle in the deposit drawer (or Add Third-Party Deposit on the PO Deposits tab) so the prepayment shows on the order.",
      "docs": [
        "/guides/orders/purchase-orders/vendor-deposits"
      ]
    },
    {
      "id": "2026-08-06-pdf-template-paper-size-picker",
      "date": "2026-08-06",
      "area": "Settings",
      "type": "added",
      "title": "Pick a template's paper size from a dropdown instead of typing it",
      "summary": "The Code Editor toolbar now carries a **Page** dropdown offering A3, A4, A5, Letter and Legal. Choosing one writes the declaration into the template for you, and the preview redraws at that sheet size with the print engine's own margins, so a page-size change is visible before you save rather than after the first print. Templates with nothing set still print A4. If a template asks for a size we can't print, it falls back to A4 and the preview's warning banner names the unusable value rather than silently substituting.",
      "sop_impact": "If your SOP tells people to hand-edit a paper-size declaration in the markup, replace that step with the **Page** dropdown — it is the same setting, without the typo risk. An SOP that says \"documents always print A4\" needs qualifying: A4 is the default, not the only option. Purchase orders are the exception and ignore the dropdown entirely; they are produced by their own renderer and always print US Letter.",
      "docs": [
        "/guides/settings/pdf-templates/page-setup-and-css-reference",
        "/guides/settings/pdf-templates/template-editor-reference"
      ]
    },
    {
      "id": "2026-08-06-pdf-template-editor-says-what-breaks",
      "date": "2026-08-06",
      "area": "Settings",
      "type": "added",
      "title": "The template editor now tells you what a change is about to break",
      "summary": "Three places used to stay quiet. The editor now shows an amber warnings bar — separate from the red errors that block a save — naming a template with no line-items block, a placeholder pointing at an image that no longer exists, images loaded from the web that get stripped when the PDF is produced, and CSS reaching out to the internet. Deleting an image from the **Assets** library now checks first and lists every template that uses it by name, type and store, with the button changing to **Delete anyway**. And a template left holding a placeholder for a deleted image now saves normally with a warning instead of being locked out of the edit that would fix it.",
      "sop_impact": "Warnings never block a save; only the red validation bar does. If your SOP treats any bar under the toolbar as \"stop\", split the two — amber is advisory. Before deleting artwork from the image library, read the list the dialog shows you and fix those templates first; re-uploading the same file afterwards does not repair them, because the replacement gets a different placeholder name.",
      "docs": [
        "/guides/settings/pdf-templates/template-editor-reference",
        "/guides/settings/pdf-templates/add-images-and-footer-banners"
      ]
    },
    {
      "id": "2026-08-06-pdf-page-setup-on-every-document",
      "date": "2026-08-06",
      "area": "Settings",
      "type": "fixed",
      "title": "Page size and footer banners now apply to every document type",
      "summary": "A template's paper size and its pinned footer banner were only being honoured on some of the paths that produce a PDF. Quotes, vendor credits and sales credits ignored both — a banner meant to repeat at the bottom of every page printed inline in the body instead, and the chosen paper size was dropped. All render paths now share the same page setup, so a footer banner pins to the bottom of every page with the **Page 1 of 3** line beneath it, whichever document produced it. The banner's band is sized from the artwork's own proportions, and the preview warns when a banner is squat enough to eat a large share of every page.",
      "sop_impact": "Credit notes and quotes will look different on their next print if their template contains a footer banner or a non-A4 paper size — the design you saved is now actually being applied. Re-proof those two types on the PDF tab before a batch goes out. Page numbers and a footer banner come as a pair: a template with no banner still gets no page numbers.",
      "docs": [
        "/guides/settings/pdf-templates/page-setup-and-css-reference",
        "/guides/settings/pdf-templates/add-images-and-footer-banners",
        "/guides/settings/pdf-templates/credit-note-template-reference"
      ]
    },
    {
      "id": "2026-08-06-pick-lists-and-packing-slips-print-what-you-configured",
      "date": "2026-08-06",
      "area": "Orders",
      "type": "fixed",
      "title": "Pick lists and packing slips now print what you configured",
      "summary": "Pick lists are now a first-class document type: they use the template you edited in **Settings → PDF Templates** rather than a legacy report, and they honour a store's own version when every order on the sheet belongs to that store. Each row also carries why the picker is being sent to that bin and how far a re-printed sheet got. On packing slips, the header's shipment row now names the shipment and its tracking number, so paperwork for box 2 is distinguishable from box 1 on a split order, and a substituted line prints the ordered product with a **Shipped as:** line underneath naming what is actually in the box.",
      "sop_impact": "A store that has its own pick list template will start printing it — check that it is the design you want before the next wave. Sheets printed for a multi-store batch still use the global template, because there is no single store to resolve. If your packing procedure relied on writing the shipment number on by hand, that step can go. Substitutions are now visible to the customer on the slip; if your process was to explain them separately, review that.",
      "docs": [
        "/guides/settings/pdf-templates/pick-list-template-reference",
        "/guides/settings/pdf-templates/packing-slip-template-reference",
        "/guides/settings/pdf-templates/how-pdf-templates-work"
      ]
    },
    {
      "id": "2026-08-02-api-403-names-its-own-cause",
      "date": "2026-08-02",
      "area": "Settings",
      "type": "added",
      "title": "A refused API request now names which of the two limits stopped it",
      "summary": "A 403 from the API used to be a dead end: the token might be missing a scope, or the person who owns the token might be missing a role permission, and the response looked the same either way — so people edited token scopes to fix problems that lived on their user account. Every refusal now carries an error field that says which one it is. `insufficient_scope` means the fix is on the token, and the response also names the exact scope to add and arrives as a standard authentication challenge; `insufficient_permission` means the token is valid and the owner's role is short, and the response lists the missing permission names. An endpoint that is closed to API tokens entirely still answers with neither. The token's Usage Log now shows the message each caller received alongside the status and endpoint, so a refusal someone else's script hit hours ago can be diagnosed without reproducing it. And the scope picker checks each scope against your own role as you choose it, flagging any your role can't fully deliver and naming the missing permissions on hover — before you ever make the call.",
      "sop_impact": "If your SOP's response to an API 403 is \"add more scopes to the token\", it is wrong roughly half the time — read the error field first, and when it says `insufficient_permission`, route the request to whoever administers roles instead of editing the token. Integrations that parse refusals can now branch on error rather than string-matching the message. When issuing a token, a warning icon in the scope picker is not a blocker and does not mean you picked the wrong scope; it means your own role can't deliver all of it, and the token will work for the rest.",
      "docs": [
        "/guides/settings/fix-a-403-from-your-api-token",
        "/guides/settings/api-scopes-reference",
        "/guides/settings/create-a-personal-access-token"
      ]
    },
    {
      "id": "2026-08-01-developer-settings-api-access",
      "date": "2026-08-01",
      "area": "Settings",
      "type": "added",
      "title": "Developer settings — API tokens, webhooks, OAuth apps, AI assistant connections, and two-factor sign-in",
      "summary": "Settings → Developer is now documented end to end. Personal access tokens are created with a name, an expiry, and a scoped permission checklist (15 groups, 30 read/write scopes, plus a read-only preset), with optional IP allowlisting and a per-minute rate cap; the value is shown exactly once. Afterwards each token has its own usage page — requests over time, status breakdown, top endpoints — and can have its scopes edited, its secret rotated in place, or be revoked outright, with warnings as expiry approaches. Outbound webhooks let one HTTPS endpoint subscribe to one event, with a signing secret, a test send, a per-subscription delivery log you can open a payload and response from, manual retry, an automatic retry schedule, and auto-disable after sustained failure. OAuth applications you publish are registered with redirect URIs and scopes and issue a copy-once client secret. An AI assistant can be connected over MCP with a single connection token that reaches the MCP endpoint only and inherits your own permissions. Two-factor sign-in now supports an authenticator app alongside emailed codes, with recovery codes, a low-code warning, and re-prompting on sensitive developer actions. Sensitive actions — creating a token with write permissions, generating an MCP connection token — now ask you to re-enter your password, which opens a 5-minute window.",
      "sop_impact": "If your SOP creates an API token, it now has two extra steps: pick a scope for every permission the integration needs (the token can no longer be all-powerful by default), and re-enter your password when the token carries write or manage permissions. The token value is displayed once and never again — an SOP that assumes it can be re-read later must paste it into a secret store at creation, or use Rotate Secret to issue a fresh one without re-pointing anything. If your SOP polls SKU.io on a timer, a webhook subscription replaces the poll. If two-factor sign-in is switched on, creating tokens and generating an AI assistant connection will also ask for a code.",
      "docs": [
        "/guides/settings/developer-settings-overview",
        "/guides/settings/create-a-personal-access-token",
        "/guides/settings/manage-personal-access-tokens",
        "/guides/settings/api-scopes-reference",
        "/guides/settings/subscribe-to-webhooks",
        "/guides/settings/monitor-webhook-deliveries",
        "/guides/settings/register-an-oauth-application",
        "/guides/settings/manage-oauth-applications",
        "/guides/settings/connect-an-ai-assistant",
        "/guides/settings/review-connected-apps",
        "/guides/settings/manage-active-sessions",
        "/guides/settings/set-up-two-factor-authentication"
      ]
    },
    {
      "id": "2026-08-01-irr-analytics-reads-honestly-everywhere",
      "date": "2026-08-01",
      "area": "Insights",
      "type": "changed",
      "title": "IRR now explains itself on every surface — and a cash-flow correctness fix",
      "summary": "The IRR Analytics leaderboard, the purchase orders list, the purchase-order IRR tab and the supplier IRR tab now explain each number where you read it. Two cash-flow corrections change some figures: a sale can no longer be dated before the stock it drew down was received (sales are floored to their FIFO layer's receipt date, and downstream transfer/kit sales dated before the PO's stock existed are dropped), which removes spurious pre-receipt inflows; and orders that legitimately sold before you paid the supplier — negative working capital — now carry a Sold on terms chip on the board, in the cash-flow proof and on the order, instead of reading as a data defect. The proof modal's active window now always renders earliest to latest, so a sold-on-terms order no longer shows a backwards date span. On the purchase orders list, an annualized return past the ±1,000%/yr display ceiling now shows as a growth multiple (10.0×/yr) rather than a flat 1000.0%, and a small dot marks a provisional figure from a lightly-sold order. Every metric label, column header, KPI card and Return advanced-filter now carries a hover explanation distinguishing the annualized rate from the money multiple, and the Product / Fully-loaded cost toggle explains both options — including why fully-loaded is unavailable on an order with no allocated freight or duty.",
      "sop_impact": "IRR and sell-through figures may move for orders whose sales previously predated receipt — re-baseline any target you set from a figure read before 2026-08-01. If your SOP treats a high IRR as suspect, note that a Sold on terms chip or a ×/yr growth multiple is now an explained, intentional reading, not an error to escalate; a dot beside an IRR means the order is too lightly sold to act on. IRR % and Sell-through % are still off by default on the purchase orders list — switch them on in the column picker.",
      "docs": [
        "/guides/insights/irr-analytics"
      ]
    },
    {
      "id": "2026-07-30-set-up-lot-and-expiration-tracking",
      "date": "2026-07-30",
      "area": "Inventory",
      "type": "added",
      "title": "Lot and expiration tracking",
      "summary": "Products can now be lot-tracked with FIFO or FEFO consumption, a default shelf life, a near-expiry alert window, a minimum-remaining-shelf-life floor, and expiry-aware availability. Batch numbers and manufacture/expiry dates are captured per lot when stock is received on a purchase order, surface on the product's Lots & Expiry tab, and roll up across the catalog on the new Insights → Inventory Expiry & Shelf-Life report. Lots now carry through manufacturing: Record Production requires a batch number for lot-tracked outputs and inherits the output's expiry date from the earliest component lot, component lots are allocated automatically by each component's own FIFO/FEFO method, and fulfillment shows the allocated lot with an override. Manufacturing → Lots → Genealogy traces a batch backward to its component lots and suppliers or forward to the customers who received it, and can run the same backward trace across a list of sales orders. A Backfill Lot Data CSV import dates stock received before tracking was switched on, without changing its cost.",
      "sop_impact": "If your SOP receives a purchase order for a perishable product, it now has a Lot / Expiry Details panel to fill in before Receive Items — the allocated quantity must match the quantity received. Enable tracking first on the product's Serial & Lot Tracking tab; there is no tenant-wide switch. If you manufacture, turn tracking on for every component before the first build — tracking is not retroactive, and an un-tracked component leaves a permanent gap in the genealogy trace. Record Production now requires a batch number on lot-tracked outputs.",
      "docs": [
        "/guides/inventory/set-up-lot-and-expiration-tracking"
      ]
    },
    {
      "id": "2026-07-29-review-channel-content-changes",
      "date": "2026-07-29",
      "area": "Content Sync",
      "type": "added",
      "title": "Content Sync: keep your catalog in sync with channel edits",
      "summary": "New Content Sync area (PIM → Content Sync). Edits made to product content on a sales channel are detected and queued as reviewable changes across eight governed fields — Barcode and MPN (Identity), Title, Brand and Attributes (Descriptive), Images (Media), Weight and Dimensions (Physical) — each shown as a catalog-vs-channel diff you can apply or ignore. A channel-side bulk edit rolls up into one row you can clear with Approve all, and Title is flagged risky so it is always held out of one-click bulk actions. Ownership is set per field group on the channel's Settings → Content Sync tab (Catalog, Channel, or Two-way, with optional auto-apply), and any single listing can override those rules in place without changing the channel. When both sides edit a two-way field you get a conflict to resolve — keep yours, take theirs, or keep both. Every outcome lands in a per-listing change history you can filter, compare two versions from, export as CSV, and roll back. Enabling content sync baselines current channel content, so only later edits are flagged — when you want the differences that already existed, run a **Full comparison** on demand (the arrow beside Reconcile, in the inbox or the review drawer) and every governed field is diffed against the catalog regardless of the baseline. A new governance gate can block publishing to a channel until the fields that channel requires are filled in.",
      "sop_impact": "If your SOP re-keys channel edits into the catalog by hand, replace that step with reviewing and applying the change from PIM → Content Sync. Enable content sync per channel first under the channel's Settings → Content Sync tab, and set field-group ownership there — enabling it baselines current channel content, so only edits made after you turn it on are flagged. If your SOP includes a one-off catalog clean-up after enabling, use **Reconcile → Full comparison** instead of a plain reconcile — a normal re-check will not surface differences that pre-date the baseline. If an SOP relies on publishing a product before its content is complete, check whether that channel's governance gate is on: publishing now fails with the missing fields named.",
      "docs": [
        "/guides/inventory/review-channel-content-changes"
      ]
    },
    {
      "id": "2026-07-28-add-landed-costs-after-receipt",
      "date": "2026-07-28",
      "area": "Inventory Costing",
      "type": "fixed",
      "title": "Landed cost visibility: PO cost popover now complete, revalued layers flagged",
      "summary": "The PO Lines cost-breakdown popover now includes landed cost invoices entered on inbound shipments (previously only PO-entered bills were counted, understating Avg Cost). FIFO layer pages now flag when a layer has been revalued since receipt, with a link to its revaluation history. A new guide covers adding landed costs after receipt and where the impact appears.",
      "sop_impact": "If your SOP verifies landed costs via the PO Lines cost popover, its Avg Cost now matches the FIFO layer exactly; the layer page's Unit Cost at Origin is labeled as a historical snapshot with a revaluation-history link.",
      "docs": [
        "/guides/inventory/add-landed-costs-after-receipt"
      ]
    },
    {
      "id": "2026-07-28-substitute-products-on-sales-orders",
      "date": "2026-07-28",
      "area": "Sales Orders",
      "type": "added",
      "title": "Product substitutions — swap out-of-stock lines to an equivalent SKU",
      "summary": "Link equivalent SKUs with per-rule automation (manual / if out of stock / always), swap stalled order lines to a stocked substitute in one click, and release backlogs in bulk. The packing slip keeps the ordered SKU; the pick list shows the substitute with the original in brackets.",
      "sop_impact": "If your SOP handles out-of-stock orders by editing lines or adjusting stock, replace that step with a substitution rule plus the Swap resolvable filter on Sales Orders (bulk: More → Swap & Release).",
      "docs": [
        "/guides/orders/substitute-products-on-sales-orders"
      ]
    },
    {
      "id": "2026-07-27-po-reminder-order-status",
      "date": "2026-07-27",
      "area": "Workflows",
      "type": "changed",
      "title": "Purchase-order reminders now skip closed POs",
      "summary": "The Find Purchase Orders workflow node has a new Order status setting (Draft, Open, Closed, or Any status), defaulting to Draft + Open. Previously the node matched on submission status only. Because closing a purchase order does not change its submission status, a PO closed while still unsubmitted stayed unsubmitted forever and reappeared in every scheduled reminder. Existing workflows pick up the new default automatically — no edit needed.",
      "sop_impact": "Scheduled PO-reminder emails will list fewer purchase orders than before: closed ones now drop off, so an SOP that reconciles the email against a count should expect the lower number. If your procedure relies on seeing closed POs, open the workflow, click the Find Purchase Orders step, and set Order status to Any status.",
      "docs": [
        "/guides/workflows/get-an-email-reminder-about-unsubmitted-purchase-orders"
      ]
    },
    {
      "id": "2026-07-24-segment-profitability-by-customer-tag",
      "date": "2026-07-24",
      "area": "Insights",
      "type": "added",
      "title": "Segment the Profitability report by customer tag",
      "summary": "You can now tag customers — by hand on their detail page, or automatically from synced Shopify orders — and segment the Profitability report by those tags. Each customer tag becomes a revenue, cost, and profit segment in both the Trend and Cost Breakdown views, with drill-down to the underlying orders.",
      "sop_impact": "To analyze margin by customer segment, go to Insights → Reports → Profitability and set Group By to Customer Tags. Tag customers on their detail page (Contacts → Customers → the Tags card); Shopify customer tags also sync in automatically. Note: because a customer can have several tags, per-tag rows can total more than the grand total, which still counts each order once.",
      "docs": [
        "/guides/insights/segment-profitability-by-customer-tag",
        "/guides/contacts/customers/tag-a-customer",
        "/concepts/customer-tags-from-shopify"
      ]
    },
    {
      "id": "2026-07-24-create-a-supplier-pickup-order",
      "date": "2026-07-24",
      "area": "Orders",
      "type": "added",
      "title": "Supplier pickup (drop-ship will-call) orders",
      "summary": "You can now run drop-ship orders that a distributor collects directly from your supplier: a pickup shipping method turns a drop-ship line into a supplier pickup, fulfilled with Mark as Picked Up (no tracking), with a PDF pickup authorization and a Supplier Pickup Orders report.",
      "sop_impact": "If an SOP fulfills a drop-ship line by entering a tracking number, orders set to a pickup shipping method are now completed with Mark as Picked Up instead — and appear under Insights → Reports → Supplier Pickup Orders.",
      "docs": [
        "/guides/orders/create-a-supplier-pickup-order"
      ]
    },
    {
      "id": "2026-07-23-customize-your-dashboard",
      "date": "2026-07-23",
      "area": "Dashboard",
      "type": "added",
      "title": "Customizable dashboards",
      "summary": "Add any of 100+ widgets to your dashboard with a live preview, arrange and resize them, and keep multiple named dashboards you can switch between.",
      "sop_impact": "Dashboards are now personal and customizable: if an SOP assumes a fixed set of dashboard cards, note users can add/remove widgets and keep multiple dashboards via Dashboard → Customize.",
      "docs": [
        "/guides/dashboard/customize-your-dashboard"
      ]
    },
    {
      "id": "2026-07-23-airtable-integration",
      "date": "2026-07-23",
      "area": "Integrations",
      "type": "added",
      "title": "Airtable integration (two-way sync)",
      "summary": "Connect an Airtable account and sync SKU.io data both ways with no middleware. Push products, inventory, orders, purchase orders, and suppliers into Airtable on a schedule or in real time; provision a ready-made Ops Hub base in one click; and review edits made in Airtable before they update your catalog. Includes computed product-analytics columns, a monthly API-usage cap, sync-health alerts, and an \"Airtable: Write Rows\" automation node.",
      "sop_impact": "If your process exports SKU.io data to CSV or uses middleware to reach Airtable, you can now connect Airtable directly under Apps & Integrations → Airtable and map datasets instead.",
      "docs": [
        "/guides/integrations/airtable/"
      ]
    },
    {
      "id": "2026-07-22-trend-aware-forecasting",
      "date": "2026-07-22",
      "area": "Demand Planning",
      "type": "added",
      "title": "Trend-aware baselines and promotion lift",
      "summary": "Demand Planning can now build a forecast from a damped growth trend (or a recency-weighted average) instead of only a flat mean, show each recommendation's baseline decomposition, and re-apply a measured promotion as a multiplier that scales with your volume.",
      "sop_impact": "If your reorder SOP assumes a flat-average forecast, note the new Baseline method control in Demand Planning → Configuration; choosing Damped trend changes the recommended quantities for trending products.",
      "docs": [
        "/guides/inventory/trend-aware-forecasting"
      ]
    },
    {
      "id": "2026-07-20-workflows-scheduled-po-reminder",
      "date": "2026-07-20",
      "area": "Workflows",
      "type": "added",
      "title": "Build workflows from scratch on a schedule + unsubmitted-PO email reminders",
      "summary": "Workflows can now run on a recurring Schedule (hourly/daily/weekly/monthly, in your timezone) and query your purchase orders with a new Find Purchase Orders node. Together they power a build-from-scratch email reminder about POs sitting Unsubmitted. Two how-tos document the general canvas authoring and the reminder recipe (previously only templates were documented).",
      "sop_impact": "If your SOP for chasing unsubmitted purchase orders relied on someone manually checking the list, you can replace it with a scheduled workflow (Schedule -> Find Purchase Orders -> IF count>0 -> Send Email) that emails a summary on your chosen cadence. Building a workflow from scratch (not just from a template) is now a documented, supported path.",
      "docs": [
        "/guides/workflows/build-a-workflow-from-scratch",
        "/guides/workflows/get-an-email-reminder-about-unsubmitted-purchase-orders"
      ]
    },
    {
      "id": "2026-07-14-suppliers-tax-currency-bulk",
      "date": "2026-07-14",
      "area": "Suppliers",
      "type": "added",
      "title": "Bulk-manage supplier tax rate (GST) & currency",
      "summary": "A supplier's default tax rate and default pricing tier (which sets its currency) are now available in the Suppliers list as toggleable, inline-editable columns, in the list export, and in the supplier importer.",
      "sop_impact": "If your SOP for maintaining supplier GST/currency said it could only be done one supplier at a time on the detail page, update it: you can now export suppliers, edit the Default Tax Rate / Default Pricing Tier columns, and re-import; or inline-edit them in the list grid view.",
      "docs": [
        "/guides/contacts/suppliers/importable-columns-reference",
        "/guides/contacts/suppliers/export-suppliers",
        "/guides/contacts/suppliers/list-columns-reference"
      ]
    },
    {
      "id": "2026-07-13-po-internal-notes-so-custom-fields-import",
      "date": "2026-07-13",
      "area": "Orders",
      "type": "fixed",
      "title": "Internal Notes (PO) and custom fields (SO) now save on spreadsheet import",
      "summary": "The purchase-order importer now saves the Internal Notes column, and the sales-order importer now saves custom-field columns. Previously the mapper offered these columns and showed them in the preview, but they were silently dropped on import.",
      "sop_impact": "If your import SOP avoided mapping Internal Notes (PO) or custom fields (SO) because they didn't stick, you can now include them — they persist.",
      "docs": [
        "/guides/orders/purchase-orders/import-columns-reference",
        "/guides/orders/sales-orders/importable-columns-reference"
      ]
    },
    {
      "id": "2026-07-13-so-po-import-export-column-references",
      "date": "2026-07-13",
      "area": "Orders",
      "type": "added",
      "title": "Column-by-column import & export references for sales & purchase orders",
      "summary": "Every importable and exportable column for sales orders and purchase orders is now documented with its type, whether it's required, accepted values, and behaviour — including the export-to-re-import round-trip.",
      "sop_impact": "Use these references to build or verify your bulk order import/export SOPs against the exact column list rather than trial and error.",
      "docs": [
        "/guides/orders/sales-orders/importable-columns-reference",
        "/guides/orders/sales-orders/export-columns-reference",
        "/guides/orders/purchase-orders/import-columns-reference",
        "/guides/orders/purchase-orders/export-columns-reference"
      ]
    },
    {
      "id": "2026-07-13-product-pricing-via-import",
      "date": "2026-07-13",
      "area": "Products",
      "type": "changed",
      "title": "Set per-tier selling prices via the products spreadsheet import",
      "summary": "The Products list Import now writes per-tier selling prices from a `Price: <tier>` column (for example, `Price: Retail`). Previously it only wrote cost, and selling prices had to be set another way.",
      "sop_impact": "If your product-pricing SOP routed bulk price changes through the generic Data Imports tool or Bulk-edit as a workaround, you can now set selling prices directly in the Products import file with a `Price: <tier>` column.",
      "docs": [
        "/guides/products/import-products#set-selling-prices"
      ]
    },
    {
      "id": "2026-07-06-fulfillments-nav-consolidated",
      "date": "2026-07-06",
      "area": "Fulfillments",
      "type": "moved",
      "title": "Fulfillments combined into one sidebar item with tabs",
      "summary": "The separate Fulfillments sidebar entries were combined into a single sidebar item that uses horizontal tabs.",
      "sop_impact": "If an SOP says to click a specific Fulfillments item in the sidebar, update it: open the single Fulfillments item, then choose the relevant tab.",
      "docs": [
        "/guides/orders"
      ]
    }
  ]
}
