How to Build a Searchable Gravity Forms Submission Log

Updated July 2026 • 7 min read • By Fahad Murtaza

TableCrafter live search, sorting, filtering, and pagination out of the box
TableCrafter live search, sorting, filtering, and pagination out of the box

The Gravity Forms built-in entry list is adequate for individual entry review but falls apart the moment you need to search across multiple fields simultaneously, filter by date range, or share a clean view with a non-admin team member. TableCrafter turns your GF entries into a fully searchable, filterable submission log in a few configuration steps. This guide builds a complete admin tool for a support team from scratch. 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. Google Sheets is used by over 1 billion people globally (Google, 2023).

What Is the Use Case: Internal Support Queue?

The target scenario: a support team uses Gravity Forms to capture inbound requests. Each submission has a requester name, email, subject, description, date, and a status field (Open, In Progress, Resolved, Closed). The team needs a page where they can:

None of this requires custom PHP. It is all TableCrafter configuration. Gravity Forms stores every submission in its entry database with a date_created timestamp and all field values. TableCrafter reads that data directly through the Gravity Forms API and renders it as an interactive table on any WordPress page. The support team gets a functional searchable log without custom development, without a third-party help desk subscription, and without moving their data outside of WordPress. The same pattern applies to any form-based internal workflow where a team needs to review and act on submissions: HR intake forms, vendor applications, event registrations, and maintenance request logs all follow the same configuration steps described in this guide.

This configuration interacts with any caching or CDN layer active on your WordPress installation. If you use WP Rocket, LiteSpeed Cache, or a CDN such as Cloudflare, flush the page cache after making this change to ensure the updated configuration is reflected in the cached HTML served to visitors. TableCrafter's server-side output is regenerated on the next uncached request.

Step 1: How Do I Design Your Gravity Form Correctly?

If you are building the form fresh, make the status field a Drop Down or Radio Buttons field with defined choices: Open, In Progress, Resolved, Closed. Using a constrained choice field (rather than a Text field) is what enables TableCrafter's dropdown filter on that column. A free-text status field can only support a text search filter, which is less useful for categorical data.

The date of submission does not need a field, Gravity Forms records a date_created timestamp automatically on every entry, and TableCrafter exposes this as a virtual column called Date Submitted.

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 2: How Do I Create the Table Configuration?

Go to TableCrafter > Tables > Create New Table. Select Gravity Forms as the data source and choose your support request form. Drag the following columns into the column zone, in order:

  1. Date Submitted (virtual column, always available)
  2. Name (the Name field, parent card for full name)
  3. Email
  4. Subject
  5. Status (your Drop Down field)
  6. Description (truncated to 80 chars with expand)

Set the Default Sort to Date Submitted, Descending so the newest entries always appear at the top. Leave the row limit at 25 for a dense but manageable view.

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.

Scroll to Table Options > Search and toggle Enable Search Bar on. The search bar performs a full-text scan across all visible columns simultaneously. When a user types "invoice" into the search box, TableCrafter returns every row where any column value contains that string, subject, description, name, or email.

Two sub-options appear once you enable the search bar:

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.

Search scope: The live search only scans columns that are included in the table configuration. If you did not drag the Description column into the column zone, searches will not match text inside descriptions even though that data exists in the database.

Step 4: How Do I Add Column-Level Filters?

Column filters appear as small filter icons in the column header row. Click any column card in the builder and open the Filter tab.

Date Submitted, Date Range Filter

In the Date Submitted column card, set Filter Type to Date Range. This renders two date-picker inputs above the table labeled From and To. The filter operates on the date_created field that Gravity Forms records automatically on every entry, so you do not need to add a separate Date field to your form. When a user selects a date range, TableCrafter sends those values to the server as filter parameters, and the query runs a WHERE condition against the stored entry timestamps. Only entries submitted within the selected window are returned, and the pagination record count updates to reflect the filtered total rather than the overall entry count.

Both boundary dates are inclusive. A range of June 1 to June 7 returns entries submitted on those dates as well as all days in between. Combining the date range filter with the Status filter produces precise cross-cut views: all Open tickets submitted this week for a team triage session, or all Resolved tickets from last month for a monthly performance summary.

Default date range: Set a default range in the column filter settings to pre-filter to the current month when the page loads. Under Filter Default, select Current Month from the preset dropdown. The team does not need to set a range manually on their first daily visit.

Status, Dropdown Filter

In the Status column card, set Filter Type to Dropdown. Because your Status field is a GF Drop Down with defined choices, TableCrafter automatically populates the filter dropdown with those same choices: Open, In Progress, Resolved, Closed, plus an All option at the top. No manual choice entry is needed.

Set the Filter Default to Open so the table loads showing only open tickets on every page visit. Team members click All or another status to change the view.

The filter works by passing the selected choice value to the server, which runs a WHERE condition against the stored GF field value for each entry. Only entries whose Status field contains the exact matching value are returned for the current page. If you later add a new status value to the GF Drop Down field (for example, Escalated), it appears in the filter dropdown automatically once at least one entry contains that value, with no table reconfiguration needed. The active filter value is also included as a URL query parameter, making it possible to bookmark a filtered view such as all In Progress tickets and share the direct link with a team lead for a quick status check without them having to manually apply the filter.

