How to Display a Product Catalog from Google Sheets in WordPress

TableCrafter can render a full product catalog from a Google Sheet, complete with product images, category dropdown filters, and price-range filtering, without WooCommerce or any e-commerce plugin. This is ideal for wholesale catalogs, equipment lists, parts directories, or any product display where purchasing happens off-site or via inquiry. 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 native Gutenberg block. WooCommerce processes over 7 billion dollars in orders monthly across all installations (WooCommerce, 2024).
When to Use This Instead of WooCommerce?
This approach is not a WooCommerce replacement for transactional stores. It fits display-and-inquiry use cases where the purchase happens off-site, by phone, or through a separate quoting process:
- Wholesale catalogs where buyers call or email to place orders rather than checking out online
- Equipment or parts lists with no online checkout, where buyers confirm availability before ordering
- Service provider directories that list pricing for reference, with inquiries handled by a contact form
- Internal product reference sheets for sales teams who need a searchable, filterable catalog without spreadsheet access
- Manufacturer catalogs maintained by a product team in Google Sheets, where the catalog changes frequently and the team should not need WordPress access to update it
If you need a cart, checkout flow, inventory depletion, tax calculation, and shipping labels, use WooCommerce. TableCrafter can also pull from WooCommerce as a data source, so these approaches are not mutually exclusive: you can run WooCommerce for transactional products and use a TableCrafter table to display a filtered catalog view on a separate page, for example a "Quick Reference" page for sales staff that shows stock levels and SKUs without the full storefront experience.
Step 1: How Do I Structure the Google Sheet?
A product catalog sheet that maps cleanly to TC columns looks like this:
SKU | Product Name | Category | Subcategory | Price | Stock Status | Description | Image URL | Spec Sheet URL
Column-by-column guidance:
SKU
Plain text, uppercase, consistent format. Visitors may search or filter by SKU directly if they already know the product code. Keep the SKU column first so it acts as a natural row identifier across the table.
Choose a SKU format and apply it consistently to every row before connecting the sheet. Common formats include a category prefix followed by a number (for example PMP-0042 for a pump product), or a sequential alphanumeric code. Inconsistent formats such as mixing PMP042 and PMP-042 in the same column create two distinct search results where one was intended and prevent reliable filtering. Define the format once in a Sheets data validation rule on the SKU column to enforce consistency as new products are added. TC's search function treats SKU as a text column and returns partial matches, so a visitor searching for PMP will see all pump-category products whose SKU starts with that prefix.
Product Name
The display name shown in the table cell. Keep it under 60 characters so it does not wrap badly in standard column widths. Long product names that span multiple lines increase the vertical height of each row significantly and make the table harder to scan.
If your catalog uses long technical names such as full model designations or regulatory names, add a separate Short Name column alongside the full name. Map the Short Name column as the visible display column in TC and mark the full Technical Name column as visible only in the expandable row detail panel. This keeps table rows compact while still making the full name available to visitors who click through for details. TC's search can be configured to search across both columns simultaneously, so visitors searching by either the short name or the full technical designation will find the product.
Category and Subcategory
Separate columns make two-level filtering possible. Category might be Pumps and Subcategory Centrifugal. Using separate columns lets TC build independent dropdown filters for each level, so a visitor can first filter to "Pumps" and then narrow further to "Centrifugal" without needing to know the full path. A single concatenated column like Pumps > Centrifugal only allows filtering on the full combined string, which requires visitors to know the exact value.
Use exact, consistent spelling across every row in both columns. A single typo such as "Centrifuguel" instead of "Centrifugal" creates a new distinct filter value that contains only the typo'd rows. Run a Sheets data validation dropdown rule on both columns using a defined list of approved category names, and restrict entries to reject any other input. This prevents values like "pumps" (lowercase) or "Centrifugal " (trailing space) from appearing in the column and creating orphan filter values. Review the distinct values in each column periodically to catch any values that slipped past validation, especially after bulk data imports where validation rules may not have been enforced.
Price
Numeric values only: no dollar signs, no commas, no text such as "call for pricing." Enter 1299.99 not $1,299.99. TC's Number column type and price-range filter require clean numeric values to compute comparisons and render range sliders correctly. Non-numeric characters in even one row of the Price column will cause that row to sort incorrectly and fall outside range filter results.
TC's column formatter handles display formatting independently from the stored value. Set the Price column's display format to Currency in the column editor, and TC will prepend $ and add comma separators when rendering the cell, without altering the underlying numeric value used for sorting and filtering. For products without a list price, use a separate "Pricing Type" text column (values like "List Price," "Quote Only," "Contact Sales") rather than putting text in the Price column. This keeps Price numerically clean while still communicating pricing availability to visitors.
Stock Status
Text values like In Stock, Low Stock, Out of Stock, Discontinued. TC renders these as color-coded badges using badge rules configured per column in the column editor. The badge rules match cell values exactly, so the values in your sheet must match the badge rule text precisely, including capitalization and spacing.
Define the allowed values in a Sheets dropdown validation rule (Data → Data validation → Dropdown from a list) before you start entering data. Restrict entries to a fixed list of approved values and reject any other input. This prevents variations like "in stock" (lowercase) or "Out-of-Stock" (with a hyphen) from appearing in the column and bypassing the badge rules. Configure TC badge rules for each valid value in Step 4 of this guide. Visitors can also filter by Stock Status using the dropdown filter enabled in Step 5, so consistent values directly determine whether the filter works as expected for all visitors.
Description
Keep the Description cell brief: one to two sentences for the table-visible teaser. Long descriptions force the cell to expand vertically, breaking the visual scannability that makes a catalog table useful. TC's expandable row detail panel shows the full description when a visitor clicks a row, so the cell only needs enough text to identify the product category and primary use case.
A good teaser sentence follows the pattern "Product type + primary application + one key differentiator." For example: "Heavy-duty centrifugal pump designed for high-viscosity industrial fluids with a 316 stainless steel impeller." That gives visitors enough context to decide whether to click for more details. Store the complete product description including specifications, certifications, and dimensions in the Description column and configure TC to show it only in the expandable panel. This keeps table rows compact while making the full detail available on demand to visitors who need it.
Image URL
Full HTTPS URL to the product image. The image must be publicly accessible since TC fetches it at render time. Google Sheets itself cannot serve images for external table rendering. Options for where to host the images:
- Upload images to your WordPress media library and use the direct image URLs. These are permanent and fast since they are served from your own host without a third-party dependency.
- Use a CDN or image hosting service such as Cloudinary or Imgix. CDN-hosted images add performance benefits through edge caching and on-the-fly image optimization.
- Use Google Drive public image links (File → Share → Anyone with the link, then use the direct image URL format:
https://drive.google.com/uc?id=FILE_ID). Google Drive hosting works but is less reliable long-term since Google occasionally changes how Drive serves public files.
In the TC column editor, set the Image URL column type to Image. This tells TC to render the cell as an <img> tag rather than displaying the URL string. Set a maximum image width of 80 pixels for the table view to keep thumbnail rows at a reasonable height. The full-size image can appear in the expandable row detail panel when a visitor clicks the row.
Spec Sheet URL
Full HTTPS URL to a PDF spec sheet, a product page on the manufacturer's site, or any other reference resource buyers need. Set the TC column type to URL. TC renders the cell as a clickable hyperlink rather than displaying the raw URL string.
In the TC column editor, set a Link label such as "View Specs" or "Download PDF" so visitors see a clean label instead of a full URL string in the table cell. Leave the cell blank in Sheets for products that do not have a spec sheet. TC renders blank URL cells as empty cells with no broken link placeholder. If some products link to PDFs and others to external product pages, one Spec Sheet URL column handles both; visitors see the same link label regardless of the destination URL type. For catalogs where you need to distinguish PDF downloads from external links, add a second column with a type label value and map it alongside the URL.
Step 2: How Do I Connect the Sheet?
Product catalogs typically contain pricing and inventory information you do not want exposed as a raw publicly accessible CSV. Use the private API method with an API key restricted to the Google Sheets API and scoped to your domain. This ensures the catalog data is only accessible through your API key, not through an open URL that anyone can download or monitor for changes.
Set Sync Interval to hourly. Product catalogs change less frequently than live leaderboards or event schedules. An hourly sync provides fresh data within an acceptable window while making fewer outbound API calls than the 15-minute minimum. If your catalog changes multiple times per day, for example as stock status updates when items sell out, set the interval to 15 min for the fastest available refresh. The sync uses WP-Cron to schedule a background job that fetches data from Google and stores it in a WordPress transient; the choice of interval only affects how frequently that job fires.
Step 3: How Do I Map Columns in TableCrafter?
In the data source column mapping interface:
- SKU, Type: Text, Sortable: yes, Searchable: yes
- Product Name, Type: Text, Sortable: yes, Searchable: yes
- Category, Type: Text, Filterable: yes (TC builds a dropdown of all distinct category values)
- Subcategory, Type: Text, Filterable: yes
- Price, Type: Number, Sortable: yes, Price Range Filter: enabled, Format: Currency (adds $ prefix and 2 decimal places in display)
- Stock Status, Type: Text, Filterable: yes, Badge mode: enabled
- Description, Type: Text, Visible in row: yes, Show in expandable detail: yes (hides from main table, shows when row is clicked)
- Image URL, Type: Image URL. This tells TC to render the cell as an
<img>tag rather than displaying the URL string. Set max image width to 80px for table display. - Spec Sheet URL, Type: URL, Link label:
View Specs
Step 4: How Do I Configure Badge Colors for Stock Status?
Badge rules for the Stock Status column are stored under column_badge_maps in the table settings. Each rule maps a specific text value to a background color and text color. Badge values must match the cell text exactly after whitespace trimming. Navigate to the Stock Status column editor in TableCrafter and add the following rules:
In Stock→ green background, white text. This is the default available state and should be visually prominent to reassure buyers.Low Stock→ amber or yellow background, dark text. Amber signals caution without the urgency of red and can encourage buyers to act quickly.Out of Stock→ red background, white text. Red communicates unavailability immediately and prevents buyers from pursuing a product that cannot be ordered.Discontinued→ gray background, gray text. Gray de-emphasizes discontinued items while keeping them in the catalog for reference.
If your Google Sheets data validation uses different capitalization or phrasing than the badge rules above, the badges will not render. Before configuring badge rules, review the distinct values in your Stock Status column in Sheets and match the badge rule text to those exact values.
Step 5: How Do I Create the Table?
- Go to TableCrafter → Tables → Add New.
- Assign the product catalog data source.
- Set Default sort column to Product Name ascending, or leave unsorted to preserve the sheet's order.
- Enable Category filter, Subcategory filter, Price range filter, and Stock Status filter.
- Enable Search (searches across SKU, Product Name, and Description).
- Enable Export if your sales team needs to download the filtered results as CSV.
- Set Rows per page to 25 or 50 for large catalogs.
- Enable Expandable row detail to show Description and full-size image on row click.
- Save the table. Note the ID (e.g., 8).
Step 6: How Do I Embed the Catalog?
Go to the WordPress page where you want the product catalog to appear, add a Custom HTML block or Shortcode block, and paste the shortcode TableCrafter generated after you configured the table:
[tablecrafter id="8" filter="true" search="true" export="true"]
The filter="true" attribute adds per-column dropdown filters so visitors can narrow the catalog by category, brand, or any other column with repeating values. The search="true" attribute adds a search box that runs across all visible columns simultaneously. The export="true" attribute adds a CSV download button, useful if buyers want to save a filtered product list. After publishing, view the page while logged out to confirm the table renders for public visitors. If the table appears empty or shows a connection error, return to the TableCrafter admin, verify the Google Sheet URL is published and accessible, and re-save the table configuration.
How Does Maintaining the Catalog Work?
The product team workflow is entirely in Google Sheets. Catalog managers do not need WordPress credentials, plugin access, or technical knowledge beyond standard spreadsheet skills:
- Add a product: Add a row with all required columns filled in. The new row appears on the site within the next WP-Cron sync cycle (hourly by default, or 15 minutes if you selected that interval in Step 2).
- Update a price: Edit the Price cell in the sheet. The new price appears on the site after the next sync without any WordPress action.
- Mark out of stock: Change the Stock Status cell to
Out of Stock. The badge turns red on the site after the next sync. Buyers see the status change without anyone touching WordPress. - Remove a product: Delete the row for an immediate removal on the next sync, or change the Status to
Discontinuedto keep the product visible with a gray badge for reference.
No one needs WordPress access for routine catalog maintenance. This separation of content management from site administration is the key operational benefit of the Sheets-as-catalog approach. The product team owns the data in Sheets; the site owner owns the display configuration in TableCrafter. Changes to either layer are independent: the product team can add 50 new products without touching WordPress, and the site owner can adjust column widths or badge colors without affecting the sheet data.
Frequently Asked Questions
How Does When to Use This Instead of WooCommerce Work?
This approach is not a WooCommerce replacement for transactional stores. It fits situations like:
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.