Skip to content

Releases: TheManoeuvre/StockSmith-App

StockSmith v0.22.0

Choose a tag to compare

@github-actions github-actions released this 12 Oct 12:33
6772f3c

Added

  • Switch a store off for a product. A product can now be turned off for Etsy or eBay.
    Off drops that store's panels on the product page, its variant-limit warnings, its
    compatibility-scan entries and its bulk SKU checks, which also saves marketplace API calls;
    a product with a live listing stays on. Each store has a "turn on for new products by
    default" setting and a one-off all-on/all-off prompt on its settings page (reconnecting the
    same shop never asks again). Also new: sold_on_etsy/sold_on_ebay CSV columns, a "Sold
    on" filter on the products list, store chips on the new-product form, and a "Don't sell
    this on eBay" action in the variant-limit popup. The "shipping profile missing" alert now
    only counts products that are on for that store.
  • eBay refunds are recorded. A refunded eBay order used to count the returned money as
    profit and never showed a Refunded figure. Refunds are now read from eBay and shown on the
    order, and a warning appears if a refund exceeds what the buyer paid.
  • Second Etsy parcels are picked up. When Etsy lists more than one shipment on an order,
    each extra one now appears as a replacement parcel awaiting review, instead of never
    coming back for assignment. Completing a label-less placeholder parcel retires it and
    carries its tracking over.
  • Personalised order lines are flagged. A small star badge on an orders-list line shows
    that the buyer supplied personalisation; hover it to read the text.

Changed

  • Orders list no longer shows a margin for orders that haven't shipped. Before shipping,
    postage cost is only the shipping profile's estimate (or missing), so the margin read as
    more certain than it was and was often overstated. Those rows now say "Before shipping"
    under the net profit figure; the margin appears once the order ships.
  • Hand-edited variant BOM lines survive bulk amend. Lines you set in a variant's own BOM
    editor are now left alone by default; the preview lists what was skipped, and a checkbox
    ("Also overwrite lines set by hand") includes them. Edits made before this release aren't
    protected, because their origin wasn't recorded.
  • Same-coloured materials are easier to tell apart. The variant colour picker shows the
    full material name where two materials of a type share a colour (previously ticking the
    second silently replaced the first), and the Materials page flags such pairs with a
    "Merge into first" shortcut.
  • Update dialog is shorter. It lists one line per feature and has a "View on GitHub"
    button, so a long release no longer pushes the Yes/No buttons out of reach.

Fixed

  • Reconnecting a store keeps auto-sync on. Disconnecting and reconnecting the same shop
    used to switch auto-sync off silently. Connecting a different shop, or switching Square
    location, still starts with it off.
  • Late daily summary and backups. The scheduler misread its last-run time as local time,
    so the daily summary and scheduled backups could go out hours late.

StockSmith v0.21.0

Choose a tag to compare

@github-actions github-actions released this 30 Sep 06:37
1a77aab

Added

  • Connect a Square store and sync its orders. Square joins Etsy and eBay as a
    supported platform. Since Square has no OAuth app review flow worth going through for a
    single-seller install, connecting is a pasted personal access token plus a location
    picker (Square orders are scoped to a location) — reachable from the Stores hub or the
    store's own page, with a card to change location later without re-pasting the token.
    Orders sync on the same schedule as Etsy/eBay, with their own API usage budget and
    health/usage alerts. Square items are treated as StockSmith catalogue products, so
    there's no listing push, shipping-profile linking, or OAuth section on its store page.
    Orders also gain a Collect/Delivery tag next to the platform badge, driven by a new
    shared due-date rule (collect-by for a collect order, ship-by otherwise) used on both
    the orders list and detail view.
  • Margin per variant, and a price range for multi-variant products. A variable-pricing
    group now shows its own margin summary, collapsing to a low-high range when variants in
    the group differ on price or cost. The price-history table's latest row also falls back
    to today's live variant sale price/margin range instead of a permanent "-" once a
    product is priced by variant.
  • Alert when a marketplace-reported cancellation is awaiting review. A marketplace
    cancelling an order doesn't release its reserved stock until a person confirms a
    scrap/return-to-stock disposition — until now that pending state was only visible on the
    order's own detail page. A new notification (in-app and Pushover) fires the moment a
    sync first flags the order, and the order list now surfaces "Cancellation pending
    review" in the Fulfilment column with a Review action straight into the order detail.

