Skip to main content
A small set of design patterns repeat across every part of TWICE. Once you know how a stock item’s detail page works, you already know how an order, a customer, and a listing work. This page is the map.

Data tables

The default view for every resource in TWICE is a data table. Inventory, Catalog, Orders, Customers, Collections — all the same component, with the same toolbar.
The table pattern is consistent across inventory, catalog, orders, customers, and collections. Learning it once applies everywhere.
Read more: Tables · Usage patterns

Detail pages with tabs

Click a row in any table and you land on its detail page. Detail pages follow a consistent layout: a header with the entity’s identifying fields and primary actions, then a horizontal tab strip for everything else. The tab set varies by entity type but follows a predictable rhythm: Two tabs appear almost everywhere:
  • Attributes — custom fields organised by Attribute Group
  • Activity log — the request-level audit trail scoped to this entity
Tab order, badges, and visibility all respect the user’s permission grants — tabs the user can’t access are hidden, not greyed out.

Drawer vs. full page

For lightweight create/edit flows TWICE uses a drawer that slides in from the right. The drawer keeps you on the current list, so you don’t lose context. Heavier flows — adding a Location, configuring a Listing — open a full-page editor because they need more screen and break into their own tab structure. Rules of thumb:

Attribute system

Every entity can carry custom fields via Attributes. The format set is fixed — text, number, boolean, date, datetime, select, multiselect, and formula — but you can define as many Attributes as you need per resource.

Where Attributes surface

Read more: Attributes · Attribute Groups

Relationship models

TWICE organises commerce data into four connected asset types. Each one references others — there are no silos. These relationships mean you can navigate from any entity to its related records — a Stock Item shows the SKU it belongs to, the Listing presenting it, and every Order that has reserved it.

Status and State

Every primary entity carries a Status (lifecycle stage) and most also carry a State (operational condition). The values are entity-specific, not universal: Read more: Status vs State

Bulk actions

Most tables support row selection via the leftmost checkbox column. Selecting one or more rows reveals a bulk toolbar:
  • Edit — apply the same attribute change to every selected row
  • Tag / Untag — apply or remove tags in bulk
  • Archive — change status to Archived where applicable
  • Delete — permanent delete (where the entity allows it)
  • Export — export selected rows as CSV
Bulk actions respect permissions — users without the corresponding scope don’t see the bulk toolbar.

Permission layers

Access control combines three independent layers: A user’s effective permissions are the intersection of all three. The pattern applies uniformly — inventory, catalog, orders, customers, settings all use the same model.
Tabs and bulk actions hide automatically rather than render as disabled. If a feature isn’t visible, check the user’s role and visibility settings before assuming the feature is missing.

Example: how the patterns combine

A standard Stock Item API response shows the patterns above in one payload — data-table identity, custom attributes, related references, lifecycle status, and the user’s permission to mutate it.
The response carries everything you saw in the UI — the entity’s identity, its Attributes, its relationships to a SKU and a Location, its lifecycle status, and the tags applied to it.

Tables

Data table features and operations

Attributes

Custom fields that extend the data model

Status vs State

Per-entity status and state matrices

Usage Patterns

Day-to-day interaction patterns

OS Approach

The platform philosophy behind these patterns

Activity Logs

The audit trail on every detail page