# OpenRows: the open-source Airtable alternative Source: https://openrows.io/. OpenRows is an open-source (AGPL-3.0) alternative to Airtable: relational tables with grid, kanban, calendar, gallery, timeline, list and form views, linked records, lookups, rollups, formulas, automations, webhooks and a REST API in Airtable's shape. Self-host it with Docker, or use the hosted service at https://app.openrows.io. ## Features - **Every view you need.** Grid, kanban, calendar, gallery, timeline and list views, plus forms. Filter, sort, group and colour any of them, and save personal or locked views. - **Fields that relate.** More than 20 field types, linked records, lookups, rollups, counts and an Airtable-style formula language, recomputed as your data changes. - **Work together, live.** Changes appear for everyone at once, with presence, comments and @mentions, notifications, revision history and a trash you can restore from. - **Automate the busywork.** Automations run on record changes, schedules, form submissions, buttons and incoming webhooks, and send email, Slack messages, HTTP requests or run scripts. - **Share on your terms.** Read-only share links and embeds for a view or a whole base, public forms, passwords and email-domain limits, and edit permissions per table and field. - **Built for builders.** A REST API in Airtable’s shape, webhooks, a typed JavaScript SDK, n8n nodes and an MCP server, so AI agents can read and write your bases. ## OpenRows and Airtable | | OpenRows | Airtable | | --- | --- | --- | | Source code | Open source, AGPL-3.0 | Proprietary | | Where it runs | Your own server, or our hosted service | Airtable’s cloud only | | Self-hosted limits | None: every core feature, no record caps | Not available | | API | REST API in Airtable’s shape, JavaScript SDK, MCP server, n8n nodes | REST API | | Moving your data | Airtable importer, CSV import and export, ZIP export of a base or account | CSV export per view | | Your content and AI | Never used to train AI models | Set by Airtable’s own policies | Airtable is a trademark of Formagrid, Inc. OpenRows is not affiliated with or endorsed by Airtable. ## Questions ### What is OpenRows? OpenRows is an open-source alternative to Airtable: a spreadsheet-style database with linked records, grid, kanban, calendar, gallery, timeline, list and form views, formulas, automations and an API. You can self-host it under the AGPL-3.0 or use the hosted service at app.openrows.io. ### Is OpenRows free? Self-hosting is free: the code is AGPL-3.0, with every core feature and no record limits. The hosted service has a free plan with 1,000 records per base and up to 5 editors per workspace. Pro is $10 per editor per month, or $100 a year (2 months free); Business is $24 per editor per month, or $240 a year (2 months free); Enterprise is priced with you. ### Can I move my bases from Airtable? Yes. The Airtable importer copies whole bases with an Airtable personal access token: tables, fields, linked records, lookups, rollups, formulas, records and attachments. The REST API follows Airtable’s shape, so scripts and integrations port with few changes. ### Does OpenRows work with AI agents? Yes. The MCP server lets AI agents list bases and read and write records with a personal access token, either remotely at app.openrows.io/mcp or locally with npx @openrows/mcp-server. Documentation for agents is at app.openrows.io/llms.txt. ### Where is my data stored? In the European Union. The hosted service runs on our own server in the EU, and file attachments and encrypted backups are stored in Cloudflare R2 in the EU, so your records, files and backups stay there. Enterprise plans will add a choice of region per workspace (a United States region is planned). Self-hosted, your data stays on your own server. ### Does this site use cookies or trackers? No. openrows.io sets no cookies and loads no trackers, analytics or third-party scripts. The app uses only the sign-in cookies it needs to keep you signed in. # Pricing Source: https://openrows.io/pricing | | Free | Pro | Business | Enterprise | | --- | --- | --- | --- | --- | | Price | $0 | $10 per editor per month, or $100 a year (2 months free) | $24 per editor per month, or $240 a year (2 months free) | custom pricing | | Records per base | 1,000 | 50,000 | 250,000 | 500,000 | | Attachment storage | 1 GB | 20 GB | 100 GB | Unlimited | | Automation runs per month | 250 | 25,000 | 100,000 | Unlimited | | API calls per month | 2,000 | 100,000 | Unlimited | Unlimited | | Editors per workspace | 5 | Unlimited | Unlimited | Unlimited | | Revision history | 14 days | 1 year | 3 years | Unlimited | | Audit log retention | — | — | — | 1 year | | AI credits per month | 100 | 1,000 per editor | 3,000 per editor | 3,000 per editor | | Personal views | no | yes | yes | yes | | Locked views | no | yes | yes | yes | | Table and field edit permissions | no | yes | yes | yes | | Remove OpenRows branding | no | yes | yes | yes | | Single sign-on (SSO) | no | no | yes | yes | | SCIM provisioning | no | no | yes | yes | | Audit log | no | no | no | yes | | Admin console and policies | no | no | no | yes | | Data residency (choice of region) | no | no | no | yes | Self-hosted OpenRows is free under the AGPL-3.0, with no limits. ## Pricing questions ### What does the free plan include? Every view, field type, formula, automation and the API, within these limits: Records per base: 1,000; Attachment storage: 1 GB; Automation runs per month: 250; API calls per month: 2,000; Editors per workspace: 5; Revision history: 14 days; Audit log retention: —; AI credits per month: 100. ### How much do the paid plans cost? Pro is $10 per editor per month, or $100 a year (2 months free); Business is $24 per editor per month, or $240 a year (2 months free); Enterprise is priced with you. Paid plans are billed per editor, monthly or yearly. ### What happens when a workspace reaches a limit? You can still read and edit everything, but new data that would go over the limit (new records, files, automation runs or API calls) waits until you upgrade, free up room or the month resets. We never delete your data because you went over a limit, and owners get an email at 80% and 100%. ### Is self-hosting really free? Yes. OpenRows is open source under the AGPL-3.0. A self-hosted instance has every core feature and none of these limits. Hosted-only features, such as billing, live in a separately licensed part of the code. ### Who handles payments? Polar, our merchant of record, will sell and bill the paid plans, including invoices and sales tax. # Privacy Policy Source: https://openrows.io/privacy Effective October 26, 2026 This policy explains how Draggable ("we", "us") handles personal information when you use the hosted OpenRows service at [app.openrows.io](https://app.openrows.io), our sign-in service at auth.openrows.io, and this website (together, the "Service"). OpenRows is an open-source alternative to Airtable, released under the AGPL-3.0. ## The short version - Your workspace data is yours. We store it to run the Service and for nothing else. - We don't sell your data, we don't show ads, and we don't use ad trackers. - We don't use your content to train AI models. - You can ask us for a copy of your data or to delete it at any time. ## What we collect - **Account information.** When you sign up with an email and password, we collect your name, email address and a securely hashed password. When you sign in with GitHub or Google, we receive your name, email address and profile picture from that provider. We don't get your GitHub or Google password. - **Workspace content.** The bases, tables, records, files, comments and automations you and your collaborators create or upload. - **Billing information.** If you subscribe to a paid plan, payment is handled by Polar, our merchant of record. We receive your plan, billing status, and limited billing details such as your name, email and country, but not your full card number. - **Usage and technical data.** Server logs that include your IP address, browser type, the pages and API endpoints you request, timestamps and error reports. We also count usage (records, storage, automation runs, API calls) to apply plan limits. - **Cookies.** We use only sign-in cookies: the cookies needed to keep you signed in and secure your account. They last up to 30 days, and expire sooner if you are inactive for 7 days. They are strictly necessary, so we don't ask for consent. We don't use advertising or cross-site tracking cookies. On app.openrows.io these are `openrows_session` (your sign-in), `openrows_login` (a sign-in in progress, 30 minutes) and `openrows_share` (a password-protected share link you unlocked, 12 hours); our sign-in service at auth.openrows.io (Keycloak) sets its own sign-in cookies, and Cloudflare, which protects both, may set security cookies such as `__cf_bm`. The full list, with each cookie's purpose and lifetime, is in our [cookie inventory](https://github.com/Draggable/openrows/blob/main/docs/legal/cookies.md). ## How we use it - To provide, maintain and secure the Service, including signing you in and syncing your data with collaborators. - To enforce plan limits and process subscriptions. - To send essential emails such as invitations, password resets and important account or service notices. - To diagnose problems, prevent abuse and improve performance. - To comply with legal obligations. Where data protection laws such as the GDPR apply, we rely on performing our contract with you, our legitimate interest in running a secure and reliable service, and compliance with legal obligations. ## Who we share it with We share personal information only with service providers that help us run the Service, and only as needed: | Provider | Purpose | | --- | --- | | Servers we operate | Hosting the application and database (European Union) | | Cloudflare | DNS, network security, secure connections to our servers, and storage of file attachments and encrypted backups (Cloudflare R2, Western Europe) | | Polar | Payments, invoicing and tax as merchant of record | | GitHub and Google | Sign-in, only if you choose to sign in with them | If you use the Service for an organization, our [Data Processing Agreement](/dpa) (a draft under legal review) covers the personal data we process on your behalf and lists our subprocessors in full. We may also disclose information if required by law, to protect the rights and safety of our users or the public, or as part of a merger or acquisition, in which case this policy will continue to apply to your data. We never sell your personal information. ## Your workspace content We access your content only to provide the Service, to respond to your support requests, to investigate abuse or security issues, or when required by law. We don't use your content to train artificial intelligence or machine learning models. ## Retention We keep your account and workspace content for as long as your account is active. Items you delete go to the trash and are then permanently removed. When you delete your account, or ask us to, we delete your personal information and workspace content within 30 days, except where we must keep certain records (for example, billing records) to meet legal obligations. Encrypted backups are overwritten on a rolling basis within a further 30 days. Server logs are kept for up to 90 days. ## Your rights Wherever you live, you can ask us to: - give you access to the personal information we hold about you; - export your data in a portable format; - correct inaccurate information; - delete your account and data; - restrict or object to certain processing. Email [support@openrows.io](mailto:support@openrows.io) and we'll respond within 30 days. You also have the right to complain to your local data protection authority. ## Security We encrypt data in transit with TLS, hash passwords, isolate each workspace's data, and limit access to our systems. No system is perfectly secure, but we work hard to protect your information and will notify affected users of a breach as required by law. ## International transfers The hosted service stores your account and workspace content in the European Union: the application and database on our server there, and attachments and backups in Cloudflare R2 in the EU. Our providers may process data in countries other than your own. Where required, we rely on appropriate safeguards such as standard contractual clauses. ## Self-hosted OpenRows This policy covers only the hosted Service run by Draggable. If you use an OpenRows instance run by someone else, including one you host yourself, that operator is responsible for how your data is handled. ## Children The Service isn't intended for anyone under 16, and we don't knowingly collect information from them. If you believe a child has given us personal information, contact us and we'll delete it. ## Changes to this policy We may update this policy from time to time. If we make significant changes, we'll notify you by email or in the app before they take effect. The effective date at the top shows when it last changed. ## Contact Questions or requests about privacy: [support@openrows.io](mailto:support@openrows.io). # Terms of Service Source: https://openrows.io/terms Effective October 25, 2026 These terms govern your use of the hosted OpenRows service at [app.openrows.io](https://app.openrows.io), our sign-in service at auth.openrows.io, and this website (together, the "Service"), operated by Draggable ("we", "us"). By creating an account or using the Service, you agree to these terms and to our [Privacy Policy](/privacy). If you use the Service on behalf of an organization, you confirm you're authorized to accept these terms for it. ## Open source and the hosted Service The OpenRows source code is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0). Your rights to use, modify and distribute the code come from that license, not these terms. These terms cover only the hosted Service that we run. Some hosted-only features may be offered under a separate commercial license. ## Your account - You must be at least 16 years old to use the Service. - Provide accurate information and keep your sign-in details secure. You're responsible for activity under your account. - If you sign in with GitHub or Google, your use of those providers is also subject to their terms. - Tell us promptly at [support@openrows.io](mailto:support@openrows.io) if you suspect unauthorized access. ## Your content You own the data, files and other content you put into the Service. You give us a limited license to host, store, copy, process and display it only as needed to run the Service for you and your collaborators. This license ends when you delete the content or your account, apart from the time it takes to clear backups. You're responsible for having the rights to the content you upload and for who you share it with. ## Acceptable use Don't use the Service to: - break the law or infringe anyone's rights, including privacy and intellectual property rights; - store or share malware, or content that is abusive, harassing, or exploits minors; - send spam or run phishing or fraud; - probe, overload or disrupt the Service or other users, or bypass plan limits or security measures; - access the Service through automated means except through our documented API, within its rate limits; - resell the hosted Service without our written permission. We may remove content or suspend accounts that break these rules. ## Plans and billing - **Free plan.** The free plan includes usage limits listed on our [pricing page](/pricing). We may change free plan limits and features, and we'll give reasonable notice of changes that affect existing workspaces. - **Paid plans.** Paid subscriptions are sold and billed by Polar, our merchant of record, and are also subject to Polar's terms. Subscriptions renew automatically each billing period until cancelled. Prices are shown before you buy and may include applicable taxes. - **Price changes.** We'll notify you at least 30 days before a price change affects your subscription. - **Cancellation.** You can cancel at any time. Your plan stays active until the end of the current billing period, and then your workspace moves to the free plan. Except where the law requires otherwise, payments are non-refundable. - **Going over limits.** If you exceed your plan's limits, we may restrict some actions until you upgrade or reduce usage. We won't delete your data because you went over a limit. ## Availability and changes We work to keep the Service reliable, but it's provided "as is" and "as available" without warranties of any kind, to the fullest extent permitted by law. We may add, change or remove features. Keep your own exports or backups of important data. ## Termination You can stop using the Service and delete your account at any time. We may suspend or end your access if you seriously or repeatedly break these terms, if your use creates risk or legal exposure for us or others, or if we discontinue the Service. Unless the termination is for abuse or a legal reason, we'll give you notice and a reasonable chance to export your data. ## Limitation of liability To the fullest extent permitted by law, Draggable won't be liable for any indirect, incidental, special, consequential or punitive damages, or for lost profits, revenue or data. Our total liability for any claim related to the Service is limited to the greater of the amount you paid us in the 12 months before the claim or US$50. Nothing in these terms limits liability that can't be limited under applicable law. ## Indemnity If you use the Service for business, you agree to cover our reasonable costs from third-party claims arising from your content or your breach of these terms. ## Changes to these terms We may update these terms. If we make significant changes, we'll notify you by email or in the app at least 14 days before they take effect. Continuing to use the Service after that means you accept the updated terms. ## General These terms are governed by applicable law. If any part is found unenforceable, the rest stays in effect. Not enforcing a provision isn't a waiver. You may not transfer these terms without our consent; we may transfer them as part of a merger, acquisition or sale of assets. ## Contact Questions about these terms: [support@openrows.io](mailto:support@openrows.io). # Data Processing Agreement Source: https://openrows.io/dpa Effective when accepted; draft of October 28, 2026 > **Draft.** This agreement is published for transparency and is still under legal review. It isn't in force yet and may change before it is. If your organization needs a signed data processing agreement now, email [support@openrows.io](mailto:support@openrows.io). This Data Processing Agreement ("DPA") forms part of the [Terms of Service](/terms) between Draggable ("we", "us", the "Processor") and the customer that uses the hosted OpenRows service at [app.openrows.io](https://app.openrows.io) for an organization ("you", the "Controller"). It applies when we process personal data on your behalf in providing the Service, and where data protection laws such as the EU and UK GDPR apply to that processing. Our [Privacy Policy](/privacy) describes the personal data we handle as a controller ourselves, such as your account and billing details. ## 1. Subject matter, duration and purpose - **Subject matter:** hosting, storing and processing the content you and your collaborators put into the Service (bases, tables, records, files, comments, forms and automations) so that the Service works. - **Duration:** for as long as you use the Service, then until the data is deleted as described in section 8. - **Nature and purpose:** storage, retrieval, display, sharing with the people you choose, search, computation (formulas, automations), export, backup and deletion, only to provide, secure and support the Service. - **Categories of data subjects:** your users and collaborators, and anyone whose personal data you put into the Service, such as your customers, contacts or form respondents. - **Types of personal data:** whatever you put into the Service (names, email addresses and any other data in your records, files and comments), and the account details of your users (name, email address, profile picture, sign-in times and IP addresses in logs). - **Special categories:** the Service isn't designed for special categories of personal data or data about criminal convictions. If you store them, you are responsible for having a lawful basis and for deciding that the security measures below are appropriate. ## 2. Our obligations We will: - process personal data only on your documented instructions, which are these terms, your use of the Service's features and settings, and any other written instructions we agree, unless the law requires otherwise (we will then tell you first, unless the law forbids it); - tell you if we think an instruction breaks data protection law; - make sure everyone who can access the personal data is bound by confidentiality; - apply the security measures in Annex 2; - not sell the personal data, not use it for advertising, and not use your content to train artificial intelligence or machine learning models. ## 3. Subprocessors You authorize us to use the subprocessors listed in Annex 1. We have a written agreement with each of them with data protection obligations no less protective than this DPA, and we remain responsible for their work. We will announce a new or replaced subprocessor at least 30 days in advance, by email to workspace owners and in the app. You may object on reasonable data protection grounds within that time; if we can't resolve the objection, you may end the affected part of the Service and we will refund any prepaid fees for the remaining period. ## 4. Data location and international transfers **Data location.** Today the Service has one region, the European Union: the application, its database, file attachments and encrypted database backups are hosted and stored in the European Union (our server, and Cloudflare R2 in the EU). Traffic passes through Cloudflare's global network in transit, and the billing details in Annex 1 are processed by Polar in the United States and the European Union. When we add a region (a United States region is planned), Enterprise workspaces will choose theirs when they are created; a workspace's records, files and backups then stay in that region, and a workspace never moves between regions without your instruction. Where personal data is transferred from the European Economic Area, the United Kingdom or Switzerland to a country without an adequacy decision, the Standard Contractual Clauses adopted by the European Commission in Implementing Decision (EU) 2021/914 apply, Module Two (controller to processor) between you and us, and Module Three (processor to processor) between us and our subprocessors, with the UK International Data Transfer Addendum and the Swiss adjustments where required. For the clauses' options: clause 7 (docking) applies, clause 9 option 2 (general authorization, with the notice in section 3), clause 11's optional language doesn't apply, clauses 17 and 18 choose the law and courts of Ireland, and the annexes are filled in by section 1 and Annexes 1 and 2 of this DPA. If the clauses and this DPA conflict, the clauses prevail. ## 5. Assistance Taking into account the nature of the processing, we will help you respond to requests from data subjects (access, correction, deletion, portability, restriction and objection). Most can be done in the Service itself: you can edit or delete any record, export a base or your account's data, and delete your account or workspace. We will also help you with security, breach notifications, data protection impact assessments and consultations with supervisory authorities, as far as they concern our processing. ## 6. Personal data breaches If we become aware of a breach of security leading to the accidental or unlawful destruction, loss, alteration, unauthorized disclosure of, or access to, personal data we process for you, we will notify the workspace owners without undue delay and **no later than 48 hours** after becoming aware of it. The notice will describe, as far as we know them at the time, the nature of the breach, the categories and approximate number of data subjects and records concerned, its likely consequences, the measures taken or proposed, and a contact for more information. We will update it as we learn more, and take reasonable steps to contain the breach and reduce its effects. ## 7. Audits We will make available the information needed to show that we meet this DPA: this page, our security measures (Annex 2), our operational runbooks and the results of our monthly compliance self-check (log retention, backup expiry, the deletion jobs, and the absence of tracking cookies and third-party trackers). If that isn't enough to meet your obligations or a supervisory authority's request, you may audit our compliance once a year, at your cost, with 30 days' notice, under a confidentiality agreement, in a way that doesn't affect our other customers' data or the Service's security. ## 8. Deletion and return You can export your data at any time (each base as a ZIP of CSV and JSON files with its attachments, and your account's data). When you delete records, tables, bases or your workspace, they go to the trash and are permanently deleted after 30 days, or at once when you delete them permanently. When you delete your account or workspace, or after the Service ends for you, we delete the personal data within 30 days, except where the law requires us to keep it. Encrypted backups are overwritten on a rolling basis within a further 30 days, and server logs are kept for up to 90 days. ## 9. Liability and precedence Each party's liability under this DPA is subject to the limits in the Terms of Service, except where data protection law doesn't allow them. If this DPA and the Terms of Service conflict, this DPA prevails for the processing of personal data. ## Annex 1: Subprocessors | Subprocessor | What they do for the Service | Personal data | Location | | --- | --- | --- | --- | | Ark, our dedicated server, operated by Draggable (hosting provider to be confirmed before this DPA leaves draft) | Runs the application, its database and the sign-in service | All Service data | European Union | | Cloudflare, Inc. | DNS, network security and the encrypted connection to our server; storage of file attachments and of encrypted database backups (Cloudflare R2); the CAPTCHA on public forms and protected share links (Turnstile) | Everything in transit; attachments; encrypted backups; IP addresses | Global network; R2 storage in Western Europe | | Polar | Payments, invoicing and tax for paid plans, as merchant of record | Billing contact's name, email address and country; subscription details | United States and European Union | | Liquid Hosting (liquid.hosting) | The mail server that sends the Service's emails: invitations, notifications, sign-in and password reset emails | Recipient's name and email address; the email's content | To be confirmed | Sign-in with GitHub or Google happens only if a user chooses it; those providers act under their own terms, not as our subprocessors. ## Annex 2: Security measures - **Encryption in transit.** Every connection to the Service uses TLS through Cloudflare, and our server receives traffic only through an outbound, encrypted tunnel: it has no open inbound web ports. Its own services listen on its loopback interface only. - **Encryption at rest.** Database backups are encrypted with [age](https://age-encryption.org) before they leave the server, and the decryption key isn't stored with them. Cloudflare R2 encrypts stored files and backups at rest. - **Tenant isolation.** Each workspace's data is isolated in the database with row-level security, and the application connects with a database role that can't bypass it. Every request is authorized against the user's role, and automated tests check that one workspace can never read another's data. - **Access control.** Roles per workspace and base (owner, creator, editor, commenter, read-only), per-table and per-field edit permissions, personal access tokens limited by scope and by base, and share links with optional passwords, expiry and email-domain limits. Passwords are hashed by our sign-in service (Keycloak), which limits failed sign-in attempts. - **Administrative access.** Only Draggable's operator has access to the server, by SSH key. The sign-in service's administration console isn't reachable from the internet and needs a one-time code. Our support console needs a recent sign-in, and every action in it, including viewing a workspace as its user for support, is recorded in an audit log. - **Application security.** A strict Content-Security-Policy and other security headers, rate limits on the API, sign-in and public forms, request size limits, sanitized rich text, and a hardened client for any request to a URL a user chose (webhooks, automations, imports), which refuses private and internal addresses. - **Logging.** Logs leave out request bodies, cookies, query strings and the secret tokens in links, and are deleted after at most 90 days. - **Backups and recovery.** Nightly encrypted backups of every database, kept for 30 days, with a tested restore procedure. - **Monitoring.** Health, error-rate, backup and job monitoring with alerts to the operator, and external uptime checks at [status.openrows.io](https://status.openrows.io). - **Compliance self-check.** A monthly automated check that log retention, backup expiry and the deletion jobs work as promised, and that our website and app set no non-essential cookies and load no third-party trackers. A failure alerts the operator. - **Development.** Every change must pass the automated tests (including authorization, tenant isolation and security tests) before it is deployed. - **Deletion.** Deleted accounts, workspaces and trash are removed by automated jobs within the periods in section 8. # Getting started Source: https://openrows.io/docs/getting-started Sign in, find your way around workspaces and bases, create your first base and learn the shortcuts that make OpenRows fast. ## Sign in Open OpenRows in your browser and pick one of the buttons on the sign-in page: - **Sign in** if you already have an account. - **Create account** to sign up. - **Continue with Google**, **Continue with GitHub** (or another provider) when the server offers them. OpenRows needs a verified email address. If you see "Please verify your email address first", open the confirmation email, then sign in again. To sign out, open the account menu at the bottom of the sidebar and choose **Sign out**, or use the button in **Settings**. ## Workspaces A workspace holds bases and the people who work on them. The first time you sign in, OpenRows creates a personal workspace for you, named after you (for example "Ada's workspace"), and makes you its owner. The workspace switcher at the top of the sidebar lists every workspace you belong to. From it you can also open: - **Members**: who is in the workspace, pending invitations and **Invite people**. See [Sharing and permissions](https://openrows.io/docs/sharing). - **Usage and plan**: what the workspace uses. On the hosted service, your plan's limits apply (see https://openrows.io/pricing); self-hosted instances have no limits. - **Billing**: owners only, on the hosted service. - **New workspace**: create another workspace, which you own. When someone invites you, the email links to an invitation page. Choose **Accept invitation** to join the workspace or base. If you were invited to a single base, the workspace shows under "Bases shared with you" and you see only that base. ## The home page Home greets you and shows the ways to start a base, then every base you can open, grouped by workspace. Each workspace heading links to that workspace's own page. Creators and owners also see **Trash** and **New base** next to the heading. The top bar has **Search bases** (opens the command palette), **New base** and the notification bell.  ## Create a base A base is a set of related tables, like a spreadsheet file that knows what each column holds. You need the creator or owner role in a workspace to create bases there. ### Start from scratch Choose **Start from scratch** (or **New base**), give the base a name and choose **Create base**. The base opens with one table, "Table 1", that has three fields: Name, Notes and Status (Todo, In progress, Done), and a grid view. ### Import a file Choose **Import a file** and pick a CSV file (comma, semicolon, tab or pipe separated) of up to 50 MB. OpenRows creates a base named after the file and opens the import dialog, where you choose a field type for each column. Details are in [Bases, tables and records](https://openrows.io/docs/bases-and-tables#csv-import). Excel files aren't supported yet. ### Import from Airtable Choose **Import from Airtable**, paste an Airtable personal access token with the `data.records:read` and `schema.bases:read` scopes, choose **Find bases**, tick the bases you want and start the import. Each Airtable base becomes a new base with its tables, fields, records, linked records, attachments, and grid and kanban views. The token is used only for that import and deleted when it ends. See [Moving from Airtable](https://openrows.io/docs/airtable-migration). ### The demo base The "Product Roadmap (demo)" workspace holds a sample base with five tables (Features, Epics, Releases, Customer feedback and Team) and 2,000 records. It is added by the person who runs your OpenRows server, not from the app; see [Self-hosting](https://openrows.io/docs/self-hosting). ## The app shell Inside a base, the sidebar shows: - The base menu (click the base name): **All bases**, **Trash**, **Duplicate base**, **Snapshots**, **Webhooks**, **Export base (ZIP)** and **Delete base**. Which items you see depends on your role. - **Tables**: click to open a table; double-click to rename it. The "..." menu on a table has **Rename**, **Move up**, **Move down**, **Edit permissions** and **Delete table**. **Add table** adds a new one. - **Views**: the views of the open table, grouped by section, with your personal views apart. See [Views](https://openrows.io/docs/views).  The top bar shows where you are (base / table / view), the avatars of others on the same view, a live-updates indicator ("Live", "Reconnecting…" or "Offline"), **Automations** and **Share**. Changes made by others appear as they happen. If the connection drops, a banner says so and the view catches up when you are back online. On narrow screens the sidebar becomes a drawer: tap the menu button in the top bar to open it. On medium screens it collapses to a rail of icons. ## Command palette  Press **Ctrl K** (**Cmd K** on a Mac) anywhere, or click **Search & commands** in the sidebar. Type to filter, then press Enter. The palette lists: - **Tables** of the open base and **Bases** you can open. - **Create view…** (on a table, for editors and up): pick a view type, and turn on **Only me (personal view)** for a personal one. Backspace in the empty search goes back. - **Create a base**, **Go to home**, **Settings**, and **Switch to dark mode** or **Switch to light mode**. ## Keyboard basics | Keys | What they do | | --- | --- | | Ctrl/Cmd K | Open or close the command palette | | Arrow keys, Tab, Shift+Tab | Move between cells in the grid | | Ctrl/Cmd + arrow | Jump to the first or last row or column | | Home, End, Page Up, Page Down | First or last column, one screen up or down | | Shift + arrow or click | Extend the selection | | Enter or F2 | Edit the selected cell (or just start typing) | | Esc | Cancel an edit | | Delete or Backspace | Clear the selected cells | | Space | Expand the selected record | | Ctrl/Cmd C, X, V | Copy, cut and paste cells | | Ctrl/Cmd D | Fill down | | Ctrl/Cmd Z, Ctrl/Cmd Shift Z or Ctrl/Cmd Y | Undo, redo | | Ctrl/Cmd F | Find in the view | | Up/Down or J/K | Previous or next record in the expanded record | | Ctrl/Cmd Enter | Send a comment | More in [Bases, tables and records](https://openrows.io/docs/bases-and-tables#edit-in-the-grid). ## Dark mode OpenRows follows your system's light or dark setting. To choose yourself, open **Settings** and pick **System**, **Light** or **Dark** under **Appearance**. The account menu and the command palette also switch between light and dark mode. The choice is stored in your browser. ## Settings Open **Settings** from the sidebar or the account menu. It has: - **Account**: your name and email, and **Sign out**. - **Appearance**: the theme. - **Email notifications**: what is emailed and when (see below). - **Your data**: **Export my data** downloads a ZIP of your profile, memberships, the comments you wrote and every base of the workspaces you own. - **Developer: personal access tokens**: tokens for scripts and integrations that call the [REST API](https://openrows.io/docs/api) or the [MCP](https://openrows.io/docs/api/mcp) endpoint as you. **Create token** lets you limit a token to scopes and to chosen workspaces and bases; the token is shown once. - **Delete account**. ## Notifications The bell in the top bar shows a count of unread notifications. You get one when someone: - mentions you in a comment, - replies on a record you commented on, - adds you to a user field that notifies. Click a notification to open the record (at the comment, for mentions and replies). **Mark all as read** clears the count. Notifications older than 90 days are removed. Under **Settings**, **Email notifications** sets **What** is emailed (**All notifications**, **Only mentions** or **Nothing**) and **When** (**Right away**, **Hourly digest** or **Daily digest**). Right away sends at most one email per record every 10 minutes. The bell always shows everything, whatever you choose for email. Notification emails have a one-click unsubscribe link. ## Trash Deleting a base, table, field, view or record moves it to the trash, where it stays for 30 days before it is removed for good. - **Deleted bases**: the **Trash** button on Home (next to the workspace) or in the sidebar, for creators and owners. - **Deleted tables, fields, views and records**: **Trash** in the base menu, for editors and up. Choose **Restore** to bring an item back. Creators and owners can also delete items permanently. See [Bases, tables and records](https://openrows.io/docs/bases-and-tables#trash-and-restore). ## Snapshots A snapshot is a point-in-time copy of a whole base. OpenRows takes one every day for bases that changed, and you can take one any time with **Snapshot now** in the base menu's **Snapshots** dialog (creators and owners). Restoring a snapshot makes a new base and leaves the original alone. See [Bases, tables and records](https://openrows.io/docs/bases-and-tables#base-snapshots). ## Install the app and work offline OpenRows can be installed as an app from the browser: **Install OpenRows** in Chrome or Edge's address bar or menu, or **Share → Add to Home Screen** on an iPhone or iPad. It opens in its own window with the rose icon. Pages you open while online are kept on your device, so when the connection drops you can still read the views you visited last. A banner says **Offline, read-only**: editing comes back as soon as you're online again. Only your own data is kept, and signing out deletes it from the device, so sign out on a shared computer. On a phone, swipe right from the left edge of the screen (or tap the menu button) to open the sidebar, and tap a record to open it full screen. ## Next steps - [Bases, tables and records](https://openrows.io/docs/bases-and-tables) - [Fields](https://openrows.io/docs/fields) - [Views](https://openrows.io/docs/views) - [Sharing and permissions](https://openrows.io/docs/sharing) - [Forms](https://openrows.io/docs/forms) - [Automations](https://openrows.io/docs/automations) # Bases, tables and records Source: https://openrows.io/docs/bases-and-tables How to organize data in bases and tables, edit records in the grid, comment, follow a record's history, import, export, restore and snapshot. ## Bases A base is a set of related tables that can link to each other, much like an Airtable base. Bases live in a workspace, and everyone in the workspace gets their workspace role in every base. You can also invite people to a single base; see [Sharing and permissions](https://openrows.io/docs/sharing). To create a base, see [Getting started](https://openrows.io/docs/getting-started#create-a-base). Click the base name at the top of the sidebar for the base menu: | Item | What it does | Who sees it | | --- | --- | --- | | **All bases** | Back to Home | Everyone | | **Trash** | Deleted tables, fields, views and records | Editors and up | | **Duplicate base** | Copy the base, with or without its records; see [Duplicate a base](#duplicate-a-base) | Creators and owners | | **Snapshots** | Point-in-time copies of the base | Creators and owners | | **Webhooks** | Send changes to other services; see [Webhooks](https://openrows.io/docs/api/webhooks) | Creators and owners | | **Save as template** | Download the base as a template file; see [Templates](#templates) | Creators and owners | | **Export base (ZIP)** | Download everything you can read | Everyone | | **Delete base** | Move the base to the workspace's trash | Creators and owners | ### Duplicate a base **Duplicate base** in the base menu makes a copy that works on its own: editing one never changes the other. Pick the copy's name, the workspace it goes to (any workspace where you're a creator or owner) and whether to **Copy records, links and attachments**; without them you get the structure only, like a template. The copy is made in the background and opens when it's ready. The copy has every table, field (links, lookups, rollups and formulas point at the copy's own tables and fields), view (filters, sorts, groups, colours, form settings) and automation. Automations start turned off; secret headers and Slack webhook URLs aren't copied, so enter them again before you turn one on. Share links, webhooks, collaborators, comments, revision history, snapshots and other people's personal views stay with the original. The copy's records and attachments count against the plan of the workspace you copy to. ### Templates **Start from a template** on Home (or in the **New base** dialog) opens the template gallery: a product roadmap, a sales CRM, a project tracker, a content calendar, a bug tracker, event planning, inventory, a hiring pipeline, OKRs and customer feedback. Pick a category, open a template to preview each of its tables with their fields and first records, then **Use template**: you get a new base with the tables, fields, views and sample records, in the workspace you're on (where you're a creator or owner). Edit or delete the sample records as you like. A template's automations come turned off. The same templates are listed at [openrows.io/templates](https://openrows.io/templates). **Save as template** in the base menu downloads the base as a template file (`.openrows-template.json`): its tables, fields, the views everyone sees, automations without their secrets, and up to 1,000 records per table (5,000 in all). Files, collaborator cells and computed values aren't in it; computed fields are worked out again when the template is used. On your own server, add the file to the built-in templates (`packages/shared/src/templates/`) to offer it in the gallery. ### The AI assistant When your workspace has an AI provider (Settings → AI, or the server's own), creators and owners see **Assistant** in a base's top bar. Describe what you want, like "add a Total formula to Orders and a kanban view by status", and **Draft plan**: the assistant proposes new tables, fields (formulas included), views and automations, and lists each one with its fields and settings. Every formula it suggests is checked; one that doesn't work is shown with the problem and left unticked. Untick anything you don't want and click **Apply**: nothing changes in the base until then, and the changes are made with your own permissions, all together or not at all. Automations it creates start turned off. The assistant sees the names and types of the base's tables and fields, not your records. Tick **Include a few records from each table** to send up to three records per table along with the request, which helps it pick formats and options. On Home, **Describe it** does the same for a new base: say what you want to track, check the plan and the base's name, then **Create base**. ## Tables A table is a list of records with the same fields, like a sheet in a spreadsheet. The sidebar lists the base's tables. Creators and owners can: - **Add table**: adds "Table 2" (and so on) with the fields Name, Notes and Status (Todo, In progress, Done) and a "Grid view". - Rename a table: double-click it, or choose **Rename** in its "..." menu. - Reorder tables with **Move up** and **Move down**. - Limit who can add, edit or delete records with **Edit permissions**; see [Sharing and permissions](https://openrows.io/docs/sharing). - **Delete table**: moves it to the base's trash. A base keeps at least one table. Every table has a primary field, the first column, which names each record in links, the trash and notifications. Fields are covered in [Fields](https://openrows.io/docs/fields), views in [Views](https://openrows.io/docs/views). ## Records A record is one row of a table. Editors and up add, edit and delete records; commenters and read-only members can read them, and commenters can also comment. ### Add and delete records - Click **+** (Add record) below the last row of a grid, or just paste rows past the end. - Right-click a selection for **Copy**, **Fill down**, **Clear cells**, **Duplicate** and **Delete** (with the number of records selected). - Deleted records go to the trash. A message with **Undo** appears right after. The bar at the bottom of the grid shows how many records the view holds. ### Edit in the grid Select a cell and start typing to replace its value, or press **Enter** or **F2** to edit it. Double-clicking a cell also opens its editor. | Keys | In the grid | | --- | --- | | Arrow keys | Move one cell | | Ctrl/Cmd + arrow | Move to the first or last row or column | | Tab, Shift+Tab | Next or previous cell, wrapping to the next row | | Home, End | First or last column (with Ctrl/Cmd: first or last record too) | | Page Up, Page Down | Move by a screen | | Shift + arrow, Shift + click | Select a range | | Enter, F2 | Edit the cell | | Enter (while editing) | Save | | Tab (while editing) | Save and move to the next cell | | Esc | Cancel the edit, or shrink a range to one cell | | Delete, Backspace | Clear the selected cells | | Space | Expand the record (on a checkbox: toggle it; Shift+Space expands) | | Ctrl/Cmd D | Fill down | | Ctrl/Cmd F | Find in the view | In a long text cell, Enter adds a line; press **Ctrl Enter** (or Tab) to save. Click a row number to select the whole row, and Shift + click to select several. You can drop files from your computer onto an attachment cell. Computed fields (formulas, lookups, rollups, counts and the like) are read-only. A cell that the server refuses to save shows an error in place. ### Copy, paste and fill - **Copy** (Ctrl/Cmd C) puts the selected cells on the clipboard as text that spreadsheets, Airtable and OpenRows understand. Ctrl/Cmd X cuts. - **Paste** (Ctrl/Cmd V) starts at the top-left cell of your selection. Each pasted value is converted to the target field's type, and values that don't fit are skipped. Read-only and computed columns are skipped too. - If you paste one cell (or a block) into a larger selection that is a whole multiple of it, the paste repeats to fill the selection. - If the paste runs past the last record, OpenRows asks before adding the new records (**Add records**). - Creators and owners can paste options that a single or multiple select field doesn't have yet; they are added to the field. - **Fill down** (Ctrl/Cmd D, the context menu or the fill handle) copies the top row of the selection into the rows below it. Values are copied, not continued as a series. ### Undo and redo Press **Ctrl/Cmd Z** to undo and **Ctrl/Cmd Shift Z** or **Ctrl/Cmd Y** to redo. Undo covers cell edits, pastes, fills, clears, new records, duplicates and deletions, for your last 100 actions. ## Expand a record Press **Space** on a row, or hover the row number and click the expand icon, to open the record with every field. The record's address goes into the page URL, so you can share it. - **Previous record** and **Next record** buttons, or the **Up**/**Down** arrow keys (also **K**/**J**), move through the view's records. - **Copy record link** copies a link that opens this record. - **Show as a side panel** keeps the record beside the grid while you work; **Show as a modal** switches back. - **More record actions** has **Copy record link** and **Delete record**. - Fields hidden in the current view appear under **Hidden in this view**. The record has three tabs, **Fields**, **Comments** and **Activity**. On a wide screen, comments and activity sit beside the fields. ## Comments Commenters and up can comment on a record; read-only members can read the comments. - Write in the box at the bottom and press **Ctrl Enter** (Cmd Enter on a Mac) or **Send**. Enter adds a line. - Type **@** to mention someone. Only people with access to the base are suggested; use the arrow keys and Enter or Tab to pick one. Mentioned people get a notification. - Comments take basic Markdown formatting, up to 10,000 characters and 50 mentions. - React with one of six emoji reactions. - **Comment actions** lets you **Edit comment** (your own) or delete it. You can delete your own comments; creators and owners can delete anyone's. - Each record shows its newest 50 comments; **Load earlier comments** shows more. A badge on the row number counts a record's comments. ## Activity and revision history The **Activity** tab lists the record's history, oldest first: who created it, every change to its cells (before and after) and its comments. Submissions through a public form show "Form" as the author. Several edits to the same cells by the same person within a minute are merged into one entry. Fields hidden from you are left out. - **Restore this value** (next to a changed cell) sets that one field back to the value it had right after the change. - **Restore record to this point** sets the whole record back to how it was right after that change. A restore is a normal edit: it shows up in the history, and table and field edit permissions still apply. On a self-hosted server, history is kept for 365 days unless the server sets another period. On the hosted service, your plan's limits apply (see https://openrows.io/pricing). ## CSV import You can import a CSV file into a new base from Home (**Import a file**), or into an existing table: in a grid view, open the toolbar's **More view actions** menu and choose **Import CSV…** (editors and up). 1. **Choose a CSV file** of up to 50 MB (at most 250,000 rows and 500 columns). Commas, semicolons, tabs and pipes are detected. 2. Tick or untick **First row is the header**. 3. For each column, choose an existing field under **Import into**, **New field** (with a name and a type; creators and owners), or **Don't import**. A preview shows the first values. 4. Creators and owners can keep **Add missing options to select fields** on, so new select values become options. 5. Choose **Import**. A progress bar follows the import. Each row becomes a record. Values that can't be read for their field are left empty and counted in the summary. One import runs per table at a time. ## CSV export In a grid view's **More view actions** menu, choose **Download CSV**. The file holds the view as you see it: its filter, sort and grouping order, its visible fields in column order, and any find term or unsaved toolbar changes. Cells are written as display text, ready for a spreadsheet, and values that start with characters like `=` or `+` are protected so a spreadsheet won't run them as formulas. ## Export a base or your data **Export base (ZIP)** in the base menu downloads everything you can read in the base: - `schema.json`: the base, its tables, fields and the views you can see. - A CSV file per table (re-importable with the CSV import) and a JSON lines file per table with record ids and values. - The attachments, with a list of them. Other people's personal views are left out. The export reads the tables one after the other, so for an exact point-in-time copy use a snapshot. To download all your own data, go to **Settings**, **Your data**, **Export my data**. Its ZIP holds your profile, memberships, the comments you wrote and a base export of every base in the workspaces you own. Each person can start 10 exports every 10 minutes. ## Trash and restore Deleting a base, table, field, view or record moves it to the trash for 30 days. Each item shows when it was deleted and how many days are left. - **Base trash** (base menu, **Trash**): tabs for **Records**, **Fields**, **Views** and **Tables**. On the Records tab, pick the table first. - **Workspace trash** (**Trash** on Home or in the sidebar): deleted bases, with everything in them. Creators and owners. Choose **Restore** to put an item back where it was. Who can restore: | Item | Restore | Delete permanently | | --- | --- | --- | | Records | Editors and up | Creators and owners | | Views | Editors and up | Creators and owners | | Fields, tables | Creators and owners | Creators and owners | | Bases | Workspace creators and owners | Workspace creators and owners | Deleting permanently can't be undone. Other people's personal views stay private in the trash. ## Base snapshots A snapshot is a point-in-time copy of a whole base: its tables, fields, views, records, links and attachments. Open **Snapshots** in the base menu (creators and owners). - OpenRows takes an automatic snapshot every day of each base that changed since its last one. - **Snapshot now** takes a manual one. - **Restore to new base** creates a copy named "Base name (restored)" in the same workspace. The original base stays as it is. - Delete a snapshot with its delete button. Snapshots are kept for 30 days by default. Workspace owners can change this under **Keep for** (1 to 365 days). A base keeps at most 100 snapshots; the oldest automatic ones go first. On the hosted service, your plan's limits apply (see https://openrows.io/pricing). # Fields Source: https://openrows.io/docs/fields Every field type in OpenRows, its options, how type conversions work, links, lookups and rollups, formulas and their functions, and per-field edit permissions. ## Adding and editing fields Click the **Add field** button (the "+" at the right end of the grid's header) to create a field. The field editor opens as a popover: give the field a name, pick a type, set its options, and press **Create field** (or Ctrl/Cmd Enter). The type picker groups types into **Basic**, **Choice**, **Contact**, **People & links** and **Computed**. Type in **Search types…** to filter, use the arrow keys and press Enter to pick one. Owners and creators get these actions in a column header's menu: | Menu item | What it does | | --- | --- | | Edit field | Opens the field editor | | Rename field | Opens the editor with the name selected | | Change field type | Opens the editor on the type picker | | Edit description | Opens the editor on the description | | Edit permissions | Who may edit the field's cells (see below) | | Duplicate field | Opens the editor prefilled with "Name copy", the same type, options and description. Cell values are not copied | | Insert left / Insert right | Creates a new field next to this one | | Delete field | Moves the field to the trash after a confirmation, with an **Undo** toast | Depending on your role, the menu also has Move left/right, Freeze up to this field, Select column, Reset width and Hide field. Hiding is a view setting: see [Views](https://openrows.io/docs/views). The primary field (the first column, which names each record) can't be deleted or hidden, and it can't be a link, formula, button, lookup, rollup or count. You can't delete a field that a lookup, rollup, count or formula reads: change or remove those fields first. Deleted fields can be restored from the trash: see [Bases, tables and records](https://openrows.io/docs/bases-and-tables). ## Field types | Type | Category | What it stores | Options and notes | | --- | --- | --- | --- | | Single line text | Basic | One line of text, up to 100,000 characters | Line breaks become spaces | | Long text | Basic | Multi-line text, up to 100,000 characters | **Enable rich text formatting**: headings, bold, italic, strikethrough, inline code, code blocks, quotes, bulleted, numbered and check lists, and links (http, https and mailto only). Stored as Markdown | | Attachment | Basic | Files | Upload in the cell or the expanded record; images get thumbnails | | Checkbox | Basic | On or off | **Icon** (check, star, heart, thumbs up, flag, dot) and **Color** | | Number | Basic | A decimal number | **Decimal places** (0 to 8), **Allow negative numbers** | | Currency | Basic | An amount in one currency | **Currency code** (ISO code such as USD, EUR), decimal places (default 2), allow negative numbers | | Percent | Basic | A percentage | Decimal places, allow negative numbers. Typing `50` or `50%` stores 50% | | Date | Basic | A calendar day, no time | **Date format**: Local, Friendly (October 25, 2026), US (10/25/2026), European (25/10/2026), ISO (2026-10-25) | | Date and time | Basic | A point in time | Date format, **Time format** (12 hour or 24 hour), **Time zone** (default UTC; times you type are read in it) | | Duration | Basic | A length of time | **Duration format**: h:mm, h:mm:ss, h:mm:ss.s, h:mm:ss.ss, h:mm:ss.sss. A plain number is read as minutes in h:mm, as seconds otherwise | | Rating | Basic | 1 to the maximum | **Maximum** (1 to 10, default 5), **Icon**, **Color** | | Barcode | Basic | A code and its symbology | EAN-13, EAN-8, UPC-A, UPC-E, Code 128, Code 39, ITF, QR and Data Matrix; check digits are verified. The cell shows the code's text | | Single select | Choice | One choice from a list | **Choices**: add, rename, recolor, reorder (drag, or Alt+Up/Down), remove. Up to 1,000 choices | | Multiple select | Choice | Any number of choices | Same choices editor. Pasted text is split on commas | | Email | Contact | An email address | Text that isn't an address is left empty | | URL | Contact | An http or https link, up to 2,048 characters | A bare domain gets `https://`; other schemes are refused | | Phone number | Contact | A phone number as typed | Digits, spaces, `+ - ( ) . /` and an optional extension | | User | People & links | Collaborators of the base | **Allow adding multiple collaborators** (up to 100 per cell), **Notify collaborators when they're added**. Removed members show as "Former member" | | Created by | People & links | Who created the record | Read-only | | Last modified by | People & links | Who last changed the record | Read-only | | Link to another record | People & links | Records of another table (or the same table) | See [Linked records](#linked-records) | | Autonumber | Computed | A unique, increasing number per record | Read-only | | Created time | Computed | When the record was created | Date format, time format, time zone. Read-only | | Last modified time | Computed | When any field of the record last changed | Date format, time format, time zone. Read-only | | Lookup | Computed | Values of a field in the linked records | See [Lookups, rollups and counts](#lookups-rollups-and-counts) | | Rollup | Computed | One value aggregated from the linked records | See [Lookups, rollups and counts](#lookups-rollups-and-counts) | | Count | Computed | How many records a link field links to | 0 when there are none | | Formula | Computed | The result of a formula over the record's fields | See [Formulas](#formulas) | | Button | Computed | A clickable button in each cell | **Button label** (default "Open") and **When clicked**: **Open a URL** (the URL comes from a formula; only http and https results work, and they open in a new tab) or **Run automations** (see [Automations](https://openrows.io/docs/automations)) | Read-only and computed fields can't be typed into; OpenRows fills them for you. ## Converting field types Change a field's type or options from **Change field type** or **Edit field**. Before you save, a conversion preview runs the conversion over the first 100 records and shows: - "All N values in N records convert without loss." when nothing changes, or - a warning when values would be cleared or changed (rounding, dropped choices, a removed choice still in use), ending with "This can't be undone.", and - examples as before → after, with cleared values shown as "Empty". Converting into a computed type (formula, lookup, rollup, count) discards the stored values, because the field fills its own. Things to know: - Values that can't be read as the new type become empty (for example text that isn't a date). - Converting to a select adds a choice for every value that doesn't match an existing one. - Converting to a link matches each value against the primary field of the linked table, ignoring case. Names that match nothing become new records in the linked table. - Converting a link to another type turns the linked records' names into values (text joins them) and moves the inverse link field to the trash. - Converting to text uses the values as they're displayed. ## Linked records A **Link to another record** field connects records across tables of the same base. Options: - **Link to table**: any table of the base. It can't be changed after the field is created. - **Allow linking to multiple records**: on by default; turn it off for one linked record per cell. - **Limit record selection to a view**: only records that a view of the linked table shows can be linked. This is enforced on every write, not only in the picker. Creating a link adds a matching field to the linked table, named after this table (with a number if that name is taken). Both sides always stay in sync. A link to the same table has no inverse field. Deleting either side moves both fields to the trash; restoring one brings back the pair with its links. Cells show the linked records' primary field values ("Unnamed record" when it's empty). You can paste or import names: they're matched against the linked table's primary field. Deleted records disappear from link cells and come back if the record is restored. ## Lookups, rollups and counts These fields read through a link field of the same table. If the table has none, the editor asks you to add a "Link to another record" field first. - **Lookup**: pick the **Linked record field**, then the **Field to look up** in the linked table. The cell lists each linked record's value, in link order. - **Rollup**: pick the linked record field and the **Field to roll up**, then an **Aggregation**: | Aggregation | Function | | --- | --- | | Sum | SUM | | Average | AVG | | Minimum | MIN | | Maximum | MAX | | Count numbers | COUNT | | Count non-empty values | COUNTA | | Count all values | COUNTALL | | All true | AND | | Any true | OR | | An odd number true | XOR | | Join with a separator | ARRAYJOIN (set the **Separator**) | | Unique values | ARRAYUNIQUE | | Non-empty values | ARRAYCOMPACT | | Concatenate | CONCATENATE | Sum, Average, Minimum and Maximum also have **Decimal places** (or Automatic). - **Count**: pick the linked record field. The cell is the number of linked records. Computed values update when the linked records change. A field can't read itself through a chain of lookups, rollups or formulas; OpenRows refuses a circular reference. After a large change, a spinning icon in the column header ("Updating values. Some may be out of date for a moment.") shows that values are still being recomputed. ## Formulas A formula field computes a value for each record from its other fields, like Airtable formulas. The editor highlights the formula, completes field names (type `{`) and functions (Ctrl Space lists everything), shows help for the function under the cursor, marks errors where they are, and previews the **Result type** and the result for the **First record** before you save. You can't save an empty or invalid formula. ### Syntax - Reference a field as `{Field name}`. A single-word name also works without braces (`Price * 2`). Inside braces, write `\}` for a `}` in a name. References survive renames. - Text goes in single or double quotes, with backslash escapes (`\n`, `\t`, `\"`). - `TRUE` and `FALSE` are booleans. Function names ignore case. - Operators, from tightest to loosest: `*` `/`, then `+` `-`, then `&` (joins text), then comparisons `=` `!=` (or `<>`) `<` `<=` `>` `>=`. Use parentheses to group. ``` IF({Status} = "Done", "Closed on " & DATETIME_FORMAT({Closed at}, "YYYY-MM-DD"), "Open") ``` A formula can be up to 10,000 characters, and parentheses and calls can nest up to 64 levels. ### Results | Result type | Shown as | Options | | --- | --- | --- | | Number | A number | **Decimal places** (Automatic or 0 to 8) | | Text | Text | | | Date | A date and time | **Time zone** (default UTC) | | Boolean (1 or 0) | 1 or 0 | | | List | Items joined with ", " | | A formula that fails for a record shows `#ERROR!`. Dates are computed in UTC unless you use `SET_TIMEZONE`. Formulas that call `NOW()` or `TODAY()` are refreshed every hour, not continuously; `TODAY()` is the current day in UTC. ### Functions OpenRows supports 84 functions. | Category | Functions | | --- | --- | | Text | ARRAYJOIN, CONCATENATE, ENCODE_URL_COMPONENT, FIND, LEFT, LEN, LOWER, MID, REPLACE, REPT, RIGHT, SEARCH, SUBSTITUTE, T, TRIM, UPPER, REGEX_MATCH, REGEX_EXTRACT, REGEX_REPLACE | | Logical | AND, OR, XOR, NOT, IF, SWITCH, BLANK, ERROR, ISERROR, TRUE, FALSE | | Numeric | ABS, AVERAGE, CEILING, COUNT, COUNTA, COUNTALL, EVEN, EXP, FLOOR, INT, LOG, MAX, MIN, MOD, ODD, POWER, ROUND, ROUNDDOWN, ROUNDUP, SQRT, SUM, VALUE | | Date and time | CREATED_TIME, DATEADD, DATESTR, DATETIME_DIFF, DATETIME_FORMAT, DATETIME_PARSE, DAY, HOUR, IS_AFTER, IS_BEFORE, IS_SAME, LAST_MODIFIED_TIME, MINUTE, MONTH, NOW, SECOND, SET_LOCALE, SET_TIMEZONE, TIMESTR, TONOW, FROMNOW, TODAY, WEEKDAY, WEEKNUM, WORKDAY, WORKDAY_DIFF, YEAR | | Lists | ARRAYCOMPACT, ARRAYFLATTEN, ARRAYUNIQUE, ARRAYSLICE | | Record | RECORD_ID | Notes: - Date units for DATEADD, DATETIME_DIFF, IS_SAME, TONOW and FROMNOW: `milliseconds` (`ms`), `seconds` (`s`), `minutes` (`m`), `hours` (`h`), `days` (`d`), `weeks` (`w`), `months` (`M`), `quarters` (`Q`), `years` (`y`), singular or plural. - DATETIME_FORMAT and DATETIME_PARSE use Airtable's format tokens, such as `YYYY-MM-DD` or `D MMMM YYYY h:mm A`. - WEEKDAY and WEEKNUM take an optional week start, "Sunday" or "Monday". WORKDAY and WORKDAY_DIFF take optional holidays. - LAST_MODIFIED_TIME() with field arguments gives when those fields last changed. - The REGEX functions don't support backreferences or lookaround. - Aggregates such as SUM and MAX accept lists (lookups, multiple selects) and skip text and blanks. ## Field descriptions Add a description under **Description** in the field editor (up to 2,000 characters), or with **Edit description** in the column menu. It shows as an info icon in the column header, with the description as its tooltip. ## Edit permissions per field Owners and creators can limit who may change a field's values with **Edit permissions** in its column menu. Under **Who can edit this field**, choose: - **Editors and up** (the default) - **Creators and up** - **Specific people**: pick roles and collaborators - **Nobody (read-only)** Everyone who can see the table still sees the field; this only limits editing. A restricted field shows a lock icon in its header. When a field is restricted, **Allow this field to be filled through forms** lets public forms set it on the records they create (see [Forms](https://openrows.io/docs/forms)). Table-level permissions (who may add, delete and edit records) also apply; both must allow a change. See [Sharing and permissions](https://openrows.io/docs/sharing). On the hosted service, edit permissions depend on your plan (see https://openrows.io/pricing); self-hosted instances have no limits. # Views Source: https://openrows.io/docs/views A view is one way of looking at a table: a grid, a board, a calendar, cards, a timeline, a nested list or a form, each with its own filters, sorts and layout. ## Creating and managing views A table's views are listed under **Views** in the base sidebar. To add one, click **Create view** and pick a type: **Grid**, **Kanban**, **Calendar**, **Gallery**, **Timeline**, **List** or **Form**. Tick **Only me** in the same menu to make the new view personal. The new view gets the type's name ("Kanban", "Calendar 2" and so on) and opens straight away. Open a view's **…** menu in the sidebar for: | Action | What it does | | --- | --- | | **Rename** | Renames the view (or double-click its name) | | **Duplicate** | Copies the view with its filters, sorts and layout | | **Share view** / **Share form** | Makes a public link to the view, or to a form view's form (owners and creators) | | **Lock view** / **Unlock view** | Stops others changing the view's setup (owners and creators) | | **Make personal** / **Make collaborative** | Changes who sees the view (only the person who made it) | | **Move up** / **Move down** / **Move to section** | Changes where the view sits in the sidebar; you can also drag it | | **Delete view** | Moves the view to the base's trash, where you can restore it | Editors and above can create, rename, duplicate, reorder and delete views. A table always keeps at least one collaborative view, so the last one can't be deleted or made personal. ### Sections Sections are named folders that group a table's views in the sidebar. Click **New section** under the views, then drag views into it or use **Move to section** in a view's menu. A section's **…** menu has **Rename section**, **Move up**, **Move down** and **Delete section**. Deleting a section keeps its views: they move out of the section. ### Collaborative, personal and locked views | Kind | Who sees it | Who can change its setup | | --- | --- | --- | | Collaborative (the default) | Everyone with access to the table | Editors and above | | Personal (person icon) | Only the person who made it | The person who made it | | Locked (lock icon) | Everyone with access to the table | Owners and creators only | Changes you can't save still work for you: commenters and read-only collaborators, and editors on a locked view, can filter, sort, group, hide fields and search, but the changes last only until you leave the page. They never change the view for anyone else. ## The view toolbar Grid views have the full toolbar. Other layouts have their own controls plus the filter, sort (except the timeline) and find tools described here. ### Filter **Filter** shows a count of active conditions, as in "Filter (2)". Click **Add condition** to pick a field, an operator and a value. Join conditions with **and** or **or**, and click **Add condition group** for one nested level of conditions (for example, "Status is Done or (Priority is High and Owner is Me)"). A view holds up to 50 conditions. A condition without a value is ignored until you fill it in. The operators depend on the field type: | Fields | Operators | | --- | --- | | Text | is, is not, contains, does not contain, is empty, is not empty | | Numbers, currency, percent, duration, rating | =, ≠, <, ≤, >, ≥, is empty, is not empty | | Dates | is, is not, is before, is after, is on or before, is on or after, is within, is empty, is not empty | | Single select | is, is not, is any of, is none of, is empty, is not empty | | Multiple select | has any of, has all of, is exactly, has none of, is empty, is not empty | | User | has any of, has all of, is exactly, has none of, is empty, is not empty | | Created by, last modified by | is, is not, is any of, is none of, is empty, is not empty | | Linked records | contains, does not contain (record names), has any of, has none of (pick specific records, up to 100), is empty, is not empty | | Attachments | contains, does not contain (file names), is empty, is not empty | | Formula, rollup | the number operators, plus contains and does not contain | | Lookup | contains, does not contain, is empty, is not empty | | Checkbox | is checked or unchecked | Date conditions compare with **today**, **tomorrow**, **yesterday** or an **exact date**; **is within** takes the past or next week, month or year. People conditions offer **Me**, which always means whoever is looking at the view, so one shared view can show "my tasks" to everyone. ### Sort and group **Sort** orders records by up to 10 fields: **Sort by** the first, **then by** the others. Directions are worded for the field, such as A → Z, 1 → 9, old → new or first → last for select options. A sort replaces any manual order. **Group** (grid only) groups records by up to 3 fields. Each group starts with a header band showing the value and its record count. ### Hide fields **Hide fields** lists every field with a switch. **Hide all** and **Show all** do what they say. Reorder fields with the arrow buttons or Alt+Up/Down. The primary field is always shown. ### Row height **Row height** has four sizes: **Short**, **Medium**, **Tall** and **Extra tall**. ### Row colours **Color** tints rows in the grid: - **None**: no colours. - **By select field**: each row takes the colour of its option in a single select field. - **By conditions**: add up to 20 colour conditions with **Add color condition**. Each has a colour and conditions that must all be true. A record takes the colour of the first condition it matches. Row colours show only in grid views. ### Find in view **Find in view** (Ctrl+F or Cmd+F in the grid) searches the view's records. The grid highlights matching cells and shows your position, as in "3 of 12". Press Enter for the next match, Shift+Enter for the previous one and Esc to close. Searches aren't saved with the view. ### More view actions The **…** button in the grid toolbar has **Import CSV…** (if you can add records) and **Download CSV**, which exports the view as you see it. See [Bases, tables and records](https://openrows.io/docs/bases-and-tables). ## Grid The grid is the spreadsheet view. For editing, copy and paste, the fill handle and undo, see [Bases, tables and records](https://openrows.io/docs/bases-and-tables). Column headers have a menu with **Freeze up to this field**, **Unfreeze columns**, **Move left**, **Move right**, **Select column**, **Reset width** and **Hide field**, plus field actions for people who can edit the schema. Drag a header to reorder columns and drag its right edge to resize. The summary bar at the bottom shows sums under number fields and counts under checkboxes. ## Kanban A kanban view shows records as cards in stacks, one stack per option of a single select field or per person in a user field (one person per cell). The first stack holds records with no value ("Uncategorized", or "No *field name*" for people). - **Stacked by** chooses the field. A new kanban view asks for it first. - **Customize cards** sets the **Cover image** (an attachment field), **Collapse empty stacks** and the **Fields on cards**. - Drag a card to another stack to change its value. Where you drop it within a stack is saved as the view's manual order, unless the view is sorted. - **New record** at the bottom of a stack creates a record with that stack's value. - **Add stack** at the end of the board adds an option to the single select (owners and creators). Keyboard: arrow keys, Home and End move between cards; Enter or Space opens a card; Alt+Up/Down moves a card within its stack; Alt+Left/Right moves it to the top of the next stack. ## Calendar A calendar view places records on days by a date field. - **Date fields** sets up to 5 pairs of a start field and an optional end field (**No end (single day)**). Records with an end date span several days. Date, date and time, created time and last modified time fields can be used, but only date and date-and-time fields can be moved. - In the same menu, **Colour events by** colours events by a single select field instead of by date field. - Switch between **Month**, **Week** and **Day**, and use **Today** and the arrows to move around. - Drag an event to another day, or drag the end of a range to change its length. The **+** on a day creates a record on that day. - **Undated** opens a panel of records without a date. Drag one onto a day, or click its calendar button to schedule it on the day you're viewing. Keyboard: Enter opens an event; Alt+Left/Right moves it a day; Alt+Up/Down moves it a week (a day in the Day layout); Alt+Shift+Left/Right shortens or lengthens a range. The week starts on Sunday. A calendar shows up to 1,000 records in the visible range; filter the view or switch to a week if you have more. ## Gallery A gallery shows records as cards. **Customize cards** sets: - **Cover image**: an attachment field whose first image tops each card. Tick **Fit the whole image** to show all of it instead of cropping. - **Card size**: **Small**, **Medium** or **Large**. - **Fields on cards**: the fields under the title (the primary field). Arrow keys move between cards and Enter opens one. **New record** adds a card. ## Timeline A timeline draws each record as a bar from its start date to its end date. Open **Timeline settings** to choose: | Setting | What it does | | --- | --- | | **Start date**, **End date** | The date fields the bars span | | **Group by** | Groups rows under the options of a single select | | **Colour by** | Colours bars by a single select | | **Dependencies (Gantt)** | A link field to records in the same table. Arrows run from each record it waits for, and turn red when the record starts before its predecessor ends | Zoom by **Day**, **Week** or **Month**, and use **Today**, **Earlier** and **Later** to move along. Drag a bar to move it, or drag either edge to change its dates. Keyboard: Up/Down moves between bars; Enter opens one; Alt+Left/Right moves the bar a day (a week in the week and month zooms); Alt+Shift+Left/Right changes its end date. The timeline has no sort menu and shows up to 1,000 bars at a time. ## List A list view shows records as a tree. Open **Customize list** and choose a field in **Nest under**, a link to records in the same table (for example, "Parent task"). Each record then sits under the first record that field links to. Pick **Don't nest** for a flat list. **Fields in rows** chooses what shows beside each title. Click a chevron, or press Left or Right, to collapse or expand a branch. Enter opens a record. A list loads up to 5,000 records. ## Form A form view turns a table into a form that adds a record per submission. See [Forms](https://openrows.io/docs/forms). ## Sharing a view Owners and creators can share a grid, kanban, calendar, gallery, timeline or list view with a read-only public link, optionally with a password or an email-domain limit, and embed it on a website. See [Sharing and permissions](https://openrows.io/docs/sharing). # Sharing and permissions Source: https://openrows.io/docs/sharing Invite people to a workspace or a single base, choose their role, narrow who can edit a table or field, and share read-only links to views and bases. ## Roles Everyone in a workspace has one of five roles. From highest to lowest: **Owner**, **Creator**, **Editor**, **Commenter** and **Read only**. Each role can do everything the roles below it can. | What you can do | Read only | Commenter | Editor | Creator | Owner | | --- | --- | --- | --- | --- | --- | | See bases, tables, records, views and comments | Yes | Yes | Yes | Yes | Yes | | Download a view as CSV, export a base as a ZIP | Yes | Yes | Yes | Yes | Yes | | Comment and react, edit or delete your own comments | | Yes | Yes | Yes | Yes | | Add, edit and delete records, upload attachments | | | Yes | Yes | Yes | | Import a CSV into a table, restore values from a record's history | | | Yes | Yes | Yes | | Create, change, duplicate and delete views and view sections | | | Yes | Yes | Yes | | See the base's trash, restore deleted records and views | | | Yes | Yes | Yes | | Create bases, import from Airtable | | | | Yes | Yes | | Create and change tables and fields, lock views | | | | Yes | Yes | | Set table and field edit permissions | | | | Yes | Yes | | Create share links, embeds and public form links | | | | Yes | Yes | | Manage snapshots, webhooks and automations | | | | Yes | Yes | | Delete anyone's comment | | | | Yes | Yes | | Invite people and change roles (up to Creator), share a base | | | | Yes | Yes | | Restore deleted tables, fields and bases, delete permanently from the trash | | | | Yes | Yes | | Grant, change or remove the Owner role | | | | | Yes | | Rename or delete the workspace, manage billing | | | | | Yes | Notes: - Inside a base, your role is the higher of your workspace role and your role on that base. A base role can raise your access, never lower it. Workspace owners are owners of every base. - Edit permissions on a table or field can narrow what editors, creators and owners may change (see below). - A locked view can only be reconfigured by creators and owners. Personal views are seen only by the person who made them. See [Views](https://openrows.io/docs/views). - Personal access tokens never get more than your role allows, and can't manage members, sharing, permissions or snapshots. See [Getting started](https://openrows.io/docs/getting-started) and the [REST API](https://openrows.io/docs/api). ## Workspace members and invitations Open **Members** from Home's sidebar or the workspace switcher. Everyone sees the member list; creators and owners also see **Invite people** and **Pending invitations**. To invite someone: 1. Type their email address and pick a role (Editor is preselected). 2. Click **Invite**. They get an email with a link. It works for 7 days and only for that address. 3. When they open the link, they sign in (or sign up) with that email and click **Accept invitation**. If the email couldn't be sent, the invitation is still saved; use **Resend** to try again. Resending replaces the old link, so only the newest email works. Revoke a pending invitation with the trash icon next to it. Change a member's role with the role menu on their row, or remove them with the remove button. Rules: - Creators can invite and manage people up to Creator. Only owners can grant, change or remove the Owner role. - A workspace always keeps at least one owner. Make someone else an owner before you step down or leave. On the hosted service, your plan's limits apply (see https://openrows.io/pricing); self-hosted instances have no limits. ## Base collaborators To give someone access to one base without adding them to the whole workspace, open the base and click **Share** in the top bar (creators and owners). The **Share** dialog lists everyone who can reach the base under **People with access**, with where their access comes from: "Base only", "Workspace editor", or "Workspace editor, raised on this base". - Invite by email with a role on this base: Creator, Editor, Commenter or Read only. Base invitations work like workspace invitations, and accepting one opens the base. - For workspace members, you can only pick their workspace role or higher. **Reset to workspace role** drops the raise. - For base-only collaborators, **Remove from base** takes away their access. - Base-only collaborators have no workspace role, so they don't see the workspace's Members page. ## Interface-only collaborators To share an interface without its base, open the interface's page (**Interfaces** in the base's top bar) and click **Share** (creators and owners). Invite people by email with **Can view** or **Can edit**. They see the interface's published pages at their own address, and under **Interfaces shared with you** on Home, but never the base, its grid, its other interfaces or the fields a page doesn't show. - **Can view**: read the pages. - **Can edit**: also change the fields a record review page marks as editable (on the records the page lists) and submit its form pages. - A page filter on a user field or **Created by** set to **Me** shows each viewer their own records, interface-only collaborators included. They can be assigned in the base's user fields. - People with access to the base see its interfaces already, so they aren't invited to one. - Buttons that run automations and file downloads aren't available to interface-only collaborators yet. ## Edit permissions Edit permissions narrow who can change data. Everyone with access still sees every record and field; permissions only limit changes. They never give more than a person's role: a commenter or read-only member listed in a permission still can't edit. ### Table permissions In the base's sidebar, open a table's menu and choose **Edit permissions**. Set each of: - **Who can add records** - **Who can delete records** - **Who can edit records** ### Field permissions Open a field's header menu and choose **Edit permissions**, then set **Who can edit this field**. When the table also limits editing records, both apply. When editors can't edit the field, you can tick **Allow this field to be filled through forms** so public forms can still set it on the records they create. See [Forms](https://openrows.io/docs/forms). ### Permission levels | Level | Who passes | | --- | --- | | Editors and up | Everyone who can edit records (the default) | | Creators and up | Creators and owners | | Specific people | The roles you tick (all owners, creators or editors) and up to 100 people you pick | | Nobody (read-only) | No one; the field or action is locked for everybody | As in Airtable, owners and creators are bound by these permissions too; they can change the permission instead. Restricted tables and fields show a lock icon. ## Share links A share link gives anyone who has it a read-only copy of a view or a whole base, without signing in. Creators and owners make them. - **A view:** open the view's menu in the sidebar and choose **Share view**. Grid, kanban, calendar, gallery, timeline and list views can be shared. Visitors see the view's records and visible fields; hidden fields and other views stay private. Form views have **Share form** instead (see [Forms](https://openrows.io/docs/forms)). - **A whole base:** click **Share** in the top bar and use **Share link to the whole base**. Visitors see every table as a tab and can pick among its shared views. Personal views and hidden fields stay private. ### Creating a link Fill in the options, then click **Create link**: | Option | What it does | | --- | --- | | Expires (optional) | The link stops working at the end of that day | | Password (optional) | Visitors type it before they see anything. At least 8 characters | | Only people signed in with an email at (optional) | Visitors must sign in with a verified email at one of these domains (up to 20), for example `example.com, example.org` | | Allow copying data out | On by default. When off, visitors can't select or copy data from the page | | Allow CSV download | Off by default. When on, visitors get a **Download CSV** button for the view they're looking at | | Sites that may embed it (optional) | https sites allowed to show the link in an iframe (see Embeds) | The new link appears once, under "New link (copy it now: it won't be shown again)". Click **Copy link**. OpenRows keeps only a fingerprint of the link, so it can't show it to you again; make a new one if you lose it. ### Managing links Every live link is listed under **Active links** with when it was made, its expiry and short badges such as "Password", "Only example.com", "No copying" or "CSV download". - **Settings** changes the password (or **Remove the password**), domains, toggles and embed sites. The link itself stays the same. - **Revoke** turns the link off at once. Revoked and expired links show "This link isn't available" to visitors. ### What visitors see - A read-only page with the base or view name and a **Read-only** badge. - With a password: a password prompt. After 10 attempts from one place, they wait up to 15 minutes. Once unlocked, the link stays open in that browser for 12 hours, or until it expires if that is sooner. Some servers also show a CAPTCHA. - With email domains: **Sign in to view**. Visitors signed in with another domain see "Your account can't open this link". ## Embeds You can show a share link inside another website, such as an intranet page. 1. In the link's settings, add the site under **Sites that may embed it**, as an https origin like `https://intranet.example.com` (up to 20 sites). Every other site is refused. 2. When you create a link, the **Embed code** box below it holds an iframe snippet. Pick a **Theme** (Light, Dark or Match the visitor) and click **Copy code**. 3. Paste the code into a page on the allowed site. The embed is a compact read-only page with a "View in OpenRows" link. You can add embed sites to a link later; the embed code stays the same. Links with a password or email domains aren't embedded unless you also tick **Allow embedding even with a password or email domains**. Asking for a password or a sign-in inside another site's page invites phishing, and many browsers block the cookies it needs. In an embed, the sign-in opens in a new tab. ## Notifications The bell in the top bar collects your notifications: - someone mentions you in a comment, - someone replies on a record you commented on, - someone adds you to a user field that has **Notify collaborators when they're added** turned on. Click a notification to open the record, or **Mark all as read**. You only see notifications for records you can still read. ### Email preferences In **Settings**, under **Email notifications**, choose: | Setting | Choices | | --- | --- | | What | All notifications, Only mentions, or Nothing | | When | Right away (one email per record, at most every 10 minutes), Hourly digest, or Daily digest | The bell always shows everything, whatever you pick for email. Each notification email also has a one-click unsubscribe link, which offers "Only when I'm mentioned" or turning emails off. ## Related - [Views](https://openrows.io/docs/views): personal, collaborative and locked views - [Forms](https://openrows.io/docs/forms): public form links - [Bases, tables and records](https://openrows.io/docs/bases-and-tables): comments, trash and exports - [Webhooks](https://openrows.io/docs/api/webhooks) and [Automations](https://openrows.io/docs/automations) # Forms Source: https://openrows.io/docs/forms A form view turns a table into a public form. Anyone with the link can fill it in, and each submission adds a record to the table. ## Creating a form In the base sidebar, click **Create view** and pick **Form**. The form builder opens with three parts: - On the left, the **Fields** tab lists the fields on the form, and the **Settings** tab holds the form's own settings. - On the right, a live preview shows the form as submitters will see it. You can try it out, but answers in the preview aren't saved. Editors and above can build forms. Owners and creators can lock a form view so that only they can change it, and only owners and creators can publish a form link. See [Views](https://openrows.io/docs/views) for locking and the other view options. ## Adding and arranging fields Under **Add a field**, click a field to put it on the form, or click **Add all**. To take a field off, click its remove button. Drag fields to reorder them, or focus one and press Alt+Up/Down. Computed, automatic and button fields can't be on a form: formula, lookup, rollup, count, autonumber, created time, last modified time, created by, last modified by and button. Every other field type can be added. Icons next to each field in the list show that it is **Required** (an asterisk), **Shown on conditions**, or **Not on the public form**. Open the field's settings to see why a field stays off the public form. ## Field settings Click a field in the list to open its settings: | Setting | What it does | | --- | --- | | **Label** | The question shown on the form. Leave it empty to use the field's name | | **Help text** | Shown under the label. Takes simple Markdown: bold, italic, links and lists | | **Required** | Submitters must answer before they can submit | | **Allow prefill from the form's link** | Lets the form's URL fill in this answer (see [Prefilling answers](#prefilling-answers)) | | **Show only when conditions match** | Shows the field only when earlier answers match (see [Conditional fields](#conditional-fields)) | | **Records people can pick** | Linked record fields only: the view whose records submitters can choose from | ### Conditional fields Tick **Show only when conditions match** and add conditions on fields above this one on the form, with the same operators as view filters. With more than one condition, choose **all match** or **any matches**. A field can have up to 50 conditions. A hidden field's answer counts as empty, so hiding a field also hides any field that depends on it. Answers to hidden fields aren't sent, and a required field only needs an answer while it is shown. ### Linked record fields A linked record field appears on the public form only after you choose **Records people can pick**: a collaborative view of the linked table. Submitters can search that view's records by their primary field and pick one, or up to 100 when the field allows several. They see nothing but the records' primary field values. ### Fields that stay off the public form Some fields show in the builder but not on the public form: - **User fields**, because anyone with the link would see your collaborators. - **Linked record fields** without a view to pick from. - **Fields editors can't edit**, because of the field's edit permissions. To let forms fill such a field anyway, open the field's **Edit permissions** and tick **Allow this field to be filled through forms**. See [Sharing and permissions](https://openrows.io/docs/sharing). If the table's own permissions stop editors from adding records, the form takes no submissions at all. ## Form settings The **Settings** tab sets: | Setting | What it does | | --- | --- | | **Title** | The form's heading. Defaults to the view's name | | **Description** | Text under the title, in simple Markdown | | **Cover image** | A banner across the top of the form (PNG, JPEG, GIF or WebP) | | **Logo** | A logo above the title (same image types) | | **Submit button** | The button's label. Defaults to "Submit" | | **After a submission** | **Show a message** (your own text, or a default thank-you) or **Redirect to a URL** | | **Show "Made with OpenRows"** | The branding line at the foot of the form | Redirects accept full `https://` addresses only. Until you set one, submitters see the message instead. On the hosted service, removing the branding needs a paid plan (see https://openrows.io/pricing). Self-hosted instances have no limits. ## Publishing the form Open the form view's **…** menu in the sidebar and choose **Share form**, then click **Create form link**. Copy the link straight away: it is shown only once. Anyone with the link can fill in the form, signed in or not. The dialog lists the form's links. Click **Turn off** on a link to stop it working at once. With no links, the form is private. You can create a new link at any time. ## Prefilling answers You can fill in answers through the form's URL, as in Airtable. For each field with **Allow prefill from the form's link** ticked, add `prefill_` and the field's name: ``` https://app.openrows.io/f/