Skip to main content
New feature
Reordering and hiding table view tabs

Arrange a table’s tab row, and hide the tabs you do not use

The three-dot button at the right end of a table’s tab row opens Show and reorder views. It manages the tab row the way the columns panel manages columns: Search views narrows the list by name, dragging the grip next to a name moves that tab in the row, and clearing a checkbox hides a tab. Show all and Hide all apply to the whole row at once.The row was previously fixed in the order views were created in. Changing it meant deleting views and saving them again.The panel covers every tab in the row — the All tab, the table’s built-in tabs, and saved views alike.Both actions are yours alone. They are stored in your browser, per account and table, so hiding or moving a view a colleague shared with you never moves it for them, and a different browser or device starts from the default row.The row always keeps one tab. The last visible tab cannot be unchecked, and Hide all leaves the first tab showing. Hiding the tab you are on moves you to the first tab that is still visible.A tab you have never dragged keeps its default position and sits after the ones you placed. A view you save now, or one a colleague shares with you after you last reordered the row, appears at the end of the row rather than in the middle of it.Dragging is disabled while a search is active, so clear the search before reordering.Tables →
Fix
Per-user activity log

A user’s Activity log tab shows what that user did

Open a user under Settings → Users & Roles and the Activity log tab beside General lists the requests that user made across the account. The tab reported no activity for every user before this, whatever they had done — it was a placeholder with nothing behind it. If you checked a colleague’s activity and found it empty, check again.The tab carries the same columns as the account-wide activity log — Timestamp, Action, Resource type, Record ID, Endpoint and Status — with the same filters, sorting, and per-entry detail panel.Actor is absent here. Every row has the same actor, and a filter on it would let the scope be retyped to someone else’s email.Entries are attributed by email address, so the tab appears only for users who have one, and only if your roles grant account_settings:general:view.
Activity Log history is available on the Standard plan (3 months) and the Enterprise plan (36 months). See plans.
Activity Logs →
New feature
Auto-apply discount codes

A discount code can apply itself, with no code to enter

A discount code carries an Auto-apply switch on its detail page under Catalog → Discount codes. Turn it on and the code applies on its own to every storefront checkout: customers see the discounted prices while browsing the store, and the discount lands on the order at checkout without anyone entering a code.Turning the switch on reveals In storefronts, which limits the code to the storefronts you choose. Leave it empty and the code covers every storefront.When several auto-apply codes match the same checkout, the most specific one applies. Every other condition on the code still holds — whether it is enabled, its validity dates, its usage limit, and what it targets.Codes that already exist are unaffected. Auto-apply is off until you turn it on.Discount codes →
Improvement
Booking option order as a store setting

Set the order booking options run in on your storefront

The fixed duration options in the booking widget always ran shortest first, with nothing to change it. Theme Editor → Listing page → Booking options now carries an Order control with four values: Shortest duration first (the default), Longest duration first, Lowest price first, and Highest price first.One setting covers the whole store. It applies to every listing, there is no per-listing override, and the order you pick also governs the edit drawer a customer opens on a booked item in the Bag — so the list there matches the one on the listing page.Only the fixed duration options move. Purchase stays at the top with Choose your own dates under it, subscription plans stay at the bottom, and an option that is unavailable for the selected date holds its position instead of dropping to the end of the list. The Book from price above the widget is unaffected — it always quotes the listing’s lowest booking price.One thing changes whether or not you open the setting. Two options of the same length used to come out in whatever order the database returned them, which could differ between the server-rendered page and the browser. They are now ordered: an option billed Starting at leads its same-length elapsed-time sibling, and past that the cheaper option leads. A listing offering a “1 day” Starting at option at 70,00 € and a “1 day” elapsed option at 55,00 € shows the Starting at option first from this release on — a fixed order, and not necessarily the one that listing happened to show before.The admin is unchanged: adding an item to an order lists duration options shortest first, whatever the store setting says.Theme Editor - Listing page →
Fix
Orders calendar popup contents

The Orders calendar popup lists the orders behind an event again

Clicking an event on the Orders calendar layout opened a popup carrying only the event title — no order reference, no customer, and no way into the order. The rows existed but were never drawn on screen. They are back.Each row covers one order and time, on two lines: order reference · customer name on top, then Pickup or Return, the time, and the number of stock items. An order with no customer name shows the reference alone.A chevron marks the row as a link. Click it, or press Enter or Space, to open that order.The second calendar on an order’s own Fulfillment & Return tab shares this popup. Its rows stay non-clickable — you are already in the order — but they take the same two-line layout, and its Pickup, Return and item-count labels now follow your admin language instead of always reading English.Orders →
Fix
Attribute key correction and readable save errors

Saving an attribute stops failing with an unexplained error

