Worth testing first
If you only have twenty minutes, these are the changes most likely to affect your day — and the ones where we'd most like to hear if something feels off.
- Create an order with a delivery timePick a delivery window and a fulfilment type, save, then reopen the order. Both should still be there. They were not being saved before.
- Check an order total against what the customer paidEspecially an order placed from a discounted weekly menu — those totals were reading low.
- Look for a product past the first fiftySearch the products page, and try finding an older product from a purchase order. Anything past the 50th was invisible everywhere in the app.
- Add several strains to a product you already haveOpen a product, add variants, and use the copy button to fill in a batch of strains in one go.
- Invite a teammateThey should appear in the table straight away, and you can now resend or revoke an invitation that went astray.
- Record a payment against a customer balanceCustomers can now hold credit or owe money, and the balance shows on their record and in the customers list.
Things that were not being saved
Each of these looked like it worked. You typed something, the form accepted it, and it quietly went nowhere.
- Delivery time and fulfilment type on new orders. The Create Order form asked for both and saved neither. This is also why an order could show a delivery window in one place and “not selected” in another — the second one was the truth.
- Customer notes on an order. Anything typed into the notes meant for the customer and driver was discarded on save. It now reaches both, and appears on the order.
- Weight per unit on new products. Products created from a purchase order could be saved without it, and then could not be used in production later — with no clue why. It is now required wherever a counted product is created.
Numbers that were wrong
- Order totals on discounted menu orders. A weekly-menu discount was being taken off twice, so the total shown was lower than what the customer actually paid. Totals now match across the shop, the driver app and your admin.
- Only the 50 newest products were visible. Anywhere you picked a product — the products page, purchase orders, production, orders — you were only ever seeing the most recent fifty, with nothing to tell you the rest existed. All of them are reachable now, and the products page has a search box.
- The orders list total left out shipping. The list and the order page now agree.
- Purchase order dates. Setting an expected arrival of today was rejected as being “in the past”, and a new purchase order recorded the moment you first opened the app rather than when you raised it.
New
- Customer balances and credit. A customer can now owe you money or hold prepaid credit. Every change is a recorded entry rather than a number someone edited, so the balance always adds up to its history. Spending credit against an order is the next step.
- One login, several businesses. If you run more than one operation, you can now switch between them from the sidebar. Pick a location under another business and the whole app moves with you. Inviting somebody who already has an account used to fail outright — that is fixed too.
- Resend and revoke invitations. An invite link expires after 24 hours, and until now an expired or mistyped invite left that email address permanently stuck. You can send a fresh link, or withdraw one entirely.
- Add several strains at once. A product that comes in eight strains no longer means eight trips through the same form. Copy a variant, change the strain, repeat — the same shortcut that existed when creating a product now works on products you already have.
- Adjust stock without a purchase order. For in-house grown, samples, or a count that did not match — with a reconciliation step so the correction is recorded rather than silent.
- Move an order to a different customer. Previously you had to delete it and start again, losing the items and the order number.
- Multipacks are clearer. Pack size is now editable everywhere a product is created, so a hundred-count of pre-rolls can be set up without leaving the screen you are on.
- Delivery windows come from your settings. The times offered when taking an order are the ones you actually run, plus ASAP — and you can type something the customer asked for, like “after 6”, when none of them fit.
- A prompt to finish products after receiving. When a purchase order is marked delivered, the app now tells you what is still missing before that stock can be sold.
Clearer to use
- Supplier versus contact. The supplier form now makes plain that the supplier is the company and the contact is a person there — and a purchase order shows who your contact is, not just their phone number.
- Customer notes and internal notes. Renamed so it is obvious which one the customer sees.
- Lists open on what is active. Orders, products and purchasing no longer greet you with everything you have ever archived. “All” is still there, at the end.
- Readable timestamps in order history. Times were showing in a raw technical format.
- Product names follow a convention. Brand and style suggest the name, so a catalog full of carts from different brands stays sortable.
- Empty screens explain themselves. Every one now has an icon and tells you the difference between “nothing here yet” and “nothing matches your filter”.
Safer
- Draft products cannot be sold. A product still marked draft could be added to an order even while its own page said it was not ready.
- Delivery tracking waits for confirmation. Tracking is visible to the customer, so it can no longer be set on an order nobody has accepted yet.
- Free products cannot reach the storefront. A variant with no price set was publicly purchasable at $0.
- Stock is committed in the right order. Oldest stock goes out first, and stock that has not physically arrived is no longer counted as available.
Behind the scenes
None of this is visible in the app, but it is the reason the list above could ship this quickly without breaking things.
- Every change is checked automatically before it can ship. Types, tests against a real database, and the API itself.
- Around 700 automated tests now run on every change. Covering the money and stock calculations most likely to hurt if they drift.
- Database updates run as part of the deploy. So the app and its data cannot fall out of step.
Around sixty individual items shipped in this release. If something here does not behave the way you expect, tell us which screen you were on — that is usually enough for us to find it.