How to Display Airtable Data as a Read-Only Table in WordPress

The simplest and most common Airtable use case in TableCrafter is a clean, read-only display: pull records from an Airtable base, show them in a filterable, sortable table on your WordPress site, and give visitors no ability to edit the underlying data. This guide covers the exact configuration, the canonical use cases where this pattern shines, and the shortcode to use. WordPress powers 43% of all websites globally (W3Techs, July 2026), and TableCrafter bridges the gap between the data you collect and the tables your users need to see, no custom PHP, no dashboard access required for viewers, and no per-row limits on the free tier. The free version on WordPress.org supports CSV, JSON, Google Sheets, and Excel. Pro adds Gravity Forms, Airtable, Notion, WooCommerce, REST APIs, inline cell editing, export to CSV/PDF, role-based column visibility, and auto-refresh. Every table embeds on any page with a [tablecrafter] shortcode or. Google Sheets is used by over 1 billion people globally (Google, 2023).
When Read-Only Is the Right Choice?
Not every table needs inline editing. Read-only display is the right choice when:
- Data is managed entirely in Airtable by a specific team and visitors should only browse it
- The table is public-facing and you do not want anonymous visitors modifying records
- You are displaying reference data: a product catalog, event schedule, team roster, or resource list
- You want the simplest possible setup with the fewest moving parts
Read-only mode also means you do not need write scope on your Airtable personal access token, which reduces the security surface area of the integration.
After completing this step, verify the result by viewing the page as a logged-out visitor in an incognito window. This confirms the table behaves correctly for public visitors rather than reflecting admin-level permissions that may hide configuration issues during initial setup. Check both the rendered output and the browser console for any JavaScript errors.
Step 1: How Do I Create the Personal Access Token (Read Scope Only)?
Go to airtable.com/create/tokens (sign in if prompted) and click Create new token. On the token creation screen:
- Under Scopes, add only
data.records:read. You do not needdata.records:write,schema.bases:read, or any metadata write scope — requesting extra scopes increases the blast radius if the token is ever leaked. - Under Access, select the specific Airtable base you are connecting. Granting access to all bases means this token can read any base in your workspace — scope it to the minimum needed.
- Name the token descriptively: "TableCrafter Read - [Site Name]" so you can identify it in the token list when rotating credentials later.
After clicking Create token, the token value is shown once — copy it immediately into a secure location. Airtable does not show the token value again after you close the creation dialog. If you lose it, you must rotate (revoke and regenerate) the token and update TableCrafter's data source settings with the new value.
Step 2: How Do I Configure the TableCrafter Data Source?
- In WordPress, go to TableCrafter → Add New Table.
- Name the table something descriptive, for example
Event CalendarorPublic Project Board. - Select Airtable as the data source.
- Enter your read-only personal access token, base ID, and table name.
- Optionally specify a view name to pull from a filtered or sorted Airtable view rather than showing all records.
- Click Test Connection and confirm fields are detected.
Using a specific Airtable view is particularly powerful for read-only display. You can create a filtered, sorted view in Airtable, for example, only showing published events sorted by date, and point TableCrafter at that view. Visitors see exactly the records you intend, without needing to configure filters in TableCrafter itself.
The column mapping you define here is stored as a JSON configuration in the WordPress database. You can export this configuration using the TableCrafter export tool and import it to another table or another site. This is useful when replicating a table layout across multiple pages or when migrating a table to a staging environment for testing before going live.
Step 3: How Do I Configure Columns for Read-Only Display?
With fields detected, configure which columns to show and how they render.
- Toggle off any internal fields visitors should not see (record IDs, internal notes, admin flags).
- Set readable column labels. Use plain language, not Airtable field names.
- For image URL fields, set the column type to Image so thumbnails render instead of raw URLs.
- For URL fields, confirm the column type is set to URL for clickable links.
- Set column widths and the default sort column.
Do not enable the Edit toggle. Leave it off entirely, this is what makes the table read-only.
TableCrafter re-fetches this data on each page load by default. If your data source updates infrequently and your site has significant traffic, enable the built-in caching option in the table's Performance tab. This stores the fetched data for a configurable number of minutes and serves it from WordPress transients, reducing API calls to the source and improving page load time for visitors.
Step 4: How Do I Enable Filtering and Search?
Read-only does not mean static. Visitors can still sort, search, and filter to find the records they need.
- Enable Search to show a live search bar above the table. Visitors can type and filter rows in real time across all text columns.
- Enable Filters to show dropdown filters for Select and Multi-select columns. For example, a project board can be filtered by Status; an event list can be filtered by Category.
- Enable Sort to allow visitors to click column headers to sort ascending or descending.
These features are all purely client-side in read-only mode, they operate on the fetched dataset without making additional API calls, which means fast interaction even on larger tables.
The configuration you set here applies to every visitor who loads a page containing this table, regardless of whether they are logged in. Role-specific overrides for columns and rows are a separate layer and do not replace these global display settings. Apply global settings first, then add role restrictions as needed for tables that serve multiple user types.
Step 5: How Do I Place the Shortcode?
Paste the shortcode into any WordPress page or post using a Shortcode block in the block editor, or directly in the Classic Editor. The shortcode you use determines what controls are visible to the visitor:
Read-only table with search and filters enabled:
[tablecrafter id="1" filter="true" search="true"]
Renders a full-featured read table with a search box above the data and dropdown filter controls for configured columns. Use this for member directories, product catalogs, or any table where visitors need to narrow down many records.
Read-only table with no controls — pure display:
[tablecrafter id="1"]
Renders just the table with headers and data rows. Use this for small reference tables (team roster, pricing tiers, feature comparison) where the number of rows is small enough that filtering is unnecessary.
Read-only table with export enabled:
[tablecrafter id="1" filter="true" search="true" export="true"]
Adds an Export button to the toolbar above the table. Visitors can download the current filtered view as CSV, Excel, or PDF depending on which formats you enabled in the table settings. Use this when visitors may need to take the data offline — event lists, vendor directories, public datasets.
What Are the Canonical Use Cases?
Public Project Board
Display a team's active projects with columns for Project Name, Status (Single select), Owner, Start Date, and Due Date. Visitors can filter by Status to see only In Progress or Completed projects, and sort by Due Date to see what is coming up soonest.
Under the hood, all filtering is client-side against a cached Airtable dataset. TableCrafter fetches your records using a personal access token stored encrypted with AES-256-CBC, derived from your WordPress AUTH_KEY salt, then writes the flattened row set to a WordPress transient (key gt_airtable_table_{id}). Cache lifetime is set by the json_refresh_minutes setting, defaulting to 30 minutes, clamped between 5 minutes and 24 hours. For an active project board that changes throughout the day, a 10-to-15-minute TTL balances freshness against Airtable API load. The Status column uses the singleSelect Airtable type, which the field mapper converts to a dropdown filter. The dropdown is populated from distinct values found in the cached row set, so options that have no matching rows are excluded automatically. Selecting a status applies AND logic alongside any other active filter controls, narrowing results to rows that satisfy all active conditions simultaneously.
Recommended configuration: filter by Status column, sort by Due Date ascending by default, search enabled.
[tablecrafter id="2" filter="true" search="true"]
Content Calendar
Publish your editorial calendar publicly so contributors, clients, or partners can see what is scheduled. Columns: Title, Author, Publish Date, Content Type (Single select), Status. Filter by Content Type and Status; sort by Publish Date.
For a content calendar, point TableCrafter at an Airtable view that only shows records with Status not equal to Draft, so internal drafts stay private while the public calendar shows scheduled and published items.
Title maps to the singleLineText column type and is fully searchable via the global search bar using case-insensitive substring matching. Publish Date maps from Airtable's date type, and TableCrafter formats it using the date pattern configured in your global settings. The cache TTL controls how quickly newly scheduled items appear on the public-facing calendar; a 15-minute TTL means a record published in Airtable appears on the WordPress page within 15 minutes, with no WordPress publish action required. Content Type and Status both use the singleSelect Airtable type, each generating its own dropdown filter control. When a visitor selects values in both dropdowns simultaneously, AND logic applies across the two controls, returning only rows that match both the chosen content type and the chosen status at the same time.
Event List
Display upcoming events with Name, Date, Location, Category, and a Registration URL column. Filter by Category, sort by Date ascending, and use a date range filter on the Date column so visitors can find events in a specific window.
Use an Airtable view filtered to only show events with a date greater than or equal to today, so past events automatically drop off without any maintenance on the WordPress side.
Airtable's date type is mapped to a date column in TableCrafter, which activates a From/To date range picker for that column. Dates are parsed from ISO 8601 format and compared inclusively, so a range from June 1 to June 30 includes records on both boundary dates. The Registration URL field maps from the Airtable url type and renders as a clickable anchor element opening in a new browser tab. You can set a static label such as "Register" in the column settings so all rows show a consistent link label rather than the raw URL string. Filtering is client-side against the cached row set, so selecting a date window and a category simultaneously returns instant results without any additional call to the Airtable API.
Resource Library
A table of downloadable resources, guides, templates, case studies, with Name, Type (Single select), Description, and a File URL column. Display the File URL column as a link with a static label like Download. Filter by Type so visitors can browse by resource category.
The File URL field uses Airtable's url type, which the field mapper converts to a url column in TableCrafter. The cell renders as an HTML anchor element with target="_blank", opening in a new tab. Setting a static label override in the column settings applies the same label text to every row, so visitors see "Download" regardless of what the raw URL contains. If resources also have a preview thumbnail stored as an Airtable attachment field, map that multipleAttachments column to the image type in the builder; the field mapper assigns image by default when it detects the multipleAttachments Airtable type, so no manual override is needed in that case. The Type dropdown filter is built from distinct values in the cached row set, so adding a new resource type in Airtable causes it to appear in the filter dropdown automatically after the next cache refresh, requiring no TableCrafter configuration change.
Team or Vendor Directory
A listing of team members or vendors with Name, Role/Category, Location, and Contact. Search by name, filter by Role. Display a photo URL column as an image thumbnail. This is a lightweight version of the full member directory recipe, for the complete build, see How to Build an Airtable-Powered Member Directory.
To display a photo stored as a plain URL in Airtable, use a singleLineText field and override the column type to Image in the TableCrafter builder. TableCrafter then renders the value as an <img> element rather than raw text. For photos stored as Airtable attachment fields, map the multipleAttachments column to the image type; the field mapper assigns that type by default when it detects multipleAttachments, so no manual override is needed. The Role or Category column uses Airtable's singleSelect type and renders as a dropdown filter; selecting a role shows only members or vendors assigned that value. The global search bar runs a case-insensitive substring match across all visible text columns, including Name, Location, and Contact simultaneously, so typing a city name filters the directory to members in that location without requiring a separate Location dropdown filter to be configured.
How Does Locking Down Editability at Multiple Levels Work?
TableCrafter has two places where edit mode is controlled. Both must have editing disabled for a truly read-only table:
- Table configuration: The Edit toggle in the table settings. If off here, the table is read-only regardless of the shortcode.
- Shortcode parameter:
edit="true"enables editing. If you do not include this parameter (or includeedit="false"), the table is read-only at the shortcode level even if the table config has editing enabled.
For a public-facing read-only table, the safest approach is to disable editing in the table configuration. This means even if someone copies and modifies the shortcode in a page editor, they cannot enable editing.
This step completes the connection between your data source and the TableCrafter table engine. Once saved, the plugin caches the connection credentials in the WordPress options table and uses them on every subsequent page load. If you update the source configuration later — for example, rotating an API key or changing a sheet URL — return to this step, enter the new value, and save again. The table updates immediately on next load without any shortcode changes.
How Does Performance Considerations for Read-Only Tables Work?
Read-only tables load slightly faster than editable tables because TableCrafter skips loading the inline editing JavaScript bundle — a bundle that is only needed when edit="true" is present in the shortcode. For public pages with high traffic, this can reduce per-visit JavaScript payload by 15-30KB depending on which edit features are configured.
For public pages with meaningful traffic, combine read-only mode with a longer cache TTL (300-3600 seconds) in the data source settings to minimize Airtable API calls. At 60-second TTL with 500 concurrent visitors, TableCrafter would fire 500 independent Airtable API requests per minute — well over the Airtable API's free tier limit of 5 requests per second per base. At 300-second TTL, it fires only 1 API call per 5 minutes and serves all 500 visitors from the WordPress transient cache. For truly static reference data, TTLs of 3600 seconds or longer are appropriate. See How to Keep an Airtable Table in Sync with Your WordPress Site for full caching configuration details.
Frequently Asked Questions
How Does When Read-Only Is the Right Choice Work?
Not every table needs inline editing. Read-only display is the right choice when:
What Is TableCrafter?
TableCrafter is a WordPress plugin that turns data from Gravity Forms, Google Sheets, Airtable, Notion, REST APIs, CSV files, and WooCommerce into interactive, sortable, filterable frontend tables. Embed any table on any WordPress page with the [tablecrafter] shortcode or the native Gutenberg block. No PHP or custom development required. The free version supports CSV, JSON, Google Sheets, and Excel. Pro adds Gravity Forms, Airtable, Notion, WooCommerce, REST APIs, inline cell editing, export to CSV and PDF, role-based column visibility, and auto-refresh.
Does this require PHP or developer skills?
No. TableCrafter is configured entirely through the WordPress admin interface. You choose your data source, map fields to columns, and set display preferences using point-and-click controls. Embedding uses the [tablecrafter] shortcode or the native Gutenberg block.
Is the free version sufficient or do I need Pro?
The free plugin on WordPress.org supports CSV, JSON, Google Sheets, and Excel sources with unlimited tables, rows, and columns. Pro adds Gravity Forms, Airtable, Notion, WooCommerce, REST API sources, inline cell editing, bulk row actions, export to CSV and PDF, role-based column visibility, and auto-refresh every N seconds.
Ready to try it?
TableCrafter is free on WordPress.org. Pro unlocks inline editing, role-based permissions, and advanced data sources.