How to Display a Notion Database as a Live WordPress Table

Notion is where many teams keep their CRM, product roadmap, inventory, or content calendar, but Notion's own public-sharing options are limited. TableCrafter pulls records straight from a Notion database and renders them as a clean, read-only, filterable, sortable table on your WordPress site. This guide covers the configuration, the canonical use cases, refresh behavior, 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 the. Airtable has over 450,000 organization customers worldwide (Airtable, 2024).
Why Read-Only Display Is the Common Case?
Most teams want their Notion data visible on their website without letting site visitors change it. Read-only display is the right choice when:
- Data is managed entirely in Notion by your team, and visitors should only browse it
- The table is public-facing and you do not want anonymous visitors modifying records
- You are surfacing reference data: a roadmap, a directory, a product catalog, a knowledge base index
- You want the simplest possible setup with the fewest moving parts
Read-only mode also means your Notion integration only needs the Read content capability, no write access, which keeps the security surface area small.
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 1: How Do I Connect the Notion Database?
If you have not connected Notion yet, follow the full setup once: create an internal integration, share the target database with it, grab the database ID, and enter both in the TableCrafter builder. The complete walkthrough is in How to Connect a Notion Database to TableCrafter.
For read-only display, give your Notion integration only the Read content capability. You do not need Update content.
A read-only integration is a security best practice for public-facing tables. Even if the token leaked, it could not modify your Notion data.
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 2: How Do I Configure Columns for Display?
When the connection succeeds, TableCrafter reads every property from your Notion database and pre-builds a column for each. Tidy them for a public table:
- Toggle off internal properties visitors should not see (private notes, owner-only fields, scratch columns).
- Set readable column labels. Use plain language, not raw Notion property names.
- Keep Select and Status properties as badge columns so statuses read at a glance.
- Keep Date columns as dates so they sort chronologically and respect your configured date format.
- Set column widths and the default sort column.
For exactly how each Notion property type is flattened and rendered, see How to Map Notion Properties to TableCrafter Columns.
Leave the Edit toggle off. For a read-only table you do not need it, and an integration scoped to Read content cannot write back to Notion anyway.
Step 3: How Do I Enable Filtering, Search, and Sorting?
Read-only does not mean static. Visitors can still narrow down to the records they need:
- Enable Search to show a live search bar. Visitors type and rows filter in real time across all text columns (title and rich text properties).
- Enable Filters to show dropdown filters for Select, Status, and Multi-select properties, for example, filter a roadmap by Status or an inventory by Category.
- Enable Sort so visitors can click any column header to sort ascending or descending.
These interactions are client-side: they operate on the already-fetched dataset without extra Notion API calls, so filtering and sorting stay fast even on larger databases.
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.
Step 4: How Do I Place the Shortcode?
Go to any WordPress page or post where you want the Notion table to appear. In the Gutenberg editor, add a Shortcode block (search for "Shortcode" in the block inserter) or a Custom HTML block, then paste the shortcode. The id value is the number TableCrafter assigned when you saved the table — you can find it in the TableCrafter admin table list.
Choose the shortcode variant that matches your use case:
- A read-only table with search and per-column filters:
[tablecrafter id="1" filter="true" search="true"] - A plain display table with no controls:
[tablecrafter id="1"] - A table with search, filters, and a CSV export button for visitors:
[tablecrafter id="1" filter="true" search="true" export="true"]
After publishing or updating the page, view it in a private or incognito window while logged out to confirm the Notion data appears for public visitors. If the table appears empty, check that the Notion integration still has access to the database and that the cache TTL (configured in Step 3) has not expired stale data from a previous connection test. You can force a cache refresh by going to the table in the TableCrafter admin and clicking Clear Cache.
What Are the Canonical Use Cases?
Public Product Roadmap
Surface your Notion roadmap so customers can see what is shipped, in progress, and planned. Columns: Feature (Title), Status (Status property → badge), Target Quarter (Select), Description (Rich text). Filter by Status, sort by Target Quarter.
[tablecrafter id="2" filter="true" search="true"]
Team or Member Directory
Display a Notion people database as a directory. Columns: Name (Title), Role (Select), Team (Select), Email (Email → clickable mailto). Search by name, filter by Team. Notion People properties resolve to member names automatically.
Inventory or Asset Register
Show a Notion inventory database with Item (Title), Category (Select), Quantity (Number), Status (Status), and Location (Rich text). Filter by Category and Status, sort by Quantity. Numbers sort numerically, not as text.
Content Calendar
Publish your editorial calendar so contributors and clients can see what is scheduled. Columns: Title, Author (People), Publish Date (Date), Type (Select), Stage (Status). Filter by Type and Stage, sort by Publish Date.
Lightweight CRM View
Expose a filtered slice of your Notion CRM, for example, a partner or vendor list, with Company (Title), Tier (Select), Owner (People), Last Contact (Date). Filter by Tier, sort by Last Contact. Keep private deal values toggled off so only the public-safe columns ship.
How Does Refresh and Caching Work?
TableCrafter does not call the Notion API on every page view. When a table is requested, it serves cached rows if a recent copy exists, and re-fetches from Notion only when the cache has expired. This keeps pages fast and stays well within Notion's API rate limits.
- Lazy TTL caching is the default today: the first visitor after the cache expires triggers a refresh, and everyone else is served the cached copy until the next expiry.
- Set a longer cache interval (for example 300–3600 seconds) for high-traffic public pages to minimize API calls.
- Set a shorter interval if your Notion data changes frequently and freshness matters more than minimizing calls.
Scheduled, background refresh (so the cache is warmed on a timer rather than by the first visitor) is on the roadmap. Until then, the lazy TTL above governs how fresh the table is.
How Does Mobile Behavior Work?
TableCrafter tables are responsive by default. On narrow screens the table becomes horizontally scrollable rather than wrapping or truncating — the column headers stay fixed while the data rows scroll left-right. Badge columns (Select, Status, Multi-select) stay legible at small sizes because badge text is rendered at a fixed minimum width. The search bar and filter controls stack above the table in a single column on screens narrower than 600px, so visitors on phones can still filter before scrolling the table horizontally. No separate mobile configuration is required — the same shortcode renders correctly on phones, tablets, and desktops.
For tables with many columns (6 or more), consider enabling the column picker (available via the column visibility toggle in the table toolbar) so mobile visitors can hide columns they do not need and reduce horizontal scrolling. You can also configure a default column set for narrow screens via the Responsive Settings in the table builder: specify which columns are visible by default at mobile breakpoints without removing them entirely from the table configuration.
What Are the Next Steps?
- How to Connect a Notion Database to TableCrafter, full first-time setup
- How to Map Notion Properties to TableCrafter Columns, property type reference
- How to Display Airtable Data as a Read-Only Table, the same pattern for Airtable
Frequently Asked Questions
How Does Why Read-Only Display Is the Common Case Work?
Most teams want their Notion data visible on their website without letting site visitors change it. 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 including Notion.