Changed

  • Daily and weekly order summaries. Revenue and net profit figures are now prefixed
    with the shop's default currency symbol instead of a bare number, and a new summary
    auto-marks the previous one read so a superseded period doesn't linger in the unread
    badge. The in-app notification list now only keeps the last 2 days of history, except
    unread notifications, which never age out.

Fixed

  • Packaged backend 500 on image-from-URL import. Importing a product image from a URL,
    or anything else that generates a folder name from a title, crashed with a 500 in the
    installed app (never in dev). Fixed by bundling the transliteration module and data file
    it depends on into the packaged backend.
  • cogs_pending false positive on a line a substitution left at 0 quantity. A
    whole-line variant substitution moves all quantity off the original order line onto a
    new one and leaves the original in place by design — that line was never going to be
    allocated or costed, so its missing cost snapshot no longer counts as a gap.

StockSmith v0.20.0

Choose a tag to compare

@github-actions github-actions released this 22 Sep 12:07
8e8cbaa

Added

  • Rename and merge variant attribute values. The Variants tab has a new "Attribute
    values" panel listing each attribute's values. Rename one ("4 Stud Standard" → "4 Stud
    Std") and every variant carrying it is respelled, disabled ones included; no SKU
    changes, and the value keeps its SKU code so later generates stay in step. Merge one
    into another ("4 Stud Standard" → "4 Stud") and each variant is folded into the one
    that differs only by that value: stock is moved with a pair of stock adjustments so
    both histories reconcile, open order lines follow (as substitutions, so each can be
    undone), and the merged-away variant is disabled with its SKU remembered so a
    marketplace order still quoting it lands on the survivor. Where the two variants'
    BOM or kitting overrides differ, both are shown and you pick which survives. A
    variant that is live on Etsy or eBay asks first, then has its variation set to 0.
    Attribute names can now be renamed after variants exist, too.
  • Merge two variants directly. "Merge into…" on any variant row does the same for
    a pair that isn't an attribute-value duplicate — one created twice by hand, say.
  • Merge two materials. "Merge into…" on a material's Details tab folds a duplicate
    (a CSV import spelling "Brick 2x4 Red" and "2x4 Brick Red") into one: every BOM,
    kitting list, purchase, adjustment, substitute rule and stock-take line is repointed,
    and where a product already had a line for both the quantities are added together.
    Stock and average cost come out of replaying both purchase histories, so the cost is
    a true weighted average rather than a guess. Renaming a material to a name that's
    taken now offers the merge instead of failing. Materials on an open stock take, or
    counted in different units, can't be merged until that's resolved.
  • A build can draw a short line from a fallback material. Recording a build used to
    fail with "Insufficient material stock" even when a substitute was sitting on the shelf
    — the pooled capacity figures counted that substitute as sellable, but nothing in the
    build path could actually use it. The Record-a-build form now works out what each line
    will draw against what's on hand and offers that material's active fallbacks for any
    line that comes up short. Picking one doesn't go through on Record alone: a confirmation
    spells out "28 g of PLA Ivory in place of PETG White" first, and the adjustment, the
    cost and the build history all name the material that actually left the shelf.

Changed

  • Bulk BOM amend leaves blank fields alone. Amending the BOM across a set of variants
    — "change the material for every White variant" — used to read a blank quantity or
    material as "back to the base BOM", so it flattened each size's own quantity override on
    the way past. A blank side now keeps whatever that variant already had. Going back to
    base is still available, as an explicit "Reset to base" choice rather than a side
    effect, and the modal no longer prefills from the first matching variant.
  • The fallback chip on the BOM override editor is gone. It recorded that a substitute
    had been used without moving any stock, which was the only thing you could do about a
    short line until the build form learned to draw from a fallback properly. The
    dashboard's pack-time kitting shortfalls still suggest substitutes.
  • The product Stock tab no longer repeats itself. Its Free stock / Reserved /
    Buildable rows said the same thing as the cards already shown above the tabs.