Creating or editing an attribute in Settings → Attributes & Tags could fail with Error occured. Please try again later and a 400, with nothing on screen to act on. Three separate causes produced that same message, and all three are fixed.The Attribute key field, under Additional settings in the attribute drawer, corrects what you type instead of rejecting it when you save. Capitals become lowercase, spaces become _, and anything outside lowercase letters, numbers, - and _ is dropped — list-CutStyle reads list-cutstyle in the field as you type, so the field shows the value that will actually be stored. Help text under the field states the rule: “Lowercase letters, numbers, - and _. Anything else is converted automatically.”Type is now read-only when you edit an existing attribute, with helper text explaining why: switching between a scalar format and Select or Multi-select would invalidate every value already stored against that attribute. To change the format, delete the attribute and create a new one.Errors the server returns now reach the screen with their own wording instead of the generic message, so a refused save tells you what to change.Keys already stored are never rewritten. The correction applies only to what you actively type, so an attribute key referenced by a formula variable does not change under you while you edit an unrelated field.If you create or update attributes through the API, this is a relaxation: a key that used to be rejected with a 400 is now accepted and stored in corrected form. The response carries the stored key — read it back rather than assuming it matches what you sent.Attributes →
ImprovementFix
Relative-day date filters and merchant-timezone date filtering

Date columns filter on before and after today, and resolve days in your account’s timezone

Date columns carry two operators alongside is today: is before today and is after today. Neither takes a value, so the operator alone is the filter and no date picker appears. Everything overdue and everything upcoming previously meant picking an explicit date, which went stale the next morning.The operators compare whole calendar days, not moments. An order created two hours ago still falls on today, so is before today does not match it.Date filters now resolve calendar days in your account’s timezone, set under Settings → General. Only the orders list did this before. Customers, Catalog, SKUs, Collections, Discount codes, and webhook deliveries compared UTC days, so a date filter on those lists returned the wrong rows for part of every day in any account not set to UTC. If your account sits outside UTC, those filters have been returning results you may have acted on. The correction covers the bulk-selection paths, so a date filter selects the same rows for a bulk action as it shows on screen.One list is unchanged: the Created column on Inventory → Stock items keeps its own operator set, without the relative-day operators, and still compares UTC days.Tables →
ImprovementFix
Per-group Show more in grouped tables

An expanded group loads past its first page of rows

Expanding a group in a grouped table loaded that group’s first page of rows and stopped there, with nothing to click for the rest. The last row inside an expanded group is now Show 50 more. Click it and the group loads its next page, or the remainder when fewer than a page is left. The number in the label is what the click loads, and it follows the table’s page size — at 25 rows per page the row reads Show 25 more. Only that group refetches, so the rest of the table stays as it is.The footer no longer miscounts while a table is grouped. An expanded group’s own row count used to reach the footer as the table’s total, so the footer quoted a range against the group while the table listed groups, and its next-page arrow paged the group list rather than the group you had open. While a table is grouped, the footer now counts the group list.Sorting reaches the rows inside a group. Orders, Inventory, Catalog and SKUs dropped the sort as soon as you grouped them, so a group opened in whatever order the server returned. The column you sort by now orders the rows within each group as well. Customers and Collections already behaved this way.This covers all six grouped tables — Orders, Customers, Inventory, Catalog, SKUs and Collections. The list of groups itself pages as it did before.Tables →
Improvement
Price table removal archives instead of deleting

Removing a price table from a listing archives it

A listing that carries its own standalone price table shows a banner above its Pricing tab. That banner offered Delete, which removed the table for good behind a plain confirmation. It offers Archive instead, and runs the same impact scan and confirmation dialog as the price tables list and a price table’s own page.The scan names the active listings priced by the table, so you see what loses its pricing before you confirm. The table then sits in Settings → Archived assets and comes back with Unarchive. Where Delete was final, removing a price table is now reversible.This was the last remove action in the admin that still deleted outright. Deletion stays available in the one place it always was — on an already-archived asset, from Settings → Archived assets.If you call the API, this is a breaking change. The hard-delete endpoints for listings, collections, price tables, SKUs, customers and stock items are gone; archive through the dedicated lifecycle endpoints, which run the impact scans and release holds. archivedAt and deletedAt are also no longer writable through a create or update body. One outright deletion survives: a stock item that has no order history can still be deleted, and the server refuses once it has any — Stock items with order history cannot be deleted — archive them instead.Archiving and deletion →
Fix
Rendered variables in order confirmation subjects

Order confirmation subjects render their variables

