Shipping in public
New features and improvements as they ship. Bug fixes are listed inside the product, under What's new, where the people who reported them will see them.
- Discount codes
Limit a discount code to an email address pattern
A discount code could already be reserved for one named customer. That is the right tool for a gesture to one person and the wrong one for a company deal, where nobody wants to type in four hundred names. A code can now also be limited by email address. Write *@company.com and everyone with an address at that employer can use it, and nobody else. A star stands for any text, so *@*.company.com covers subdomains too. Set both a customer and a pattern and either one is enough: that person, or anyone matching. Patterns that would let in almost any address are refused when you save them, so a missed @ cannot quietly turn a campaign code loose on everybody.
- Discount codes
Reserve a code for one customer, or for chosen courses
A discount code used to be usable by anyone who knew it. If you wanted to give one person a gesture — a refund handled as a code, an apology, a deal agreed on the phone — nothing stopped it being passed on and used ten more times. The code editor now has two new optional fields. Reserved for customer ties the code to one person: it only works for them, checked against the email given at checkout or signup, so it works for guests as well as signed-in members. Leave it empty and the code behaves exactly as before. Valid for courses limits a code to the courses you pick. A code with courses chosen is a course code — it applies when one of those courses is being bought, and the webshop will not take it for anything else. Leave it empty and it stays an ordinary webshop code. Both are optional and off by default, so every code you already have keeps working unchanged.
- Courses
Discount codes work on course registrations
Courses had two prices — the normal fee and the member fee — and no way to take a discount code. A code you had issued was good in the webshop and nowhere near a course. The public registration page now has a code field. It is checked before paying, not after: enter a code and the page tells you straight away whether it applies and what the registration will cost, so nobody finds out at the payment step. The fee beside the pay button changes to what will actually be charged, with the old price struck through. The discount comes off whichever price is in force. If the customer has confirmed their membership and qualifies for the member fee, the code discounts that — a member is never worse off than a non-member for using the same code. On a multi-day registration it comes off the whole amount, not one session. An agreed price set for a single participant still overrides everything: a price your staff typed in for one person is not undercut by a code.
- Courses
Give one participant a price of their own
A course already had two prices — the normal fee and the member fee — but both apply to everybody. There was no way to agree something with one person: a sibling discount, an injury, a staff family member, a goodwill gesture. Staff either changed the member fee for the whole course or took the difference outside the system. Open a course, expand the date, and the ⋮ menu on a participant's row now has **Set price**. Type an amount, add a short reason, and that person's registration is priced at it. The agreed price shows in its own column in the participant list, with the reason on hover, so the next person to look at the course can see which registration is different and why. Empty and 0 mean different things on purpose: clearing the field returns the person to the ordinary course pricing, while 0 is a free place somebody agreed to give. The agreed price replaces the whole amount — the base fee, the member price and the per-day multiplication for a multi-date booking — so the number you type is the number they are asked to pay. It cannot be changed once a participant is marked paid, and the option disappears: altering it then would leave the recorded price disagreeing with the money actually taken. Every change is recorded with its amount and reason.
- Serial cards
Stop unrelated serial cards from merging into one
Buying a serial card moves the visits left on a customer's existing cards of the same type onto the new one. That is what you want when somebody tops up a 10x — and not at all what you want when a first-timer 3x and a children's 10x collapse into a single 13-visit card. Every punch card is stored under the same card type internally, whatever product sold it, so until now there was nothing to keep them apart. Settings ▸ Card groupings lets you define the drawers cards are sorted into. Create a grouping, then copy the tag it shows you onto the products that belong to it — in the ticket type's “Apply tag” field, or in the product's own tags. A card sold by that product then only ever merges with other cards in the same grouping. The tag applies wherever the product is sold: at the till, in the web shop and in OpenAir, as well as when you create a card by hand. Nothing changes if you create no groupings — cards without one still merge with each other exactly as before. The grouping is shown on the customer's card list, on the POS quick button and on the cart row, so you can see at a glance which cards will merge with which.
- Settings
See what went wrong, in one place
Background jobs — invoice imports, integrations, scheduled tasks — used to fail quietly. Settings ▸ Error log now lists what broke, with the full detail behind each row, and a count appears on the dashboard when something needs attention. Mark a problem as seen while you look into it, and resolve it when it is handled. Repeats of the same failure collapse into one entry rather than filling the list, and the dashboard shows nothing at all when there is nothing wrong.
- POS
Park a sale and come back to it
When a customer goes back for something they forgot, press Park. Their cart is set aside with everything on it, the till clears for the next person in the queue, and Parked in the menu brings it back when they return. You can have several waiting at once, and picking one up parks the sale you were in the middle of, as long as no payment has been recorded on it yet. Parked sales stay on that till and are cleared each morning, so yesterday’s abandoned carts do not pile up. A sale that already has payments on it cannot be parked — finish or cancel that one instead.
- Appearance
Dark mode follows your system and remembers your choice
The app now opens in whichever mode your computer is set to, so it arrives matching everything else on the machine. The sun and moon button in the top bar overrides that whenever you like — your choice is remembered on that device, and from then on it wins over the system setting. Dark mode now covers the app rather than a handful of screens: around 1,400 panels, tables, badges and info boxes that stayed white — and text that was dark-on-dark, sometimes invisible — now follow the theme.
- Webshop
Your course page now uses your shop's colours
Set them under Webshop → Settings → Branding: a primary colour, a page background and a content background. The public course page follows all three — header, banner, buttons and links — and picks readable text for a dark background on its own. If you have set no colours, nothing changes.
- Courses
Write your own text on the course page
Under Settings → General templates, add a template with target "courses_public" and one of these identifiers: hero_title, hero_subtitle or info_text. Leave the language empty to use one text everywhere, or add one row per language. info_text is an extra paragraph that stays hidden until you write something in it.
- Courses
Course payments now show up in the sales reports
A course paid online now becomes a real order and receipt, so it reaches every sales report on its own. You can choose which product each course is booked to: open the course, go to the Pricing tab and pick one under Sales product. Leave it empty and the course is booked to a shared Courses product, which is created the first time it is needed. This applies to payments from now on; earlier ones are not added retroactively.
- Customers
See how many customers you may email
The customer registry has a Marketing email filter beside the column picker: accepts, declined, or never asked. Pick one and the total at the top of the list becomes the answer — how many people a campaign would actually reach. “Accepts” is the same test the marketing sending uses, so the number is the number that would really be sent to, not an optimistic one. “Never asked” is deliberately separate from “declined”: those are customers nobody has ever put the question to, and they are usually the largest group and the only one you can still do something about.
- Dashboard
Group dashboard revenue into your own buckets
The revenue widget asked one question — entry against everything else — which is the right first question for a climbing gym and the wrong one if the interesting money is a cafe, a pro shop or party bookings. Now you can decide the grouping: tag a product “bucket_cafe” (any name after bucket_) and a series for it appears on the dashboard straight away. Tag as many as you like. The new Revenue buckets page under Settings gives each one a proper name, a colour and a position, and shows how many products carry each tag — a bucket with none is a typo in a tag, and this is the only place that shows. There is also a shortcut to it from the widget itself. Nothing changes until you tag your first product; until then the old entry split stays exactly as it was.
- POS
A product can require a customer before it is sold
Some products only mean something attached to a person — a membership, a named pass, a sale that will be invoiced — and until now the till would happily sell them to nobody, which only came to light later, as a pass belonging to no one. There is now a “Require a customer at the till” setting in the product editor's POS section. With it on, the product cannot be added to the cart until a customer is chosen, whether it was reached from a quick button or from product search. The till does not simply refuse: it opens the customer search and finishes the sale once you pick someone, so the button is never pressed twice. Off by default, so nothing changes until you turn it on for a product.
- Courses
Visible, Hidden and All tabs on the course list
The list opens on Visible, so courses taken off the customer site — old seasons especially — stay out of the way until you ask for them. Each tab shows how many courses are in it, so it is clear at a glance that hidden ones exist.
- Dashboard
Three new widgets that tell you when something is broken
Your dashboard could tell you what happened — sales, visitors, trends — but never that something had stopped working. Four new widgets cover that. Payment method health spots a method whose volume has collapsed or whose payments are being reversed, the kind of fault that can run for months while the totals look merely quiet. Failed recurring charges surfaces subscriptions that stay active while collecting nothing. And Entry vs everything else splits drop-ins from shop sales, so a slump in gear or courses cannot hide behind steady entry numbers. Add them from the dashboard editor.
- Reports
Customs alcohol report, now in the new reports
The monthly Customs (Tulli) alcohol report has moved out of the old export form into Reports, where you can filter, sort and export it like any other. It shows bottles and litres per alcohol tax group from your sales orders. It also now warns you about products it cannot declare — one with no tax group, or no bottle volume — before you file. The old version quietly left those out of the totals, and dropped any product that had no Finnish name at all, which could understate the declaration without saying so.
- Reports
Friend pass visitors now show up in the customer funnel
A friend pass is given, not sold, so it left no trace at the till — and the customer progression report finds people by their first purchase. Someone who first came to your gym on a friend's pass therefore looked like they had never visited at all, and the membership they bought three months later was credited to nobody. Their first visit is now recorded as a €0 sale, dated just before the pass was given so the report counts it as their way in. It changes no revenue, VAT or day-end figure. Pick the product it is booked against in the setup panel at the top of your dashboard; until you do, nothing is recorded.
- Dashboard
The dashboard now tells you what still needs setting up
Some features can't work until someone makes a choice only you can make, and nothing used to say so — a setting could sit empty for months while you assumed the feature was on. A panel at the top of the dashboard now lists whatever is still outstanding, explains why it matters, and lets you fill it in on the spot. It disappears once there is nothing left to do. First up: choosing which product a friend pass visit is rung up against, without which friend pass recipients are invisible in the customer progression report.
- Reports
WooCommerce sales now show up in your POS reports
Orders arriving from WooCommerce created their cards and then vanished from the books — the turnover was nowhere in your reports. Every paid WooCommerce order is now also written as a receipt under the web shop location, so it appears in the daily, monthly and VAT reports alongside your own web shop. The whole order is booked, shipping and fees included, and the payment lands on a "WooCommerce" method created automatically on first use — give it a ledger account in payment method settings. Cancelled and unpaid orders are ignored, and nothing is booked twice.
- Products
Translate addon names, with AI help
Addons showed the same name to every customer, whatever language they were shopping in. You can now give each addon a name per language under Products → Addons, and the button beside any filled-in field translates it into all the other languages for you. Leaving a language blank is safe — the shop falls back to the addon's own name.
- Reports
How many serial card holders go on to join
The customer progression report now shows each step against its own starting point, not just against everyone. “Of the people who reached a serial card, how many went on to join” is the number you can act on, and it was invisible while every stage was quoted as a share of the whole cohort — a stage looks weak when few people reached the stage before it. Both numbers are shown side by side. Median days are counted from the previous stage too, so a customer who took 20 days to a serial card and 20 more to join reads as 20 here and 40 in the stage table.
- Products
Show an intro offer only to people who have never bought anything
A new product setting, “Hide from customers who have bought before”, keeps a first-visit price out of sight of anyone who already has a card, a paid web order or a till receipt. It applies in the webshop and in OpenAir, and it also refuses a direct link to the product page — hiding it from the list while still serving it by address would not be much of a rule. Visitors who are not signed in do not see it either, because otherwise signing out would be all it took to get the offer again. An abandoned, unpaid order does not count as a purchase.
- Reports
See when people cancelled, not just why
The cancellation reasons report can now be grouped by month or by year, with a stacked bar beside each doughnut showing which reasons made up each period. Both halves get one — automatic subscriptions and traditional memberships. A period where nobody cancelled still gets its place on the axis, so a quiet month reads as a quiet month rather than disappearing.
- Reports
See whether a first visit turns into a membership
A new Customer progression report follows everyone whose first card was bought in the period you choose, and shows how many went on to a serial card, a monthly pass and a yearly membership — with a flow diagram of where people came in and what they did next. Because it follows the same people over time, the percentages mean conversion rather than headcount: someone who already held a card before the period is deliberately left out. A 3× taster pass or a first-timer guest pass can be made to count as a way in by tagging the product “customer path entry point”; tagging is optional and only sharpens the picture.
- Reports
Run a “who brought in the most new people” campaign
The member pass assignments report has two new tick boxes. “Only count new users” counts a pass only if the recipient's account did not exist before the report's start date and nothing had happened on it before the pass — no purchase, no invoice, no card, no visit. Checking invoices and visits matters: members who pay monthly by invoice never produce a till receipt, so a sales-only rule would treat your longest-standing members as new forever. “Only count redeemed passes” counts one only after the friend has actually visited, which is worth ticking when a prize is involved — registering an email costs nothing, walking into your gym does. Newness is judged against the report's date range, not against today, so re-running it later cannot change who won.
- Serial cards
Giving a friend pass now emails both people
The recipient gets a note saying who gave them the pass, what it is worth and how long it lasts; the giver gets a receipt naming who received it. Each email is written in that person's own language. There is no tick box in the app on purpose — the recipient is always an existing customer whose address you already hold, so what governs the send is their own important-email consent, and an explicit opt-out is honoured. It is also the only way anyone finds out a pass reached the wrong person, since the transfer cannot be undone. Turn it off per gym with “Email the recipient (and the giver) when a friend pass is given away”.
- Serial cards
You can now hide the friend pass in OpenAir
The new setting “Show the membership friend pass in openair” is on by default. Switch it off and members stop seeing their friend passes — and the Give to a friend button — in the app, while the passes keep being issued and stay visible to you in the customer register. Turning it back on brings them straight back; nothing is consumed or deleted.
- Serial cards
Member passes can be earned by rule and given to a friend
Rules decide which cards earn a "bring a friend" pass and what the friend receives. Members give a pass away in OpenAir; the friend gets a real card. A nightly batch resets passes on each rule's own cadence.
- Reports
Member pass assignments report
Who gave a friend pass away and how many, expanding to show each recipient, what card they got and how many visits are left.
- POS
Distraction-free POS and receipts that print properly
A button opens the POS full-screen with everything else out of the way. Receipts are sized to the 72 mm printable width, drop the currency signs and the pointless decimals, and print from a hidden frame instead of opening an empty tab.
- Rentals
Paint, drag and resize reservations on the rental timeline
Drag across empty time to create a reservation, drag an existing one to move it, pull its edge to change the length. Stored times are now real UTC, so a booking no longer drifts an hour when the clocks change.
- Navigation
A new menu rail
The sidebar is a narrow rail of icons with a flyout for each section, so the working area gets the width instead of the navigation.
- Punch passes
Punch passes, end to end
Sell the tenth coffee free. Pass types are set up as products, the POS and the web shop issue and stamp them, members see their own, and each type gets its own icon and colours. A used-up pass can be hidden or withdrawn instead of deleted.
- Memberships
Pausing a membership shifts the billing with it
Nobody is charged inside a pause window, and the paid days move to the end instead of evaporating. Allowances are configurable per membership type, committed terms get their days up front, and a cancellation settles the pause against the days actually used.
- Door access
A suspended membership is stopped at the door
Suspending a membership from the admin used to leave the door happily open. It now refuses entry and says why, so a suspension means what it says.
- POS
Nets Cloud Connect card terminals in the POS
Credentials are set once per gym and a terminal is bound to each POS, so the sale goes to the reader on that counter and nowhere else.
- POS
Icons and colours for POS categories
Give each quick-select group an icon, a background and a text colour, optionally oversized. On a busy Saturday the eye finds a colour faster than it reads a word.
- Web shop
Web order PDFs, and marking paid with a real method
An order prints or emails as a proper PDF with your header. Marking it paid asks which method the money came in by, and the cash-style methods are limited to staff standing at a till.
- Serial cards
Pause rules for serial cards
How many pauses a card allows, how long each may run and how many days a year it may total, set per card type. The customer pauses it themselves in OpenAir once you switch it on for the gym.
- Reports
Product sales grouped by variant, filtered by product
Sizes and colours of the same shirt add up as one line instead of scattering across the report, and a single product can be pulled out on its own.
- Dashboard
Build your own dashboard
Dashboards are configurable per gym and each user can arrange their own from the widgets they are allowed to see. The manager and the person on the desk do not need the same screen.
- Integrations
PrestaShop integration rebuilt
Products, stock and orders sync from a settings page you can actually read, with the connection testable before you trust it. The old integration is untouched and still runs.
- Languages
The whole admin speaks ten languages
Customers, products, POS, invoices, courses, rentals, gear, shifts, marketing, waivers and the rest are translated rather than half-English. Switching language now changes the whole screen.
- Door access
Door access can depend on where the phone is
Set a radius around each location, refuse an open from outside it, and read the anomalies report to see who has been trying from the wrong side of town.
- Landing pages
Landing pages you edit yourself
Each gym gets its own public pages — sections, text, images, news — edited in the admin and routed without touching a template or waiting for a deploy.
Want these as they land?
We write to customers when something worth knowing about ships. No cadence, no newsletter for its own sake.