Fixed

  • A retired material showed up as a second colour of the same name. The colour picker
    on a product's Variants tab listed every material of that type, deactivated ones
    included — so a PETG product offered "White" twice, once for the spool still in use and
    once for one long since retired, with no way to tell them apart. Retired materials are
    no longer offered; one already chosen by an existing rule still is, so nothing set up
    earlier changes.
  • "One listing isn't receiving stock updates" on a product whose Stores tab showed
    everything synced.
    A product linked to its listing before it was given variants
    kept that old product-level link. It was never shown again, but the hourly check kept
    pushing the parent SKU to a listing that only carries the variant SKUs, failing every
    time and lighting the sidebar warning. Links for units a product no longer sells as
    (the bare product once it has variants, a variant once it's deactivated) are now
    ignored by every stock push, cleared by the next Test Sync, and never counted as
    failing. Also applies to eBay.
  • Etsy sync checks only saw active listings. A listing that had sold out, been
    deactivated, expired, or was created by StockSmith as a draft came back as "Not found"
    on Test Etsy Sync — which quietly unlinked it, so stock pushes stopped reaching it once
    it was restocked or relisted. The check now looks at every listing state, and reports
    such listings as "listing not active" instead. Unlinked listings in Tools sees them too.
  • Etsy stock pushes to a listing with per-variation processing profiles. The write
    now sends the listing's processing-profile-by-variation setting back exactly as read,
    instead of dropping it.
  • Creating an Etsy draft listing for a product with many variants failed outright. The
    draft's placeholder quantity was the sum of every variant's stock, and Etsy caps a
    quantity at 999 per offering — so a 392-variant product holding 15 each was refused
    before anything existed on Etsy. Quantities are now clamped to that cap on draft
    creation and on every later stock push, so a single variant with more than 999 on the
    shelf can't trip the same error later on.

StockSmith v0.19.0

Choose a tag to compare

@github-actions github-actions released this 20 Sep 21:33
94d0020

Added

  • Stock take sheets now mark the quick ones. A line is highlighted when nothing has
    moved that item since the last time you counted it — no adjustment, no delivery, no
    build, no order — so it should already be at the figure on the sheet and only needs a
    glance to confirm. Items that have moved, and items never counted before, are left
    plain: those are the ones worth your time. Two movements that cancel out still count as
    movement, and existing open takes won't show the marks — start a new take to see them.
    The exported CSV carries the same information in a no_movement_since column, so a
    printed sheet shows it too.

Changed

  • "Set exact amount" is now called "Stock count". On both the material and product
    stock forms, and in their history, where a set now reads "Counted 53" rather than "Set
    to 53". Nothing about it has changed — entering an exact figure has always recorded a
    physical count, dated the item and stopped it showing as due — but the old wording made
    it sound like a database edit rather than the count it is. It is also what decides
    whether a stock take line shows as low risk, which is worth being able to see.

Fixed

  • The eBay postage policy picker no longer sends you round in circles. Linking a
    shipping profile to an eBay postage policy asked you to reconnect eBay to grant the
    permission, but reconnecting never granted it, because StockSmith wasn't asking eBay for
    it. It now does. Existing eBay connections need reconnecting once (Settings →
    Stores & sync) before the picker will list your policies; order sync and listing pushes
    are unaffected until you do.

StockSmith v0.18.1

Choose a tag to compare

@github-actions github-actions released this 19 Sep 22:14
e79cedd

Fixed

  • eBay order sync stopped dead on a bulk label purchase. When several labels are
    bought in one go, eBay reports that single purchase against every order in the batch.
    The sync recorded it on the first order and then failed with a database error on the
    next one — and because a failed sync never moves on, it failed the same way on every
    run after that. The other orders in the batch are now skipped for that label (with a
    note in the log) and the sync carries on. If your eBay sync has shown "Last order sync
    failed: UNIQUE constraint failed" since 19 September, this is the fix.
  • Deleting a replacement parcel no longer un-spends its shipping label. The label
    the sync had matched to the parcel stayed on the order but silently dropped out of net
    profit. Resend labels that aren't attached to a parcel now count under "Replacement
    postage" until you attach them to one.
  • Etsy shipping labels can no longer be charged to the wrong order. A ledger entry
    that only named the label itself (not the receipt) was being claimed by every order
    shipped in the following month. Such an entry is now left alone; only entries that
    reference the receipt or one of its transactions are recorded.
  • Deleting an order that still has replacement parcels is refused until the parcels
    are deleted first, so the stock those parcels took is put back rather than lost.

StockSmith v0.18.0

Choose a tag to compare

@github-actions github-actions released this 19 Sep 21:35
964115f

Added

  • Search box on the Orders page. Type an order number (with or without the "#"), part
    of a note, a product or variant name, or a SKU — including the raw SKU on a marketplace
    line that hasn't been mapped yet — and the list narrows to matching orders. Dashes,
    underscores, dots and slashes are ignored on both sides, so "hexrd" finds "HEX-RD".
  • A warning before a variant change takes a product past a store's limits. Adding a
    variation attribute, generating variants, adding one by hand or reactivating a disabled
    one used to go through silently even when the result was more attributes or more
    variations than Etsy or eBay accept; the compatibility panel reported it afterwards and
    the push refused the listing later. Each of those actions now says what it would produce
    and which store objects ("This will result in 3 variation attributes; eBay supports only
    2") and asks before continuing.

Changed

  • Listing profiles no longer have a default — each product picks its own. A profile
    decides the category, processing profile and policies a listing goes out with, and
    those are the parts hardest to correct once a listing exists, so they should be a
    choice made for that product rather than whichever profile happened to carry the
    "default" flag. The "Use this profile by default" checkbox is gone from Settings, the
    product's listing setup asks you to choose a profile, and once chosen it shows what that
    profile commits the listing to — category, processing, who made it, when, returns — by
    name. Products that were relying on the old default are pointed at it explicitly when
    the app updates, so nothing changes for them until you choose otherwise.
  • Etsy's variation limits now default to 3 attributes and 400 variations, matching
    Etsy's third-variation support. A product with three attributes can be drafted to Etsy,
    and pushes to a three-variation listing send what Etsy requires to accept them. The 400
    figure is Etsy's cap once every property carries a SKU, which is how StockSmith lists;
    the limits editor explains this in a tooltip. An override you have set is kept.
  • The stock breakdown table on a product's Stores tab (Reserved / Max from free stock /
    Quantity that would push) is gone: it repeated the On hand, Buildable and Sellable cards
    shown above the tabs.

Fixed

  • eBay labels bought in bulk no longer charge one order for the whole batch. Buying
    several labels in one go from Seller Hub makes eBay book a single transaction for the
    batch total, and it reports that transaction against one of the orders in it — so that
    order's postage came through as the whole batch (£21.90 for a £3.65 label, on one
    order). Such a label is now recorded as "Not itemised" on the Shipping tab: it still
    counts as the original shipment, so a later label is correctly treated as a resend, but
    net profit keeps the shipping profile's estimate for it since eBay doesn't say what the
    order's own share cost. An order already carrying a batch total is corrected the next
    time its labels are synced (scripts/backfill_postage_charges.py --all forces this).
  • Etsy listings that can't take a stock update are now flagged instead of retried
    forever.
    If an Etsy listing has several variations but its quantity isn't attached to
    one of them, every variation has to share a single number — so there is no stock update
    StockSmith can send it, and Etsy rejects every attempt. Until now those listings were
    treated as ordinary failures: retried on every hourly check, eating into the day's Etsy
    API allowance, and sitting permanently in the "listings not updating" count with Etsy's
    own unexplained error message attached. StockSmith now recognises the setup before it
    sends anything, tells you which listing needs changing and what to change ("tick
    quantity for the variation that should carry stock"), and stops retrying — it looks
    again once a week, or immediately if you use Push corrections after fixing the listing.
    These listings are counted and shown separately from genuine push failures, in amber
    rather than red, because nothing is broken: they're waiting on a change only you can
    make on Etsy.
  • Saving a variable-pricing group with hundreds of variants no longer fails with
    "Something went wrong."
    Each variant was saved with its own request, all at once, and a
    product with a few hundred variants exhausted the backend's database connections part way
    through, leaving the group half-updated. The group is now saved in one request. When a
    request does fail on the way to the backend, the error banner shows the actual reason
    rather than a generic message.
  • Unsaved edits in a product's Etsy or eBay listing setup are no longer lost silently.
    The profile, title and description on the Stores tab weren't part of the product's
    unsaved-changes tracking, so the footer said "No changes", and closing the panel,
    hiding the setup or navigating away dropped whatever had been typed. They now save with
    the footer's Save button like the rest of the product, and closing or hiding over unsaved
    edits asks first.

StockSmith v0.17.0

Choose a tag to compare

@github-actions github-actions released this 18 Sep 15:31
7e5caaf

Added

  • Replacement parcels. When something goes wrong with an order that has already
    shipped — a faulty item, something missing from the box, a parcel lost in the post — the
    second parcel you send can now be recorded against the order: what went in it (products
    and packaging, both deducted from stock the moment you save), why it went out, what the
    postage cost, and its tracking number. Replacement parcels sit in their own amber block
    on the order's Fulfilment tab, separate from the original order lines, and their postage
    and cost of goods are deducted from the order's net profit. Deleting a parcel puts
    everything back into stock.

  • Marketplace shipping labels are picked up automatically. Every label bought through
    eBay or Etsy against an order is now recorded from the marketplace's own financials. The
    first label's real cost replaces the shipping profile's estimate in net profit (the
    Shipping tab shows both). A second label means a replacement went out: StockSmith
    creates the parcel with the label's cost, raises an alert ("Replacement parcel detected —
    needs completing", on by default under Settings → Notifications), lists the order under
    Awaiting shipment again until you've said what was sent, and the alert opens the order
    straight onto its Fulfilment tab. Etsy's ledger doesn't document how labels post, so
    Etsy detection is best-effort for now; a diagnostic line in the backend log records any
    ledger entry it couldn't classify.

  • A one-off scripts/backfill_postage_charges.py fetches labels for orders that shipped
    before this release (dry run by default).

  • Generating variants now asks what to do when two attributes land on the same
    material.
    A two-tone product whose Primary Colour and Accent Colour both pick "Apple"
    used to be refused outright ("a variant can only have one BOM line per material") with
    nothing to adjust, because the overlap is inherent to the combination. Generation now
    stops and lists every affected combination, and you choose: leave them out, or keep them.
    Kept variants carry both lines and their buildable quantity is worked out from the
    material's combined usage per unit. A substitution that landed on the product's own
    base line used to slip through silently and overstate how many could be built; it is
    now handled the same way.

Changed

  • Net profit on marketplace orders now uses the actual postage label cost where one has
    been synced, rather than the shipping profile's estimate. Orders synced before this
    release keep using the estimate until the backfill script is run.
  • Settings → Stores & sync is now a hub with a page per store. The hub shows one card
    per marketplace with the same facts in the same places — connection status, when it last
    synced, what needs attention, and Sync now / Configure / Disconnect — above the
    background-syncing and field-mapping settings. Configure opens a single-column page for
    that store, ordered by how often each part is needed: health and connection at the top,
    then Order sync (auto-sync, interval and start date, saved together with one button, with
    the run log full-width underneath), Stock pushes (every failing listing named with its
    actual error, plus the API budget), Listing profiles, Tools, and finally the developer-app
    credentials, collapsed. The old two-column layout never lined up between Etsy and eBay,
    and the sync log always scrolled sideways.
  • The sidebar Orders badge is now the number of orders awaiting shipment — the same
    figure as the Orders page's "Awaiting Shipment" tab. It used to count only lines short on
    stock or packaging, so it could read 1 while the tab read 2 whenever an order was waiting
    for another reason, such as an eBay line needing its SKU mapped. It also updates straight
    away after cancelling an order, running a store sync, or adding a manual order.
  • The Orders page refreshes itself when a background sync finishes. Orders imported by
    the scheduled marketplace sync used to sit unseen until you left the page and came back.
  • In a product's Variants tab, the colour checkboxes and material pickers for a BOM rule are
    now listed A→Z by the name shown, rather than by the material's internal name.

Fixed

  • "Write SKUs & link" on an existing Etsy listing failed with "sku must be consistent
    across all products".
    Any listing that had never carried SKUs was affected: Etsy was
    told the SKU did not vary by any option while being sent a different SKU per colour.
    StockSmith now tells Etsy which option the SKUs vary by, worked out from the SKUs
    themselves.
  • The Stores & sync page could show everything green while the sidebar said "Sync
    problem".
    The sidebar counted every listing whose stock push was failing, but the page
    only looked at the last ten push-log entries — so a listing that had been failing for a
    while disappeared from the page and the two disagreed. Both now read the same figures,
    and the sidebar's "Sync problem" link opens the store page that has the problem.

StockSmith v0.16.2

Choose a tag to compare

@github-actions github-actions released this 16 Sep 15:33
32ffd55

Fixed

  • A product's Variants tab failed to load, and adding variants ended in "Internal
    Server Error".
    Any product with a bill of materials was affected: the variants list
    (and the response after creating variants in bulk) stopped with a server error, so the
    tab stayed empty and new variants appeared not to save — they had in fact been created,
    and show up once this fix is installed. A change in 0.16.0 to how buildable quantities
    are calculated updated the single-variant screen but not the list, which was still
    reading the figures in their old shape. No data was affected.

StockSmith v0.16.1

Choose a tag to compare

@github-actions github-actions released this 16 Sep 14:44
78e6763

Fixed

  • 0.16.0 would not start after installing. The app showed "The backend did not become
    ready in time" on every launch and never got past "Loading dashboard…". Two changes in
    0.16.0 each added a database migration from the same starting point, and the migration
    runner refused to pick between them, so it stopped before the app could open. This
    release joins the two back together; no data was touched by the failed starts, and
    installing 0.16.1 over 0.16.0 completes the upgrade normally.

StockSmith v0.16.0

Choose a tag to compare

@github-actions github-actions released this 16 Sep 12:10
2c8786b

Added

  • Shipping profiles can be linked to your Etsy shipping profiles and eBay postage
    policies, and take their buyer price from there.
    Settings → Shipping & packaging →
    Shipping profiles gains an "Etsy shipping profile" and an "eBay postage policy" picker per
    profile (Etsy connections made before this release need reconnecting once to grant the
    extra permission). The price you charge for postage is now split per channel the same
    way the cost already was — "Price charged (Etsy)" / "(eBay)", with the default used
    wherever a channel figure is blank — because the same service genuinely sells at
    different postage prices on different marketplaces, and margin counts that price as
    income. Linking changes no number by itself: "Pull price from Etsy/eBay" writes what the
    marketplace actually charges the buyer into that channel's price, an amber "Etsy now
    £x.xx" marker shows when the stored figure has drifted, and neither the default price nor
    any seller cost is ever touched. Profiles whose postage the marketplace calculates at
    checkout are labelled as such and have nothing to import.
  • Linked prices refresh themselves. After a successful background sync, StockSmith
    re-reads the marketplace's shipping profiles (at most once a day per marketplace — the
    interval is adjustable, and "Refresh from Etsy/eBay" runs it on demand) and rewrites
    any linked price that changed. Every change is written to a per-profile Price history
    (when, old → new, and whether the refresh, a manual pull or an edit made it), so a margin
    that moved has an explanation. Two new notification types cover it: "Postage price changed
    on a marketplace" lists every profile that moved (digest by default), and "Linked shipping
    profile missing on a marketplace" fires right away, once, when a linked profile has been
    deleted on Etsy or eBay — its last price is kept, but drafts sent with it would fail.
  • A product's shipping profile now decides how its draft listings ship. When the
    product's shipping profile is linked to Etsy or eBay, that link is the shipping profile /
    postage policy the draft is created with; the listing profile's own shipping fields become
    a fallback ("used only when the product has none") for products whose profile isn't
    linked. The draft modal says which was used. The Pricing tab shows "→ Etsy: "
    under the chosen shipping profile, or an amber "not linked" note when the marketplace is
    connected and the profile isn't; the readiness check now says whether the problem is a
    missing shipping profile or one that isn't linked, and where to fix each.
  • "Suggest profiles from Etsy" proposes shipping profiles too. Listing-profile
    suggestions no longer split into one per Etsy shipping profile — two products that differ
    only in postage are the same kind of listing. Instead, each Etsy shipping profile your
    listings use that no StockSmith profile is linked to yet is offered as its own suggestion:
    create one (named and priced from Etsy) or link an existing profile, and products with no
    shipping profile are pointed at it. Adopting an existing Etsy or eBay listing likewise
    sets the product's shipping profile from the listing's, if a linked one matches and the
    product had none — a profile you've already chosen is never replaced.
  • Linking an Etsy or eBay listing pre-fills the variation pairing. When you link an
    existing marketplace listing to a product (Settings → Unlinked listings → Review), the
    variation picker now arrives already paired: StockSmith attributes are matched to the
    listing's by name ("Colour" / "Color") or, failing that, by the values they share, and
    each variant is pre-filled with the one variation whose values fit it. A section above
    the rows shows how each attribute was paired and lets you change it; every row can still
    be overridden by hand. Etsy pickers previously had to be filled in entirely by hand.
  • The dashboard values finished goods, and shows how long the shelf itself lasts. The
    Inventory value tile now adds finished goods (at build cost) to materials, and shows the
    split. "Time to stockout" now shows cover from what is actually on hand — a material
    with 10 on the shelf and 200 on order reads 0.9 wk · 200 on order instead of 19.7 wk —
    while the warning status still allows for the order arriving; hover the cell for the
    with-on-order figure.