The Storefront order confirmation template sent its subject line exactly as typed. A subject such as Order {{number}} confirmed reached the customer with the literal {{number}} still in it, while the body of the same email rendered its variables correctly.Subjects now render the same way bodies do. Every variable and helper available to templates — {{reference}}, {{formatDate earliestStartDate}}, and the rest — works in the subject line.Nothing to change on your side. A subject you already saved starts rendering on the next confirmation; you do not need to re-save the template.Only the automatic confirmation was affected — the one sent after a storefront checkout, or after a customer pays a checkout link. The subject preview in the template editor, and an email you send yourself from an order, already rendered their variables, which is why a subject could look correct everywhere you checked it and still go out unrendered.A subject with a syntax error still sends as raw text, the same as a body with one.Emails →
New feature
Checkout link revocation
A checkout link that went to the wrong customer, carries the wrong amount, or has been superseded can now be stopped. On the order’s Payments tab, open the three-dots menu on an Active row of the Checkout links table and choose Revoke link. The confirmation states what happens: “The customer will no longer be able to open or pay this link. This cannot be undone.”Archiving an order revokes every still-active link on it, in the same step that closes the order.The Status column reads one of four values — Active, Expired, Revoked, Used — so a link you took back stays distinguishable from one whose scheduled expiry passed.Revocation applies only to an active link, and it is one-way. A link that already expired or was used keeps the state it reached first, and the server refuses a revocation of one. Unarchiving an order does not restore its links — issue a new link to collect again.A customer who opens a revoked link sees Link no longer active: “This payment link has been cancelled by the store. If you still need to pay, please contact the store for a new link.” A customer who already had the checkout page open cannot confirm payment either. Payments taken before the revocation stand — revoking stops further payment, it does not refund what was collected.Payments tab →
Improvement
Reusable subscription portal links
A subscription portal link is no longer spent by the first thing that opens it. The same link works on a second click, after a back button or a refresh, and in the browser a mail app hands off to. Anything that fetches the URL used to consume the link — a mail-security scanner that pre-visits links, a prefetcher, an in-app webview handing off to the real browser — so a customer opening a freshly received email was told the link was no longer valid.A link is now valid for 7 days, down from 30. Each email carries its own link, valid for 7 days from the day you sent that email, and issuing a new one does not invalidate the links in earlier emails. A customer who opens last week’s renewal reminder still reaches the portal.A portal session lasts 24 hours, up from 30 minutes. A customer who opens the portal in the morning is still signed in on that device in the evening.Opening a link too often in a short window now reads “Too many attempts just now. Please wait a few minutes and open your link again.” The link the customer already has still works, so they are no longer sent to the recovery form for a replacement that would not help.Recovery from a bookmarked order page asks for the email address only — the page resolves the order from the id already in its URL. Cold recovery still asks for the email address and the order reference.The link email drops the line about the link expiring soon and being usable once, and keeps the “if you didn’t request this, ignore this email” notice.Subscription portal →
Improvement
Total stock quantity on the Home Inventory card

The Home Inventory card shows total quantity, not a record count

The Inventory card on Home counted stock item records. A stock item with Track individually off is one record carrying a quantity greater than one, so if you hold stock that is not tracked individually the card reported far less than you have — two records holding 5 and 4 showed 2.The card now shows the summed quantity across your stock items, and its subtitle reads Total quantity in place of “Inventory Records”. It covers the locations selected in the top bar, so it matches the Quantity column total on Inventory → Stock items under the same location selection.Your stock is unchanged — only what the card counts. The Catalog, Orders, and Customers cards are untouched.Home →
New feature
Input masks for text attributes

A text Attribute can fix the shape of the values it accepts

A text Attribute can carry input masks — template strings describing the exact shape a value may take, such as 123456 #### ######[#] for a member card number. You author them in the attribute drawer under Settings > Attributes & Tags, in the Accepted formats section, which appears only when the format is text. Each row shows a filled example and the accepted value length, so an off-by-one in an optional block is visible before you save.One mask describes one shape. Add up to 10 per Attribute, each at most 100 characters, when a field should accept several — a value has to match one of them. The masks in a list must be tellable apart by their fixed starts, and TWICE rejects a list where one start is a prefix of another, naming the two masks that clash.At checkout, an attribute-backed field formats the value as the customer types. With one mask the fixed start is filled in for them, so they type only their own part; with several, the first character typed selects the mask. A value pasted without its separators is normalised. A value matching no mask stays free text while they type and is rejected on submit, so a malformed entry blocks the step. Masks never make a field required — an empty value still passes unless Required is set.Masks belong to the text format and are cleared if you change an Attribute’s format. Adding or editing one validates values written from then on; values already stored are left untouched.Attributes →
Improvement
Earned and intake split in the Revenue report

The Revenue report states created and recognized revenue separately

The report describes a period as two populations instead of one figure: the sales and bookings created in it, and those recognized in it. Each is split three ways by the other’s date, and the cell the two share is stated on its own, so the overlap is visible rather than implied. Do not add the two totals together — only the recognized table foots to the summary’s sales row.Calculation basis is now Revenue recognition, with three options where there were two: created, started (the default), and ended. It is a read-time parameter, not stored configuration, so changing it re-reads the same ledger. Everything downstream of “earned” follows the choice — the summary, every breakdown, the deferred revenue movement, and the payments reconciliation.Deferred revenue is now the period’s movement, reported as Added and Released. The opening and closing balances and the recognition schedule are gone.The Revenue CSV carries all three dates, each with its own Yes / No flag, in place of the single recognition date — pick your own recognition rule by choosing a column. A refund is dated on every axis, so it is reported once under all three rather than dropping out under one of them.Two additions ship alongside it: the Payments report takes a Payment methods filter, and each service location carries a free-text Cost center that travels with the location name onto the finance exports.Finance reports →
New feature
Location-specific order numbering

Order numbers carry a format, and each location can run its own

