Skip to main content
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 →
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 applies only to closed orders — archive a mixed selection and the open orders are left untouched.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.
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
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.