How to Use Row Duplication as a Template System in TableCrafter

Updated July 2026 • 7 min read • By Fahad Murtaza • By Fahad Murtaza

TableCrafter table builder, connect Gravity Forms, Google Sheets, Airtable, CSV, or JSON data sources
TableCrafter table builder, connect Gravity Forms, Google Sheets, Airtable, CSV, or JSON data sources

Entering the same base data over and over is one of the most common time drains in data-heavy workflows. TableCrafter's row duplication feature lets you clone any existing Gravity Forms entry into a new, editable row with a single click, effectively turning any well-structured record into a reusable template. Combined with inline editing and role-based permissions, this pattern can eliminate repetitive data entry without building a custom input form 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. 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 native Gutenberg. Gravity Forms is active on over 10 million WordPress sites (Gravity Forms, 2025).

What Row Duplication Actually Does?

Row duplication is a Pro feature available in TableCrafter tables that are connected to a Gravity Forms data source. When a user clicks the duplicate icon on any row, TableCrafter calls the Gravity Forms API to create a brand-new entry that is an exact copy of the original. The new entry receives its own unique entry ID and a fresh submission timestamp, it is not a reference or alias to the source row.

Because the duplicated row is a full Gravity Forms entry, it inherits every field value from the original: text, numbers, dates, dropdown selections, checkboxes, and multi-select values. From that point forward, the original and the copy are completely independent. Editing one does not affect the other.

Under the hood: TableCrafter fetches the source entry with GFAPI::get_entry(), strips the id, date_created, and date_updated fields, sets a fresh date_created timestamp, then writes the cleaned copy using GFAPI::add_entry(). The new entry receives a fresh Gravity Forms entry ID. The table view reloads via an authenticated AJAX request to wp-admin/admin-ajax.php so the new row appears immediately without a full page reload.

Why This Works as a Template System?

Most teams reach for custom post types or separate template plugins when they need reusable records. With TableCrafter, you can get most of the same value using only features you already have in Pro.

The pattern works like this: create one or more "template" rows that contain your default values, standard rates, default status labels, pre-filled categories, or any baseline field content your team starts with every time. Give those rows a consistent naming convention such as TEMPLATE: Weekly Driver Report or TEMPLATE: Standard Rate Card. When a user needs a new record, they duplicate the template row, rename it, and fill in only the fields that differ. The Gravity Forms entry is real and fully editable from the moment it is created.

This approach has a few practical advantages over building a dedicated template system:

How Do I Set Up a Template Row?

Before you can duplicate rows, you need a TableCrafter table with inline editing enabled. Here is the recommended setup path:

  1. Go to TableCrafter → Tables → Add New in your WordPress admin.
  2. Select your Gravity Form as the data source and configure the columns you want visible in the table.
  3. Under the Features tab in the table builder, enable Inline Editing and Row Duplication.
  4. Save the table and embed it using your shortcode: [tablecrafter id="X"].
  5. Submit a Gravity Forms entry that contains your default field values. This becomes your first template row.
Tip: Use a dedicated column (such as a text field labeled "Record Type") with a value like TEMPLATE to distinguish template rows from live data. You can then create a filtered table view that hides template rows from regular users while keeping them accessible to admins.

Once your template row exists, inline editing lets you refine it at any time directly from the table, no need to go back into the Gravity Forms entry editor.

What Is Role-Based Permissions: Controlling Who Can Duplicate?

Pro Row duplication respects TableCrafter's role-based permission system, which operates at both the table level and the column level. This gives you fine-grained control over who can create new entries from templates.

For example, you might want dispatchers to be able to duplicate template rows and fill in trip-specific fields, while drivers can only edit a subset of columns on rows already assigned to them. The configuration lives in the Permissions tab of the table builder:

[tablecrafter id="12"]

A single shortcode renders the table with all permission rules applied server-side. Users who lack duplication rights simply do not see the duplicate icon, no client-side workarounds needed.

Security note: All duplication actions are validated server-side via nonce checks and WordPress capability checks in the AJAX handler. A user with no edit rights cannot trigger duplication even by crafting a direct request to wp-admin/admin-ajax.php.

How Does Combining Row Duplication with Other Pro Features Work?

Row duplication becomes significantly more powerful when paired with other Pro-tier features in the same table.

Status Badges

Map a field value like TEMPLATE or Draft to a distinct badge color using the status badges feature. Configure the badge mapping in the column's Display settings: choose the field, define the value-to-color mapping, and save. Template rows get a yellow "Template" badge (or whichever color you assign) while duplicated rows automatically start with a "Draft" badge, because the new entry inherits all source field values.

This visual separation is the key to making the template pattern legible at a glance. A dispatcher scanning a table with 50 rows can immediately identify template rows from live records without reading each row's content. The badge color updates in the cell in real time when a user edits the value inline, so transitioning a row from "Draft" to "Active" changes the badge color on save without any page reload.