Order numbering is configured account-wide under Settings → Operations → Orders: a prefix, a suffix, a minimum number length, and the character that pads the number to that length. Each service location can override it from its own Order numbering tab.A location’s prefix and its sequence are independent toggles. Give locations their own prefixes and they still share one count — A21, B22, A23. Give them their own sequences and each counts separately — A1, B1, A2.An order now carries the formatted value as a reference, alongside the raw sequence number behind it. Accounts that configure no format keep #<number>, unchanged. The reference is what order confirmations, receipts, the subscription portal recovery form, and the Order_Number column of the finance exports show.The reference is allocated when an order leaves pending, at the same moment as the number, so an abandoned checkout burns neither. Once allocated it is frozen — changing a format later does not renumber orders that already have one.Service locations →
Fix
Copy to order on stock item attach

Documents flagged Copy to order reach the order however the stock item got there

A document flagged Copy to order on a listing, SKU, or stock item is copied to the order’s Documents tab when that resource joins the order. Two admin flows missed the copy and no longer do:
  • The Add stock item dialog on an order added the stock item without copying its documents.
  • Assigning or changing the stock item on a row already on the order — from the stock item drawer, a scanned stock code, or auto-assignment — copied nothing.
The copy is now part of the order write itself instead of a background step that ran alongside it. A copied document is on the tab as soon as the operation finishes, and if the operation fails the copy is rolled back with it.Orders that missed a copy before this change are not corrected by it. To bring them up to date, turn Copy to order off and then on again on the source document — that path backfills every order already referencing the listing, SKU, or stock item, and it is unchanged.Order documents →
New feature
Archiving and soft deletion

Archive replaces delete across the admin

Removing a listing, collection, price table, discount code, stock item, SKU, order, customer, or service location now archives it instead of deleting it. Archived records keep their history and stay restorable from Settings → Archived assets.Every archive shows what it affects before you confirm — the impact scan lists the records that reference the one you are archiving, so you see the consequences while you can still back out.Archiving an order is separate from closing it, and open orders can be archived too. A selection that mixes open and closed orders asks which you mean: Archive only the closed orders, the default, which leaves the open ones operating, or Close open orders and archive everything. A selection of open orders only can only be closed and archived. The closing choice runs the regular close transition first — checkout links stop working, scheduled payment collections stop, subscriptions are cancelled, and the order becomes read-only — and the impact scan names the open orders it will close before you confirm.Archiving a stock item takes it out of bookable capacity and releases the holds it had on future and in-progress orders. Those orders keep the assignment but lose the hold, so they surface in the conflict state and staff can see the unit they were waiting on is gone. Orders that have already ended keep their holds. New assignments of an archived stock item are rejected.Each record carries archivedAt and deletedAt timestamps, so archived and deleted states are distinguishable everywhere they surface.Archiving and deletion →
Improvement
Responsive storefront images

Storefront images serve in sizes matched to the screen

Storefront images are delivered through a CDN in width variants chosen for the visitor’s viewport, in WebP or AVIF where the browser accepts them. This covers the image gallery, collection cards, listing cards, listing list items, trending listing cards, and hero images, which carry separate mobile and desktop variants.Nothing to enable and nothing to re-upload — existing stores get this automatically, and there is no setting for it.Two cases pass through unchanged, both expected rather than faults: files that cannot be transformed (SVG and GIF among them) serve as uploaded, and any single image whose CDN request fails falls back to the original.Online Store →
Improvement
Translatable pricing labels and checkout fields

Pricing labels and custom checkout fields are translatable

Three more kinds of content accept translations: booking duration labels, subscription plan titles, and the names and placeholders of custom checkout fields. Translate them inline from the row or field itself once you have saved it, or alongside everything else in the Translations editor.Three limits are worth knowing. Only fixed booking rows carry a translatable duration label — a rate-based row’s label never reaches the storefront. Only custom checkout fields translate here; a field backed by an attribute renders that attribute’s name and translates through it instead. Select-option names are not covered.Multi-Language Content →
Improvement
Store page fulfillment hours placement

Pickup and return hours sit above opening hours on the store page

The store page shows Order pickup hours and Order return hours above Store opening hours, so a customer reads collection and return times before the times the location is open. On wide screens the two fulfillment cards sit side by side; on narrow screens they stack.The three headings changed with the reorder — previously “Pickup hours”, “Return hours”, and “Opening hours”. A card appears only for hours the location actually defines, and only while the store page is set to show opening hours.Fulfillment hours →
Improvement
Orders table performance

The Orders table loads quickly on large order histories

Accounts with a lot of orders saw the table take tens of seconds to open. On a test account of 20,000 orders, the two queries behind it now return in 51 ms and 1.5 ms, down from 31 s and 48 s.Four things changed underneath. The orders, order_stock_items, and order_customers tables carry indexes for the queries the list runs — it previously probed all three per order row, twice per page load, with none. The grid fetches its rows once when you open the table instead of two or three times, because the fetch no longer restarts as the tag and attribute option lists arrive. Each row carries only the stock item fields the calendar view reads — id, order, name, code, pickup date, and return date — rather than every column. And the paged query stops once it has your page of rows, instead of evaluating the whole filtered set first.The table itself is unchanged: same columns, same filters, same sorting, same saved views. Nothing to enable.Orders overview →
Improvement
Labelled checkout address lines

