Skip to content
Solutions Blueprint

A two-table HubDB schema for a 400-SKU configurable furniture catalogue

Hero featured image

A 400-plus SKU furniture catalogue, many of whose products came in several finishes and parts, didn't have a HubDB table that could hold those combinations without repeating columns across rows that didn't need them. We built a second, linked HubDB table for the options instead, sized against HubDB's own row ceiling.

Executive Summary

context-header-icon

Context

A furniture manufacturer and supplier to the education sector sold more than 400 configurable SKUs across dozens of categories to schools under negotiated pricing tiers. The catalogue's finish and part options had no data model a HubDB-driven portal could read cleanly.

what-we-built-header-icon

What We Built

We split the product catalogue into two linked HubDB tables, a SKU-keyed Products table and a separate Colours & Finishes table for configurable options, sized to stay well inside HubDB's published row ceiling.

tech-stack-header-icon

Tech Stack

  • HubDB
  • HubSpot CRM
  • HubSpot CMS Hub (Membership)

Not a fit if your catalogue doesn't fit comfortably under HubDB's 10,000-row ceiling, since this is a row-based design, not a relational database. It also assumes you accept SKU as the join to your CRM's line items, since HubDB can't associate rows to Line Items directly.

the-challenge-header-icon

The Challenge

The catalogue held more than 400 SKUs, many offered in multiple finishes and parts rather than one fixed configuration. A single HubDB table with one row per SKU had no clean way to hold a variable number of finish, colour and part options, because most rows would have repeated columns they left empty. HubDB also caps every table at 10,000 rows.

The same SKU also had to show a different price depending on the buyer's contract tier, and HubDB couldn't read that from a CRM property alone.

our-approach-header-icon

Our Approach

We first considered adding finish and part columns directly to the Products table. That would have forced all 400-plus rows to carry the same fixed columns, and a new finish would have meant a schema change across the table.

We built a second HubDB table instead, Colours & Finishes, with Finish, Colours, Part, Price and Products columns. It models a tote box as its own Part tied to the products it applies to. SKU stays the Products table's key, the same key that joins a catalogue row to a HubSpot Line Item once a quote becomes an order, and it carries across to the lookup table.

We sized the two-table design against HubDB's 10,000-row ceiling, which leaves the 400-plus product catalogue room to grow.

impact-header-icon

Impact

check-icon

A finish or part change no longer touches the whole catalogue

Because finish and part options live in their own Colours & Finishes table rather than as columns on every Products row, adding a new option means one new row there, not a schema change across 400-plus existing products.

check-icon

A 400-plus SKU catalogue stays inside one platform's row limit

HubDB's 10,000-row ceiling sits far above the 400-plus products the catalogue held at launch, even counting the Colours & Finishes table's own rows, so new product lines won't force a re-architecture any time soon.

check-icon

An approved quote still reaches the right line item without a native link

HubDB rows can't be associated directly to HubSpot Line Items, so SKU carries that relationship end to end: the same key identifying a catalogue row is what a Deal's line item uses once approved.

check-icon

The same catalogue row can show two different prices

The portal reads the Contract Type property already set on a viewer's Company record and matches it to the price held in the Colours & Finishes table, so two schools on different contract tiers see two different prices for one row.

Technical Blueprint
1

The Products table holds one row per physical SKU across the catalogue's 400-plus items, spanning categories such as Tables, Desks, Chairs and Storage. SKU is the key that already let a catalogue row become a HubSpot Deal line item once approved.

2

A second table, separate from Products, carries Finish, Colours, Part, Price and Products columns, so finish and part combinations live in their own rows, not as extra columns on the catalogue. Tote boxes are modelled as their own Part entry there, like every other option.

3

Holding every finish and part option as a column on the Products table was considered and dropped: most of the 400-plus rows would have carried empty columns for options that didn't apply, and one new finish would mean a schema change across the catalogue.

4

HubDB caps every table at 10,000 rows, a hard platform limit, not a soft recommendation. The catalogue's 400-plus products, plus the Colours & Finishes table's own rows, sat well inside that ceiling, leaving room to grow before a different architecture would be needed.