Changed

  • A material's fallback substitutes now count towards build and packaging capacity.
    If a material or box is short but lists an active fallback (Materials → Details →
    Fallbacks) with stock on the shelf, the product's sellable, expected-sellable and
    build-to-order figures are no longer capped by the empty shelf — the fallback's free
    stock is pooled in. The buildable figure is shown both ways so nothing is hidden: "10
    buildable (20 incl. fallbacks)" on the product header, Stock tab, variant rows and the
    products list. A line whose own shelf is empty still shows its ranked fallback
    suggestions in the build BOM and kitting BOM override tables, even when a fallback is
    already carrying the number — someone still has to choose which one to reach for. This
    is only a number: nothing is reserved against the fallback. Fallbacks pool one level
    deep (a fallback's own fallbacks don't chain in).
  • The sidebar is grouped by workflow, with an icon on every row. Dashboard, then
    Sell (Orders, Products) and Stock (Materials, Purchases, Stock Take). Badges are kept
    only where they mean something to act on: the Dashboard badge (which double-counted the
    Orders and Materials figures) and the Products count are gone. A failing sync now reads
    "Sync problem" rather than relying on colour alone.
  • New, never-stocked items no longer appear as due for a stock take. A material or
    product that has never held stock has nothing to count; its detail page says "Nothing to
    count yet" instead of an amber "Never counted". Anything that has ever held stock — even
    if it's at zero now — still comes due as before, and once counted, its cadence applies
    regardless of stock level.
  • The fallback-materials picker only offers materials from the same category. A
    filament's fallback list no longer wades through hardware, blanks and packaging.
    Cross-category fallbacks you already set up still work.

Fixed

  • Product margin now counts the postage you charge as income. A product's profit and
    margin (Pricing tab, product header, and the Etsy vs eBay comparison) were computed on the
    sale price alone, while still deducting what postage costs you — so a £20 item posted for
    £3.60 read as £3.60 worse off than its orders did. Revenue is now sale price + postage
    charged, the same base an order's net profit uses, and the platform fee is taken as a
    share of that whole amount (which is what the marketplaces charge it on). In calculated
    fee mode the fee £ is unchanged; the displayed fee % is now a share of the full amount
    rather than of the item price, so it reads lower. Manual fee %s are likewise applied to
    sale price + postage from now on. Margin history recorded before this change keeps its old
    figures.
  • Undoing an order-line substitution no longer leaves a blank row behind. The
    replacement line the substitution created was left on the order at quantity 0, showing
    as an empty grey row; substituting, undoing and substituting again grew the order by a
    row each time. The emptied line is now removed (the substitution stays in the order's
    history), and existing blank rows are cleaned up on update.