Each checkout address line carries its own label

Billing and shipping address fields in checkout label every line: Street address, ZIP / Postal code, City, and Country. Previously only the street line was identifiable — it carried the placeholder you configured for the field, while the postal code, city, and country inputs carried neither label nor placeholder, leaving the customer to infer them from position.The label you configure for the field now heads the group of four lines instead of sitting over the first input, and screen readers announce it as the name of the whole group.The street line still stands in for the address in the field’s configuration and in validation: it alone carries the configured placeholder, the required flag, and the inline error. The line labels are translatable alongside the rest of the checkout.Contact step fields →
Improvement
Checkout back navigation

Every checkout step has a way back

Each checkout step after the first shows a Go back button, returning to the previous step.The first step shows Back to store instead, leaving checkout for the cart — the same destination as the checkout header logo. Which step is first depends on the steps you enabled, so this is not always Contact.Leaving for the cart is a full page load and discards checkout state: details you submitted on an earlier step are stored on the checkout, anything typed on the current step is not.Checkouts opened from a checkout link show no button on the first step — that customer never came from a cart — and Continue stays on the right on its own.Both labels are overridable per checkout on the checkout editor’s Translations tab, alongside Continue.Checkout steps →
New feature
Webhook management, signing, and delivery log

Manage webhooks in the admin, with signed deliveries and a delivery log

Webhooks are managed under Settings → Integrations & API → Webhooks. Create one by choosing an event type and an HTTPS endpoint, then enable, disable, or delete it from the table.The payload shape changed. A delivery body is now an envelope — eventId, eventType, eventTime, resource, resourceId, apiVersion, and the affected resource in data — instead of the bare Order object. Each webhook is pinned to the API version that was current when you created it, reported in apiVersion, so a later API version never changes the shape you already receive.Deliveries are signed. Every webhook has a signing secret prefixed whsec_, and each delivery carries an HMAC-SHA256 of the raw request body in the X-Twice-Signature header, formatted sha256=<hex>. Reveal, copy, and rotate the secret from the View signing secret row action.Every dispatched delivery is recorded. View deliveries opens the log for a webhook, filterable by result, event, event ID, trigger time, attempt count, and last response. Open a row for the attempt timeline, the exact payload that was sent, and Redeliver to send that payload to the target URL again.
Webhooks created before signing existed have no secret, and their deliveries stay unsigned until you generate one with Generate secret in the signing-secret dialog.
Webhooks →
Fix
Fixed-duration calendar preview and pickup times

Calendar preview and pickup times for fixed-duration options

Two fixes to the booking widget on the storefront listing page. Both apply to booking options with a fixed duration — the ones whose return is derived from the pickup instead of being picked separately.Hovering a day in the availability calendar now highlights the range that clicking it selects. The highlight is computed as the hovered day plus the option’s duration, the same way the click is. Previously it anchored to the return day already selected and showed a span the click would not produce.Pickup times are no longer disabled for fixed-duration options whose return falls on a later day than the pickup — an evening pickup of a 12-hour option returns the next day. Under evening-only fulfillment hours this could disable every slot in the pickup dropdown. Options with a customer-chosen return are unaffected: their pickup times are still checked against the selected return day.Online Store →
Improvement
Date-aware booking options

Booking options reflect the selected date

On the storefront listing page, the Booking options dropdown now marks the options that can’t start on the selected date. Instead of failing only after selection, such an option renders greyed with the first day it can start — “Not available for selected dates — next available Mon 18.8”.The greyed options stay selectable: choosing one moves the start date to that option’s next startable day and the calendar follows.Booking options and the selected date →
Fix
Collection filter retention

Filters and sorting persist when navigating between collections

The online store’s collection filters — booking dates, price range, category, and search — along with the sort choice, now carry over when you navigate from one collection to another, including via the “all products” and breadcrumb links. Previously these reset on every collection switch. Page number still resets, since a page number from one collection doesn’t carry meaning in another.Collections →
Fix
Line item edit availability

A line item no longer blocks its own date edit

While you change a line item’s dates, the stock item reservation it already holds is released for the duration of the edit — the whole reserved footprint, buffer windows included. Previously the line item counted against itself: moving a return time an hour later on a stock item with a two-hour after-buffer failed with no explanation, and the only way through was to cancel the line item and rebuild it.This applies in the admin line item editor, where the release also covers the edited line item’s add-ons, and in the storefront cart edit flow. It covers the edited line item only — the other line items on the same order keep their reservations.Rental items already in a cart now hold their buffer windows against the rest of the cart, so two back-to-back rentals of the same stock item inside a buffer are no longer offered.Availability →
New feature
Discount code access control & checkout link discounts
Discount codes now have an access setting: public (default) lets anyone with the code redeem it at checkout, and internal restricts redemption to staff and integrations — a customer who types an internal code at checkout sees it rejected as invalid. Internal codes show a Staff only chip in the discount codes table.Discount codes can now also be applied to checkout links — checkouts backed by an existing order — as long as the order has no existing codes and every eligible item is still fully unpaid.Discount codes →
Improvement
Merchant account switcher search