Badge values do not have to match exactly with your workflow stages. Many teams use a single field with values like TEMPLATE, Draft, In Progress, Complete, and Archived, mapping each to a distinct color. The template rows use the TEMPLATE value, which you can filter out of any view intended for end users by adding a saved filter that excludes rows where that field equals TEMPLATE.

Column Fill (Bulk Action)

After duplicating multiple rows from a template, use the column-fill bulk action to set the same value across all new rows at once. The operation works by checking the checkboxes next to each duplicated row, clicking Fill Column from the bulk action toolbar, selecting the target column, entering the value, and confirming.

Under the hood, TableCrafter calls GFAPI::update_entry_field() once per selected entry in sequence, writing the value directly to each Gravity Forms entry. When the operation completes, the table re-renders the affected rows with the new values and reports how many entries were updated.

For example, a dispatcher who has just duplicated five template rows for trips going out in the same billing period can select all five, fill the Billing Period column with the current month value, and every row is updated in one step. No per-row cell editing required.

Column fill only works on columns with Allow Inline Edit enabled. Read-only columns are excluded from the fill target dropdown, ensuring users cannot overwrite fields that are intentionally protected.

Email Alerts

TableCrafter's email alert feature fires when an entry field changes value. Alert rules are configured in the table builder: specify the target field, the old value, the new value, and the recipient email address. When a row is duplicated from a template and a user then edits a monitored field, TableCrafter captures the old value before the write and compares it to the new value after. If the transition matches a configured rule, TC_Email_Alerts::fire_alerts() sends the notification.

A practical example: configure an alert for the Status field with old value Draft and new value Active, addressed to a team manager. When a dispatcher duplicates a template row, fills in trip details, and changes Status to Active, the manager receives an email notifying them that a new active record has been created. No custom PHP required beyond the table configuration.

This creates a lightweight approval-notification pipeline on top of the template workflow. The alert fires on the edit step, not the duplication step, so managers are not notified every time a template is cloned. Only completed, status-changed records trigger the outbound email.

Auto-Refresh

If multiple team members are working from the same table simultaneously, duplicating template rows and filling in data, enabling auto-refresh ensures everyone sees new rows as they appear without manually reloading the page. Auto-refresh is a free feature in TableCrafter that polls the server at a configurable interval, sends an authenticated request to wp-admin/admin-ajax.php, and replaces the table contents in the DOM with the fresh data.

Configure the interval in the table builder under Display Settings. The minimum supported interval is five seconds, though for collaborative data-entry workflows a longer interval such as 30 to 60 seconds prevents unnecessary server load while still keeping the table current for all participants.

The last-updated indicator, shown below the table when enabled, displays the time of the most recent successful refresh. This gives users confidence that the data they are seeing is current without needing to count seconds or manually reload. When a duplicate operation completes, the new row appears on the next refresh cycle for all other users viewing the same table.

[tablecrafter id="12" refresh="30"]
Note: The refresh attribute sets the polling interval in seconds. A value of 30 is a reasonable default for collaborative data-entry workflows without generating excessive server load.

What Is Practical Example: Driver Trip Report Templates?

Here is a concrete workflow that illustrates how a logistics or trucking operation might use this pattern. A dispatcher maintains three template rows in the main Loads Hauled table:

When a new trip needs to be logged, the dispatcher finds the matching template row, clicks duplicate, and a new entry appears at the top of the table. The dispatcher then edits only the fields that are unique to this trip: driver name, date, origin, destination, and load weight. Every other field is already correct from the template. Total time to create a complete, accurate trip record: under 30 seconds.

Column-level permissions ensure that drivers, who can view the table under their own role, cannot see or edit the Rate or Fuel Surcharge columns. The template rows themselves are hidden from driver views via a saved filter that excludes rows where Record Type equals TEMPLATE.

Filter tip: Create two separate table embeds using the same id value but different page contexts: one for admins that shows all rows including templates, and one for drivers that uses advanced filters to exclude template rows. Both shortcodes point to the same underlying table configuration.

Frequently Asked Questions

What does row duplication actually do?

Row duplication is a Pro feature available in TableCrafter tables that are connected to a Gravity Forms data source. When a user clicks the duplicate icon on any row, TableCrafter calls the Gravity Forms API to create a brand-new entry that is an exact copy of the original. The new entry receives its own unique entry ID and a fresh submission timestamp, it is not a reference or alias to the sourc

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.

The permission check runs server-side on every request. Frontend users cannot bypass column restrictions by modifying the HTML or disabling JavaScript, because TableCrafter evaluates the current user's role before the data leaves the server.

If this step produces unexpected output, check the source data directly in the connected system. TableCrafter passes data through without modification — if a cell displays an unexpected value, the source record contains that value. Use the TableCrafter debug log (Settings > Advanced > Debug Mode) to trace the exact query sent to the source and the raw response received, which narrows the diagnosis to either a source-side or rendering-side issue.