Repository navigation
Releases: TheManoeuvre/StockSmith-App
Release list
StockSmith v0.22.0
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_ebayCSV 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
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_pendingfalse 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
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
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 ano_movement_sincecolumn, 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
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
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 --allforces 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
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.pyfetches 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
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
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
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.