Search merchant accounts in the account switcher

If you belong to more than one merchant account, the account switcher now has a search field — filter by name or slug from the Switch Merchant Account profile menu item or from Profile → General → Merchant accounts. The field only appears once you have more than one account to choose from.Profile settings →
Improvement
Collection card text colors

Collection card text color customization

The Theme Editor’s Collection card panel gained Text and Text secondary color settings, controlling the collection title and description colors independently of the site-wide link color.Collection card settings →
Improvement
Orders table Listings column

Listings column on the Orders table

The Orders table shows a Listings column with the distinct listing names from each order’s line items, filterable by selecting one or more listings from a dropdown.Orders table columns →
Deprecation
Check-in channel retired

In-store kiosk Check-in channel removed

The in-store kiosk Check-in sales channel is no longer generally available and its toggle has been removed from location settings. Other channels are unaffected.Sales channels on listings →
New feature
Finance reports

Revenue and Payments finance reports

Two new finance reports replace the previous Accounting report under Reports > Finances.The Revenue report uses accrual-basis accounting — it shows what was earned in the period, regardless of when the customer paid. Choose a recognition basis (handover date or order creation date) to control when revenue is recognized. The report includes deferred revenue tracking (opening/closing balances and a month-by-month recognition schedule) and a reconciliation bridge that walks from accrual revenue to cash payments received.The Payments report uses cash-basis accounting — it shows money received in the period (sales, deposit captures, refund reversals) minus money returned (refunds, released deposits). Platform transaction fees are reported separately with their own tax breakdown.Both reports support multi-currency and location filtering, printable A4 financial statements, and CSV export with stable row IDs for idempotent import. The two exports join via a shared Revenue_Row_ID column.Finance reports →
Improvement
Add-on booking period sync

Add-on booking periods follow the parent item

When you change a line item’s booking dates on an order, booking add-ons attached to it now update their period automatically to match the parent item’s new dates.Add-ons on orders →
New feature
Business address

Business address

Add your business address under Settings → Account. The address appears in accounting exports and on generated financial documents.Account settings →
Improvement
Deposit auto-expiry

Deposit authorization auto-expiry

Stripe deposit authorizations that reach their card-network expiry now show as Released (expired) on the order’s Payments tab, so you can tell an expired hold from one you released manually.Order payments →
New feature
Header bar theming

Header bar theme settings

The Theme Editor gained a dedicated Header bar panel — set background, text, and icon colors for the storefront’s top bar independently of the rest of the theme.Header bar settings →
New feature
Footer DOM IDs
The storefront footer now exposes stable DOM element IDs, so custom scripts can inject content — such as a cookie-settings link — into a known location that survives theme updates.Custom scripts →
New feature
Checkout select fields

Select (dropdown) fields at checkout

Checkout contact forms support select fields — define the options and customers pick one from a dropdown at checkout.Checkout steps →
New feature
Starting at pricing

“Starting at” pricing (calendar-period billing)

Fixed-package prices can snap to calendar billing windows: a package that “starts at” a window boundary bills by the calendar period the booking falls into, rather than a rolling duration from the start time.Listing pricing →
Improvement
Line item price confirmation

Price confirmation when editing line item dates

Editing a booking line item’s start or end date keeps its original unit price. On save, if that price no longer matches the catalog’s list price for the new dates, a confirmation dialog shows both prices and lets you apply the list price or keep the manual price.Order line items →
New feature
Apple Pay & Google Pay

Apple Pay & Google Pay on Stripe

Storefronts with Stripe payments now offer Apple Pay and Google Pay automatically at checkout — no configuration needed. Customers on supported devices see the wallet buttons alongside card payment.Payment settings →
New feature
Order deadline

Order deadline for listings

Set an order deadline on a listing to stop accepting bookings a fixed time before the start — for example, require orders at least 12 hours before pickup.Listing limits →
New feature
Custom URL slugs

Custom URL slugs

Listings and collections support custom storefront URL slugs, with automatic redirects from previous slugs so shared links keep working.Listing marketing →
Improvement
order.updated webhook

order.updated fires on child-table changes

The order.updated webhook now also fires when an order’s child records change — line items, customers, comments, tags, documents, discounts, and attributes — not just the order row itself.Webhooks →
New feature
Before-booking buffer

Before-booking buffer time

In addition to the post-booking buffer, SKUs and stock items support a before-booking buffer — preparation lead time blocked ahead of each booking. The same inheritance model applies: set it on the SKU, override per stock item.Stock item fulfillment →
New feature
Booking duration increment

Booking duration increment

Rate-based listings can enforce a booking duration increment — customers pick durations in whole steps (for example, full hours), combined independently with the existing minimum and maximum duration limits.Listing pricing →
New featureFix
Per-tab visibility & Unicode discount codes

Per-tab “Show in UI” permissions

