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 →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 grantaccount_settings:general:view.Activity Log history is available on the Standard plan (3 months) and the Enterprise plan (36 months). See plans.
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 →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 →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 →Saving an attribute stops failing with an unexplained error
Creating or editing an attribute in Settings → Attributes & Tags could fail withError 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 →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 →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 →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 →Order confirmation subjects render their variables
The Storefront order confirmation template sent its subject line exactly as typed. A subject such asOrder {{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 →Take back a checkout link so it can no longer be paid
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 →A portal link stays valid for seven days and works every time it is opened
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 →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 showed2.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 →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 →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 ownYes / 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 →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 →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.
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 carriesarchivedAt and deletedAt timestamps, so archived and deleted states are distinguishable everywhere they surface.Archiving and deletion →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 →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 →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 →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. Theorders, 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 →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 →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 →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.
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 →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 →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 →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 →Discount code access control and 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 →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 →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 →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 →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 →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 sharedRevenue_Row_ID column.Finance reports →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 →Business address
Add your business address under Settings → Account. The address appears in accounting exports and on generated financial documents.Account settings →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 →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 →Stable 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 →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 →“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 →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 →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 →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 →Custom URL slugs
Listings and collections support custom storefront URL slugs, with automatic redirects from previous slugs so shared links keep working.Listing marketing →order.updated fires on child-table changes
Theorder.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 →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 →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 →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 likeKESÄ15 work. Only genuinely unsafe characters are rejected.Discount codes →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 →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
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 →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 →Real translation completion percentages
The Translations settings page shows actual per-language completion percentages, computed from what is translated versus translatable.Translations →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 →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 →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
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.
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.
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 →Expanded orders table search
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
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