Email, Text Search Filter

In the Email column card, set Filter Type to Text. This adds a small text input in the Email column header row. Typing a partial email address immediately filters the table to rows where the email field contains that string. The filter uses a LIKE match against the stored GF field value, so typing "gmail" returns all entries submitted from Gmail addresses, and typing a company domain returns all entries from that organization.

This column-level text filter works alongside the global search bar. The global search scans across all visible columns simultaneously; the column-level Email filter applies specifically to the Email field only. A support agent who receives a phone call from a customer can type the customer's email into the column filter to pull up all their submissions instantly, without scrolling through the full log or needing to know the exact ticket number. The filter state accumulates with other active filters: applying the email filter, then changing the date range, then changing the status all combine into a single server query, so the team can narrow to a very specific subset of entries with a few independent filter selections.

Step 5: How Do I Enable the Export Button?

Scroll to Table Options > Export and toggle Enable Export Button on. Pro

Under Export Settings:

The export button appears in the top-right corner of the rendered table, above the search bar. It respects the current active filters and search terms at the moment the button is clicked.

Step 6: How Do I Configure Access Permissions?

This is an internal admin tool, not a public-facing page. Under Access & Visibility > Minimum Role to View, set the minimum role to Editor or a custom role specific to your support team. Users below that role see an access-denied message or an empty table, depending on your preference setting for unauthenticated access.

Do not use page-level password protection as the sole access gate. TableCrafter's role check is enforced server-side at the data query level: the AJAX endpoint that fetches table data also validates the current user's role before running the Gravity Forms entry query. A user who bypasses the page-level restriction still cannot retrieve the table data without the correct role assigned to their account.

If your WordPress site uses a custom role plugin such as Members or User Role Editor, create a dedicated Support role and assign it to your support team accounts. Set that role as the minimum view role in TableCrafter. This keeps support team access separate from the Editor role, which carries broader WordPress publishing permissions you may not want to grant. The Support role requires no WordPress content publishing capabilities; TableCrafter only verifies that the user's role exists at or above the configured minimum in the WordPress role hierarchy.

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 7: How Do I Place the Shortcode and Test?

Save the table configuration. Your shortcode will look like this:

[tablecrafter id="2" search="true" filter="true" export="true"]

Create a new page titled "Support Ticket Log" (or similar), set visibility to Private or restrict via your access control plugin, and paste the shortcode. Publish the page and test with a user account at your minimum required role.

Submit a few test entries through the Gravity Form, then reload the table page. Confirm the search bar returns correct results, the date range filter excludes entries outside the range, the status dropdown filter works, and the export downloads only the visible filtered rows.

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 Tip for Large Entry Sets Work?

If your form has accumulated tens of thousands of entries, enable Server-Side Processing in Table Options > Performance. With server-side processing on, TableCrafter fetches only the current page of results per request rather than loading all matching entries into the browser at once. Search and filter operations send AJAX requests to the server-side entries endpoint rather than filtering a client-side dataset. The user experience is identical to client-side mode: the table still sorts, filters, and paginates with the same controls. Memory usage and initial page load time improve significantly because the browser never receives more than one page of rows at a time.

Server-side processing is most important for forms that accumulate entries over months or years. A support log with 30,000 entries would take several seconds to load and filter in the browser without server-side processing. With it enabled, each paginated page request fetches only 25 or 50 rows. Search queries run as database WHERE conditions against the Gravity Forms entry meta tables rather than scanning a JavaScript array. Date range and status filters are applied in the SQL query before any data is sent to the browser. The record count shown in the table footer always reflects the total matching entries across all pages, not just the current page, so team members know how many tickets match their current filter combination even when viewing page one of many pages.

What Are the Next Steps?

Your submission log is now a functional internal tool. Natural extensions from here include enabling inline editing so support agents can update the Status column directly from the table without opening individual entries in wp-admin, setting up email alerts when a status changes to Escalated, or cloning the table configuration with a different default status filter to create a separate Resolved Tickets archive view.

To enable inline editing on the Status column, open the table configuration, scroll to Edit Mode, toggle Inline Editing on (Pro), then open the Status column card's Edit tab and set the input type to Dropdown. The same choices used for the status filter appear in the edit control, so agents can advance a ticket from Open to In Progress with a single click directly in the table. For the email alert, navigate to the Alerts tab and create a rule triggering on the Status column changing to Escalated, with the recipient set to a supervisor email address. To create the archive view, duplicate the table configuration, change the default status filter to Resolved, and embed the new shortcode on a separate page. Both views share the same underlying Gravity Forms data source and each is independently configurable without affecting the other.

Frequently Asked Questions

What Is the Use Case: Internal Support Queue?

The target scenario: a support team uses Gravity Forms to capture inbound requests. Each submission has a requester name, email, subject, description, date, and a status field (Open, In Progress, Resolved, Closed). The team needs a page where they can:

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.