Custom roles can now hide individual in-page tabs, not just sidebar sections. Tab visibility uses intersection semantics across a user’s roles, independent of data-access permissions.Visible areas →

Discount codes accept Unicode

Discount codes are no longer limited to ASCII — codes like KESÄ15 work. Only genuinely unsafe characters are rejected.Discount codes →
New feature
Subscriptions

Subscriptions

Sell ongoing access to products with recurring billing. Configure subscription plans on Price Tables with per-cycle pricing, commitment periods, and auto-renewal. Customers select a plan and start date on the storefront, and TWICE handles the rest — storing the card at checkout, generating invoices each billing cycle, collecting payments off-session (Stripe or Adyen), and retrying failed charges on an escalating schedule.Subscription management in the admin includes status tracking (active, past due, failed, completed, cancelled), an invoices table on the Payments tab, and cancellation scheduling that honours both commitment and notice periods.Five lifecycle emails cover the subscription journey: payment upcoming, payment confirmed, payment failed, cancelled, and ending soon. Discount codes support subscription-specific durations (once, repeating, or forever).Set up subscriptions →
New feature
Fulfillment hours

Fulfillment hours

Configure separate pickup and return hours per service location, independent of the location’s opening hours.Three source modes are available on the Fulfillment tab of each service location:
  • Follow opening hours — pickup and return times match the location’s opening schedule
  • Offset from opening hours — shift pickup or return availability by a buffer (e.g. last pickup 30 minutes before closing)
  • Custom schedule — define fully independent regular, seasonal, and exception hours for pickup and return separately
The storefront enforces fulfillment hours when customers select booking times. Admin users can override them when adding or editing line items on an order.Configure locations →
Improvement
Translations coverage

More translatable content

The central translation editor covers more entity types: navigation item labels, add-on names and descriptions, product-page custom sections (heading and content), and policy document names — on top of listings, collections, locations, attributes, and variants.Translations →
New featureImprovement
Orders table, store selection, backdating

Orders table columns

The orders table gained an Earliest start date column (scoped to bookings and subscriptions) and a filterable Purchase Type column.Orders overview →

Store selection settings

The Theme Editor controls how the storefront’s store-selection step appears — pickup availability cards, the cart store selector, and availability indicators are all themeable.Store selection →

Backdating line items

Admins can set a line item’s start date in the past when editing an order — useful for recording rentals that already began. Overlapping reservations are clamped instead of rejected.Order line items →
Fix
Translation completion

Real translation completion percentages

The Translations settings page shows actual per-language completion percentages, computed from what is translated versus translatable.Translations →
New feature
Per-language templates

Per-language email and document templates

Email and document templates can be edited per language. Resolution follows the customer’s language: per-language override → template content → default.Email settings →
New feature
Canonical URLs

Canonical URLs on custom domains

Storefronts with a primary custom domain automatically emit canonical and og:url tags pointing at it, consolidating SEO signals when the store is reachable on both the TWICE subdomain and your own domain.Domains →
New feature
Language selector

Storefront language selector

Stores with more than one enabled language show a language selector in the storefront top bar. The choice persists across navigation via the URL.Localization →
Release
v2.0

TWICE Commerce 2.0 — a complete platform rebuild

TWICE 2.0 is a ground-up rebuild of the platform on new backend and infrastructure. It’s faster, more configurable, and built around the Operating System approach — connected data models with full lifecycle tracking, a table-first admin, a configuration layer for automation, and a public API powering every function in the product.

New backend and infrastructure

  • Rebuilt from the ground up for performance and reliability
  • Designed around connected data models with full lifecycle tracking — every asset (stock items, listings, orders, customers) has consistent history, attributes, and relationships
  • More configurable per workspace, with multi-location and multi-tax operations running in parallel

Customizable single-template online store

  • A new whitelabel storefront powered by a single, configurable theme template
  • Visual Theme Editor to customise colours, typography, layout, buttons, inputs, calendars, and listing cards
  • Edit each page template visually — Home, About, Collection, Listing, Stores, Bag, Checkout
  • Custom CSS for anything beyond the visual editor

Customizable checkouts

  • Configure multiple Checkouts per workspace — different flows for B2B vs B2C, in-store vs online, or different markets
  • Build the contact form, consents, delivery options, and a custom confirmation screen per checkout
  • Choose the payment methods offered (including offline methods), with each checkout carrying its own styling

Serialised inventory & per-item ledger

  • Stock Items are individually tracked — unique codes, lifecycle history, financials
  • SKUs separate the product definition from individual units — one SKU can have many stock items
  • Per-item article ledger captures income and expenses against every stock item

Listings, Collections, Price Tables

  • Listings are the customer-facing product offerings — separate from inventory
  • One SKU can power multiple listings (rental vs sale, B2B vs B2C) with their own pricing and channel rules
  • Collections — manual or smart — for storefront merchandising
  • Price Tables for reusable, shareable pricing logic

Activity logs everywhere

  • Every core entity (orders, stock items, SKUs, listings, customers) has a complete Activity Log
  • Every change is traceable — who, what, when

