What it is
Build → Pages: every model’s page, and how it looks and behaves.
Creating a model gives it a page. Pages lets you refine that page without touching the model: which columns the table shows, the filter buttons, the form’s layout and rules, the record’s own page and its tabs, the ⋯ menu on each row, actions on ticked rows. Click a page in the list to open its editor.
The editor’s tabs each have a colour, used on the tab, its card on the Overview and the banner at its top:
| Tab | What it changes |
|---|---|
| Table page (teal) | The list of records: title, buttons, columns, the ⋯ row menu, actions on ticked rows. |
| Form (orange) | The add and edit form: sections, fields side by side, fields that show only when needed. |
| Record page (pink) | A record’s own page: sections, linked records, tabs of related lists. |
| Filters (purple) | The filter buttons above the table. |
| Linked Relationships (green) | What saving a record does to the records it picks — a payment marking its invoice paid. |
| Fields & rules (blue) | Required, editable, sortable, searchable — and the input each field uses. |
| Versions (cyan) | Every published version, to bring an older one back. |
Drafts and publishing
Nothing changes for your team until you publish.
- Edit in any tab. While something is unsaved a bar stays at the bottom of the page with Undo all, Preview, Save draft and Publish.
- Save draft keeps them on the server — they survive a reload and a teammate can carry on. Saving is refused while a tab shows an error (a menu item without a title, a filter without a field…).
- Publish, with an optional note, makes the draft live. Each publish is a new version you can go back to.
- Discard draft throws the draft away; the live page is untouched.
The Overview tab sums the page up — its columns, form, record page, filters and fields, and whether a draft is waiting — with each card opening its tab (Change it) or its preview. The header shows whether the page is Live or has a Draft not published yet.
Preview
See the page before anyone else does.
Preview — in the header, the bottom bar, each tab’s banner and the Overview cards — opens a window with three pictures: the Table page, the Form and a Record page. They’re drawn from your changes as they are, saved or not, and filled in with your five latest records (placeholders when there are none). Nothing in the preview can be clicked; Back to editing closes it.
Fields & rules
How each field is stored, checked and typed in.
Each row is one field: its picture and name (with the API name in small grey letters), Asked as — the input people fill in (text, long text, a date, a dropdown, tags, an image, a record picker…) — and its rules. Required and Can be changed later are switches right in the row; any other rule that’s on shows as a coloured chip. Find a field narrows a long list.
| Rule | Once published |
|---|---|
| Required | Must be filled in when a record is added. |
| Can be changed later | People can edit it after the record is created. |
| No duplicates | A second record with the same value is refused. |
| Searchable | The table’s search box finds records by it. |
| Sortable | The table can be sorted by it. |
| Trim spaces | Spaces before and after the value are removed. |
| Hidden everywhere | Never shown or sent anywhere — not even to you. |
Click a field to open its settings — the open field is raised and edged in blue so it’s easy to tell apart, and Done or Esc puts it away. They come in groups: Rules (each with what it does), How it looks (its label, how the table shows it, whether its column shows from the start), Limits or Length for numbers and text, Picking a linked record for record pickers, and — folded away — Advanced: how it’s stored, which details of a linked record are loaded, and the raw settings. Fields marked automatic, like createdAt, are filled in by the system and can’t be changed.
The ⋯ at the end of a field moves it up or down, puts it back as it started (once you’ve changed it), copies its API name, or removes it from the page. A field from linked records can also be duplicated there. You can still drag a field by ⋮⋮.
Locked when makes a field changeable only until the record reaches a state. A bill’s status can move between draft and due, but once it is void or paid it stays: add the condition status · is one of · void, paid. Conditions are a field, a test and a value, and all of them must hold. They’re checked against the record as it’s saved, so the change that marks a bill paid goes through and every change after it is refused — in the edit form (the field shows muted, with the reason; a section list loses its add, edit and delete buttons), in bulk edits, and through the public API. Other fields can be locked the same way: lock amount when status is paid.
Two or more conditions show a Match switch: All of these (each must hold) or Any of these (one is enough) — “status is void” or “status is paid”. For a choice field, is one of lets you tick several values in one condition. The same switch is on tab conditions and on fields from linked records.
Autofill, under a field’s Advanced settings, fills it in when a record is picked on the same form — a payment’s amount from the bill it pays, an order’s phone from its customer. Turn on Fill this from a linked record, choose the picker (Bill), then Its Total, or A formula over its fields… such as total - paid (the bill’s number fields, with + − × ÷, round, min and max). The field keeps its own kind. Only when limits it to a case (Delivery is Home, or the customer’s Type is Wholesale), and Read-only makes it the server’s: nobody types it, it follows the picked record, and while the conditions don’t hold it is cleared and stays locked. Left editable, the value can be typed over; opening a saved record never changes it, and picking another record fills it again. Autofill has the details.
Colours, under How it looks for a field with choices — a status, active / inactive, a yes / no — turns on Show as coloured tags: the table and the record page show the value as a coloured tag. Each option starts with a colour from what it means (paid and active green, void and cancelled red, due and pending orange, draft gray); click another swatch to change it, Default to go back.
Linked record in the table, under How it looks for a field that picks a record (a bill’s Client), shows it in the table as a chip, as the record page does: hovering shows a card of the client, with View to open its page and Quick view to open it in the side drawer without leaving the table. Quick view only shows for people whose role can view that model. Off, the column shows the client’s name as plain text.
Add a field from linked records makes a field worked out from the records linking to this one — a client’s Due payment: from bills whose client is this record, Add up a field of amount, only where status is due. It can also count them, or take their average, smallest or largest value. Give it a name, then add it to the table, the record page or the form in the page builder like any other field. It’s worked out whenever records are read, so it’s always current; it can’t be typed, sorted or searched, and it only counts linked records the person looking may see.
Linked-record pickers
For a field that picks records of another model.
Name shown in the picker is the field each record is listed by, and what the input shows once one is picked. It’s Name unless you pick another — an invoice’s number, a person’s email.
Shown under the name in the list adds up to four of the linked record’s fields in small type under each name in the picker — an invoice’s total and due date — so two alike can be told apart before picking. Only the values show, not the field names. With two or more, Show them puts them side by side on one line, separated by dots (1,200 · 12 Oct 2026), or each on its own line.
Add new from the form puts a + beside the picker: adding a booking for a guest who isn’t in the list yet, press +, fill in the guest, and they’re picked.
Which records are offered narrows the list with conditions — is, is not, is one of — against a fixed value or another field of the same form. On an invoice: offer only the projects whose client is this form’s client; pick another client and a project that no longer fits is cleared.
User guidelines
Rules in plain words for the people using the page.
Not everyone knows that a void invoice can’t be reversed, or that a paid bill locks. User guidelines, under the fields on the Fields & rules tab, is where you tell them: Add a guideline, give it a title — A void invoice can’t be reversed — and, if it helps, a few words under it on why and what to do instead. The arrows reorder them. Title names the list (User guidelines unless you change it), and the menu reads after it: Billing rules becomes View billing rules.
Once published, people find them in the table’s ⋯ menu beside the add button (Export and Bulk upload move in there too), and as a link above the add and edit forms. They open as a window, or a sheet from the bottom on a phone. Guidelines are words only — what the server actually refuses is set by the field rules (Can be changed later, Locked when), so write the guideline beside the rule that enforces it.
Around a value
Words before or after a value, and a second field under it.
Advanced: around a value sits at the bottom of the Fields & rules and Table tabs (both show the same settings). Pick a field and press Add, then choose what goes before and after its value: Words I type — an amount shown as BDT 1,200 — or Another field’s value, so a bill’s amount reads with its own currency field (USD 40 on one row, BDT 1,200 on the next).
Under it, in the table puts a second field in small type below the value — a customer’s email under their name — so the table needs one column for both. The words show on every row of the table and on the record page, in grey beside the value; an empty value shows on its own. The stored value doesn’t change: search, sorting, filters and exports still use the number or text itself.
Table page
The page’s list: its header and buttons, columns, row menu and actions on selected rows.
| Setting | What it does |
|---|---|
| Title / Subtitle | The page heading and the line under it. |
| Add button | Its label, and whether it opens the form in a pop-up over the table or on a page of its own (/your-page/create — the same form, with more room). |
| Export button | Download the table as Excel, CSV or PDF. |
| Search / Filter row | The search box (matching Searchable fields) and the filter chips. |
| Clickable rows | Clicking a row opens the record. |
| Rows per page | The default page size. |
| Columns | Which columns the table can show, in order — drag to reorder. Each person can still hide columns for themselves. |
Row menu
The ⋯ on every row: quick view, the detail page, edit in a dialog or on a page, duplicate, delete, a link, quick-edit of one field, add a linked record, and more. Drag to reorder — see Row menu.
Actions on selected rows
Select rows adds checkboxes and a menu for what’s ticked: export, delete (with undo), duplicate, archive, change status, compare, merge duplicates, print, set a field, and totals. Each needs the matching permission — see Working on many rows.
Status moves
Which moves “Change status” allows.
Under Bulk actions, Status picks the model’s status field (any options field). Every move is allowed until you switch one off — from Paid, switch off the rest so a paid invoice can’t go back. Ask for a reason makes each move need one; it’s kept in the record’s history.
Totals
“View total” for the ticked rows.
With rows selectable, the selection bar can add up the ticked rows: Total amount, Average amount, lowest, highest or count — across pages, counting only rows the person may see. Preset the calculations here, and choose whether people may calculate other number fields themselves.
Bulk upload
Many records from a file.
Switch on Bulk upload and the table’s ⋯ menu offers it. Upload Excel (its first sheet), CSV or JSON, then Check file. The first row names the columns — a field’s key or its label, any case — and the dialog downloads a template.
- Every row is checked like the add form would: required fields, allowed values, formulas, unique fields — against the table and within the file.
- Problems come back row by row, with the file’s row numbers, and nothing is saved until every row passes.
- Import then saves them all, or none: if one still fails, the ones saved are removed again.
- A linked record is found by its id, or by its name, code, title or email.
- Up to 2,000 rows or 10 MB at a time; it needs the Add permission on the model.
Filters
The chips above the table.
Each card is one chip; drag to order them. The first four show, the rest go under “Show more filters”. Picking a field fills in a sensible type and options.
| Type | Lets people |
|---|---|
| Multi select | Pick any number of values |
| Select | Pick one value |
| Text | Match typed text |
| Yes / No | True or false |
| Number range | Equal, above, below, between |
| Date | On, before, after, between, in the last… |
A select’s options can be typed on the card, be every record of another model, or every value the field currently holds.
Form
The add and edit form, in titled sections.
A section has a title, an optional description and rows; a row holds one field or several side by side. Drag sections and rows to reorder. Fields not placed anywhere are listed, so none are forgotten.
Fields that show only when needed
Make a field conditional… shows it only when others hold certain values — “Company name when Type is Business”. Tests include is, is not, is one of, more/less than, is filled in, is empty, is on and is off; several conditions can all have to hold, or any one. Rules chain: a hidden field counts as empty to the rules that depend on it.
The server applies the same rules: a hidden field’s value isn’t saved, and a required field is only required while it’s shown.
For a field that links to records — a payment method, a client — you don’t need its id: type part of its name and pick it from the list. The same search is used in Locked when and in record-page tab conditions.
Pickers that depend on other fields
On a bill with a Client and a Project, Project should offer only that client’s projects. Under Pickers that depend on other fields, each record picker in the form is listed with what it offers. When the linked model points at what another picker picks — a project has a client — a suggestion appears: Only where Client is this form’s Client. One press adds it; Add condition builds others (a field of the linked model, is / is not / is one of, and a fixed value or another field of the form). Choose While empty: offer none to show no projects until a client is picked. Picking another client clears a project that no longer fits. It’s the same setting as the field’s Which records are offered.
Sections that show only when needed
Make a section conditional… hides a whole section until it applies — Bank details only when Method is Bank transfer. Its conditions test fields in other sections. While it’s hidden its fields count as empty: their values aren’t saved and they aren’t required, and the section’s heading goes too.
Record page and tabs
The record’s own page and its quick-view dialog.
A list of sections, each with a title and 1–3 columns. Start from the form’s layout or from all fields. A section can hold the record’s own fields, chosen fields of a linked record (“Guest · Email”), or a list of related records (a guest’s bookings, newest first).
A section’s Copy button switch adds Copy details at its top right: one press copies its fields as text, one per line — Bank Name: City Bank, Routing Number: 225261187 — ready to paste into a message. Fields with no value are left out.
Shown only when needed
Under the sections, Sections shown only when needed lets each section appear only when the record holds certain values — Bank details only when Method is Bank transfer — and Hide fields with no value leaves out the section’s empty fields (and linked lists with no records). Fields shown only when needed does the same for single fields: IBAN only when Bank name is filled in. A section with nothing left to show is left out. This applies to the record page and the quick view; it only hides things from view — nothing is changed or removed from the record.
Tabs
After Overview, add tabs that list records of another model linked to this one — a client’s invoices, an author’s posts. Choose the columns, rows per page, and table or cards. Each tab has its own search, and an Add button that opens the other model’s form with this record already filled in.
Adding records that are already there
When the other model picks several of these records (a product in many collections, a member in many groups), the tab also has Add existing: pick records already there and this one is added to their link — the others they’re in are kept. Each row gets Remove, which takes this one out of that row’s link; the record itself stays. Both are saved like an edit — they show in History and start automations — and need edit permission on the other model.
A tab can also reach one step further, through a model in between: a client’s documents, when each document belongs to a project and each project to a client. Under Linked by, pick the option under Through another route (“Documents of this record’s Projects”); the line beneath it spells out the path. The tab then lists every document of every project of that client. Its Add button is shown muted, because a new document needs a project picked — add documents from the project’s page instead.
Show only narrows a tab to the records that meet your conditions, so a client page can have All bills and, beside it, Due bills (status is due). Each condition is a field, a test (is, is not, is one of, more or less than, before or after, contains, is empty) and a value; a record must meet every one. Adding from a tab fills in its “is” conditions — Add bill on Due bills starts as due.
Every detail page also has a History tab: who changed what, and when.
Linked Relationships
Saving one record changes the records it picks — record a payment, and its invoice turns Paid.
A rule on a page, read as a sentence: When a payment is added, if Mark as paid is ticked, update the invoice picked in Invoice: set Status to Paid, and set Payment date to this payment’s Payment date. Rules are part of the page, so they’re saved as a draft and go live when you publish.
Making a rule
- Open the page (Build → Pages) and its green Linked Relationships tab — or, for a new model, the last part of the wizard’s Check the pages step. This page changes… lists its rules; Changed by… lists rules on other pages that change this page’s records.
- Add a rule, name it, and fill in the sentence from the top: when the record is added, edited or deleted; if (conditions on it); the field that picks the record to change; only if (conditions on that record); then change it — or refuse the save with your message.
- Each change is a field of the linked page (only fields that can be edited there are offered) and how: Set to a value, Copy from this record, Add a number, Take off a number, Work out a formula, or Empty it. Add and Take off can have a Never below number and the message people see when a save would go under it. Copy from this record also offers the fields of the records it picks — a renewal’s Fee from Plan › Price. Work out opens the formula window: build it from this record’s fields, the records it picks and the linked record’s own values — a date for a date field, like
add(latest(target.expiresAt, today()), this.plan.length, this.plan.unit). - Choose what happens when the rule stops holding, then Save rule and publish the page.
The parts of a rule
| Part | What it does |
|---|---|
| When | Added, edited, deleted. Most rules run on added and edited. |
| If | Conditions on this record — Mark as paid is Yes. All must hold, or any one. |
| Update the record picked in | The field that picks the record to change — Invoice. A field that picks several changes each. |
| Only if | Conditions on the picked record — Status is not Cancelled. |
| Compare with this record | A condition can compare with a value, or with one of this record’s fields — Balance is less than this Transfer’s Amount; To account is this Transfer’s From account. |
| Then: change | Set a value, copy one of this record’s fields, add or take off a number, work out a formula, or empty a field. |
| Never below | With Add or Take off: the field never goes under this number — the save is refused with your message instead. |
| Then: refuse the save | Nothing is saved while the conditions hold; your message says why. |
| When it stops holding | The record is deleted, the box is unticked, or another invoice is picked: put the fields back (unless someone changed them since), leave them, or don’t allow it. |
| Allow even if they can’t edit | Without it, only people who may edit the linked page can save a record this rule changes. |
| Also for website and API saves | Off by default: records your website or app saves through the public API don’t run the rule. |
Example: a transfer between two accounts
A Transfers page picks a From account and a To account and has an Amount. Two rules move the money:
- Take from the sending account — update the record picked in From account: Balance, Take off this record’s Amount, Never below 0, message Not enough money in the sending account.
- Give to the receiving account — update the record picked in To account: Balance, Add this record’s Amount.
A transfer bigger than the balance is refused with your message under Amount, and nothing moves. Editing a transfer from 30 to 60 only needs the 30 more; deleting it gives the money back. Two transfers at the same moment can’t both spend the same balance. To stop a transfer to the same account, add a rule that refuses the save when the To account is this Transfer’s From account.
What people see in the form
The form follows the rules while it’s filled in: tick Mark as paid and Payment date gets its asterisk. Under the fields a line says what saving will also change — Will also update Invoice A: Status → paid, Payment date → 20 Oct 2026 — or why it would be refused. After saving, the message lists what else changed, and the invoice’s history says which rule and which payment changed it.
Where rules run
Everywhere records are saved: the form, Copy and Duplicate, bulk edit and status changes, bulk delete (and its undo, which runs the rules again), and bulk upload — checked for every row first, so nothing is saved unless all pass. A rule only ever reaches records in the same project.
Versions
Every publish is kept.
The Versions tab lists each published version with its note, who published it and when. Load as draft puts an older one in the draft; publish it to roll back.
Troubleshooting
| Symptom | Why, and what to do |
|---|---|
| My change doesn’t show | It’s still a draft. Publish it. |
| I can’t save the draft | A tab shows an error — look for the red marks. |
| A field can’t be added to the form | It isn’t Editable in Settings, or it’s a formula (worked out, not typed). |
| A new field isn’t in the table | Add it under Table → Columns, or turn on “In the table by default”. |
| Bulk upload says a linked record wasn’t found | Use the record’s id, or a name, code, title or email that matches one record. |