How we model our training courses in HubSpot, how we connect HubSpot to our website, and one design decision we want you to sanity-check.
Does our object structure for cohort-based courses make sense, and is the native Courses object the right home for it?
We connect records only through associations, avoiding copying data between them. Is that the right call?
Our course-creation flow drives the website (events + tickets) from HubSpot. Is the approach sound?
A Course = one cohort: a dated, located class (TFM, HCS, MToP…). Everything else hangs off it.
HubSpot is the source of truth. The website reflects it.
cohort_codeQuestion 1. We link a contact to a course by associating them to the Course record, not by copying the course details onto the contact. Is that the right call?
One association per relationship. The data lives once, on the Course, always current, never duplicated onto contacts or deals.
If we do need course data on a contact (e.g. an email token), is the right move an automatic workflow that re-stamps on every change, so the copied value triggers on any update and can never go stale?
HubSpot's guidance favors associations over duplicated properties, so we think we're right. The open question is the escape hatch: when a stamp is unavoidable, are workflow-maintained stamps that refresh on any change the pattern you'd use?
Create the Course in HubSpot → the event page, dates, venue, and tickets appear on hue.life. No one hand-builds events anymore.
Someone registers → they come back as a Contact associated to that Course, with the order as a Deal. The link closes the loop.
The one piece we built, a thin bridge.
Off-the-shelf for events, ticketing, checkout & the HubSpot sync, plus a thin custom bridge so HubSpot stays the single source of truth. Is that the right division of labor, and is MakeWebBetter the sync you'd use?
wp_readythe go-live switchOrange = HubSpot owns it · purple = the website. One record in, a live sellable event out.
| Field | What it drives on the website |
|---|---|
cohort_code | The unique class ID, ties the event, tickets & orders together |
class_template | Which content template the event page is built from |
has_tiers | Whether to build 4 tier tickets or a single ticket |
session_start / end, venue_* | Event date, time & location |
wp_ready | The go-live switch, nothing builds until it's on |
external_event_id | Written back by the plugin, the link to the live WP event |
event_url | Written back too, the public link to the live event page on hue.life |
These exist specifically to serve the integration. Everything else about a cohort is either a normal Course field or lives on the association. Are we missing anything, or carrying fields we shouldn't?
Only about a third are ours by hand. The rest are HubSpot defaults and one integration's auto-installed bundle.
| Source | Fields |
|---|---|
| HubSpot defaults (every portal ships these) | 407 |
| MakeWebBetter e-commerce bundle, auto-installed | 102 |
| Team, course / email project | 53 |
| Forms & campaigns, 2024–26 (registration, scholarship, a book push) | ~50 |
Half of our 208 custom fields are MakeWebBetter's auto-installed e-commerce set, abandoned cart, RFM, ROI tracking, products-bought.
A sample showed ~80% completely empty, they power cart-recovery & RFM features we don't run.
Question: keep the full bundle, or trim it back?
1 · The Courses object. Right home for a cohort on Professional, or would you model it differently?
2 · Associations, exclusively. Are we right to link everything by association and refuse to duplicate data onto records?
3 · The integration split. Off-the-shelf plugins for events/tickets/checkout + MakeWebBetter for the WooCommerce↔HubSpot sync + a thin custom bridge, HubSpot as source of truth, sound architecture, and the right sync plugin?
4 · The fields. Is our small set of website-driving Course fields the right set, too many, too few, or named wrong?