Public API and Webhooks

  • Every Admin function is powered by the public REST API — see the API tab
  • Webhooks emit order events (order.created, order.updated, order.deleted) so external systems stay in sync

Workflow engine (API)

An automation engine for business processes: chain optional filters and delays with an action — send an email from a template or fire an HTTP request to an external system — into a pipeline that runs against an order payload. Available through the API; event triggers and a visual builder are in development.

Discount codes

Create discount codes customers redeem at checkout — percentage off, a fixed amount off the order, or a fixed amount off each eligible item.Set an optional usage limit, a validity window (start/end date), and a separate rental-period window that restricts which item start dates the code applies to. Restrict a code to specific purchase types (booking, sale, subscription) or to specific listings and collections — leave a restriction empty to apply it to all.Manage codes under Catalog → Discount Codes. Applied codes show on the order with their per-item discount allocation.

Order attributes & checkout profile fields

Capture custom data on orders — and collect built-in customer profile fields at checkout.Order attributes are custom fields you define per order (text, number, date, select, boolean, and more). Define them in Settings → Attributes & Tags → Orders, then add them to your checkout contact form under Settings → Checkouts → Add field. Captured values:
  • Appear on the order detail page under a dedicated attributes card
  • Show as filterable, sortable columns in the orders table
  • Render in the order confirmation email
Customer profile fields let you collect built-in profile data at checkout: date of birth, billing address, shipping address, language, company name, tax ID, and customer type. Values write back to the customer profile automatically.Configure attributes →

Add-on management on orders

Attach add-on products to an order after it’s created — no need to cancel and rebuild the order.On the order page, click + Add and choose Add-on product. Pick an add-on, then select the line item it attaches to — for example, adding a helmet to an existing bike rental. Add-on line items carry their own price, which can differ from the add-on’s standalone catalog price.

Per-location checkout configuration

Assign different Checkouts to different service locations, so customers see the right flow for where they’re ordering from.In the Storefront Editor, open the Checkout page and add a row under Location overrides: pick a checkout, then the locations it applies to. TWICE resolves which checkout to show a customer in this order: the location’s assigned checkout, then the storefront’s default checkout, then the tenant default. A checkout assigned to a location can’t be deactivated or deleted until you remove the assignment.

Custom domains

Connect your own domain to your online store. Customers browse and check out under your brand instead of a TWICE subdomain.Go to Settings → Domains, click Connect a domain, and enter your hostname. TWICE shows the DNS records to add at your registrar — a CNAME for subdomains or an A record for apex domains. Once DNS propagates, TLS is provisioned automatically. Track domain status (needs setup → pending → active) and set one domain as primary.
Custom domain availability depends on your plan. See pricing.
Configure domains →

Post-booking buffer times

Block availability after a booking ends — for cleaning, inspection, or transit time between orders.Set a buffer time on a SKU to apply it to all its stock items by default. Override it per individual stock item when a specific unit needs a different window. The buffer extends the item’s unavailability without changing the order itself — customers see the blocked period as unavailable when browsing.Configure buffer time under the Fulfillment tab on a SKU or stock item.

Storefront content translations

Translate your authored storefront content per language directly from the Theme Editor.Open the Theme Editor and switch to the Translations sidebar mode. Select a target language, then translate your hero text, page copy, section labels, and SEO metadata. Customers who browse in a supported language see the translated content automatically; untranslated fields fall back to the source language.Supported content: hero titles and subtitles, content block copy, About / Terms / Privacy page text, and SEO title and description fields.
Checkout content has its own, separate translations editor under Settings → Checkouts — see below.
Manage store languages →

Checkout content translations

Translate your checkout content per language, separately from the storefront.Open a checkout configuration under Settings → Checkouts and switch to the Translations tab. Select a target language, then translate contact form labels, consent text, delivery and payment step copy, and the order confirmation screen. Customers who check out in a supported language see the translated content automatically; untranslated fields fall back to the checkout’s source language.Configure checkouts →

Expanded calendar customization

The Theme Editor’s Calendar panel gained more controls over how availability looks on the storefront.Stock level colors now have separate background and text colors for Low, Limited, High, and a new Out of stock state, plus adjustable thresholds for when Low and Limited apply (defaults: Low ≤ 25%, Limited ≤ 60%). New sections cover the selected date’s colors, day cell corner radius, and today’s border color. A stock level legend can also show customers what each color means.Calendar settings →The orders table search now matches across more fields.In addition to order number and status, it now searches:
  • All customers on the order — by first name, last name, full name, and company name
  • Stock-item codes assigned to the order
Use the search bar at the top of the Orders table.

File renaming in document tabs

Rename any uploaded file directly from its document tab — available on orders, customers, stock items, SKUs, and listings.Open the three-dots menu on a file row and select Rename. The dialog prefills the current name including the file extension. Edit the name and save. Only files you own (not inherited from a listing template) can be renamed.

Coming soon

  • Tasks — assign and track operational work across your team
  • Additional third-party sales channel integrations
  • Sustainability and composability tracking for stock items
See the Roadmap for the full picture.