A SKU-keyed HubDB Products table joined to a Colours and Finishes table and a HubSpot Deal line item, gated by Contract Type.

The Products table in HubDB holds one row per SKU, and a second Colours & Finishes table holds the finish, colour, part and price combinations, keyed back to those SKUs. A Company record's Contract Type property decides which price the Colours & Finishes table returns for a viewer. When a quote is approved, the same SKU joins the catalogue row to the HubSpot Deal line item, because HubDB rows can't associate to Line Items directly.

FAQ

How do you model a product that comes in several finishes or parts without one giant table?

A second HubDB table, separate from the main catalogue, carries finish, colour, part and price options as their own rows, keyed back to the product they belong to. That keeps the catalogue table at one row per SKU regardless of how many options a product has.

How does the same catalogue row show two different prices to two different customers?

The price isn't stored once on the catalogue row. The portal reads the Contract Type property on the viewer's Company record and matches it against the price for that tier, so the same SKU resolves to two different numbers for two accounts.

Continue reading

Hero featured image
209049082793

Luxury yacht manufacturer: CRM governance, 16.9% MQL-to-SQL

Hero featured image
209049052783

$500M+ telecom provider: one CPQ for MSP and ISP catalogs

Hero featured image
209049052785

Health insurance web broker: NPN hierarchies in HubSpot

Hero featured image
209049052787

$50M+ telehealth provider: HIPAA-compliant clinical ERP sync

Hero featured image
209049052787

$50M+ telehealth provider: attribution recovered via API fix

Hero featured image
209049052786

Environmental IoT provider: partner directory routes leads

Hero featured image
209053190299

$100M+ real estate tech firm: automated KYC gates and SSO

Hero featured image
209049052785

$1B+ financial data provider: Pardot and Eloqua into HubSpot

Hero featured image
209053177394

Global abrasives producer: 40+ sites from Kentico to HubSpot

Hero featured image
209049082792

Global abrasives producer: 13 dashboards consolidated to one

Hero featured image
209049052787

Medical device maker: five regional domains into one CMS

Hero featured image
209049052787

Medical device maker: automated clinical triage in HubSpot

Hero featured image
209049052787

Multi-site dental group: lifecycle logic rebuilt, true ROI

Hero featured image
209049052787

Multi-site dental group: assessment tool for lead quality

Hero featured image
209049082794

K-12 Catholic diocese: 80 schools on one HubDB lead system

Hero featured image
209049052787

Cell therapy biotech: HubSpot CMS migration, 92 speed score

Hero featured image
209049052787

Cell therapy biotech: 40-hour enablement and lead routing

Hero featured image
209049082794

Wellness training provider: 925k records moved to HubSpot

Hero featured image
209049052786

Cybersecurity trainer: 595 workflows audited for debt

Hero featured image
209049052785

Tier 1 auto F&I provider: 14,000% CTA lift, 21% PVR lift

Hero featured image
209049052785

Mexican retail bank: Infobip to Intercom via Apache NiFi

Hero featured image
209049052786

Global streaming platform: ETL middleware feeds Customer.io

Hero featured image
209049052786

Global streaming platform: usage milestones trigger upsell

Hero featured image
209049052786

Cloud and edge provider: Intercom to Salesforce via MuleSoft

Hero featured image
209049052785

$50M+ FinTech SaaS provider: advisor onboarding 30% faster

Hero featured image
209049082792

Mining autonomy provider: global consent and data governance

Hero featured image
209053177394

Industrial IoT division: compliant list purge, leads 3 to 62

Hero featured image
209053177394

Industrial IoT division: 25,000 records merged, one portal

Hero featured image
209049052786

Logistics SaaS portfolio: Salesforce sync rebuilt on Tray.io

Hero featured image
209049052786

Logistics SaaS portfolio: brands consolidated into HubSpot

footerCTA footerCTA-mobile
Spice up your inbox
Sign up for our newsletter
Don't worry - we only average, like, two emojis per subject line.