Marketing Operations · HubSpot ⇄ WordPress

Adding a new class — where does it go?

Answer each question top to bottom.

ACCOUNTING HUBSPOT — system of record, you author here WORDPRESS — renders the public event
Step 1 · Accounting

Get the Course ID for this cohort

Ask for the next number in the master sheet (e.g. HCS-219 — the running per-program count, never restarting at 001). Adopt it verbatim. It’s immutable once set.

flowchart TD
  A["fa:fa-calendar-plus A class needs to go on the calendar"]:::sys --> Q{"Has this class been
taught before?"}:::dec Q -- "yes — it exists" --> R["fa:fa-hashtag Same letters as before — HCS · TFM · TSP
ask the sheet for the next number"]:::acct Q -- "no — brand new" --> N["fa:fa-file-circle-plus Accounting issues a new letter prefix
and starts its count"]:::acct R --> ID["fa:fa-lock Course ID — e.g. HCS-219
adopt verbatim · immutable once set"]:::ok N --> ID classDef acct fill:#fdf4e3,stroke:#d9ab3c,stroke-width:1.4px,color:#8a6412; classDef sys fill:#fff,stroke:#cdd3d9,color:#232b33; classDef dec fill:#fff5ee,stroke:#EB5825,color:#8a3d1e; classDef ok fill:#eef6f3,stroke:#1d7a5f,color:#1d7a5f;
flowchart TD
  S["fa:fa-calendar-plus New class to add"]:::sys --> Q1{"Has this class been taught before?
does its class code already exist?"}:::dec Q1 -- "no — brand-new class" --> W1["fa:fa-globe Build the WordPress pages by hand
catalog entry + course description page
once per class — every future run reuses them"]:::wp W1 --> A2["fa:fa-file-circle-plus Issue a new class code prefix
in the master sheet"]:::acct A2 --> H3["fa:fa-code-branch Register the program in
naming-canonical.json"]:::hs H3 --> Q2 Q1 -- "yes — repeat class" --> Q2{"Does this course run over multiple
non-contiguous days?"}:::dec Q2 -- "yes" --> S1["fa:fa-layer-group No new Course ID —
add this day as a Session
on the existing Course"]:::hs S1 --> STOP["fa:fa-circle-check Stop — nothing further needed"]:::ok Q2 -- "no — consecutive days,
or a standalone class" --> A1["fa:fa-hashtag Get the Course ID for this cohort
e.g. HCS-219 · adopt verbatim"]:::acct A1 --> H1["fa:fa-video Set class template + delivery_mode
a real variant gets its own letters — V-HCS"]:::hs H1 --> H2["fa:fa-hand Create the Course record
the one manual step"]:::manual H2 --> WP["fa:fa-bolt Automation creates the event and its tickets
the description page is not touched"]:::wp WP --> DONE["fa:fa-circle-check Live in both systems
one Course ID ties registrations to revenue"]:::ok classDef acct fill:#fdf4e3,stroke:#d9ab3c,stroke-width:1.4px,color:#8a6412; classDef hs fill:#FDEBE8,stroke:#EF4C32,color:#a3301c; classDef manual fill:#FDEBE8,stroke:#EF4C32,stroke-width:2px,color:#a3301c; classDef wp fill:#eef2f7,stroke:#7d8ca5,color:#28344a; classDef sys fill:#fff,stroke:#cdd3d9,color:#232b33; classDef dec fill:#fff5ee,stroke:#EB5825,color:#8a3d1e; classDef ok fill:#eef6f3,stroke:#1d7a5f,color:#1d7a5f;

The WordPress side — what is built by hand, what is automatic

Four things live on the site. Only the bottom two are automated.

WhatExampleHow oftenWho builds it
Catalog listing /course-catalog-2/ Once per class By hand
Course description page
what the class is, who it’s for
/hue-methods/hue-communication-strategies/ Once per class By hand
Event
one specific run — dates, venue
/event/hue-communication-strategies-10/ Every run Automated
Tickets
the products people buy
attached to that event Every run Automated
The automation only handles the event and its tickets.

It never creates or edits the catalog listing or the course description page. Those are written once when the class is new, and every future run of that class points back at them — which is why a brand-new class has to have them in place before its first event can be generated.

It also means a wording change to what the class is happens in one place, by hand, and applies everywhere. Changing dates, venue or price is the event, and that is automatic.

Class templates — where the letters are mapped

Two different codes do two different jobs. Mixing them up is the most common mistake here.

CodeExampleWhat it decides
Program code
program_code
HCS The broad curriculum. Drives the number sequence (HCS-217, HCS-218…) and how revenue rolls up.
Class template
course_template
HCS · V-HCS · MToP Int 1 The specific class type or variant. This is what WordPress reads to pick the event content template to clone — keyed on the class template, not the program code.

Where the mapping lives: the master sheet’s TemplateCode column is the source of truth for the letters. They are mapped back to a program code in hubspot-schema/naming-canonical.jsontemplate_code_map. Most are identity (TFM → TFM); the interesting ones are not:

"HCS"   → "HCS"     the standard in-person class
"V-HCS" → "HCS"     virtual variant — own template, same program
"HC"    → "HCS"     pre-rebrand 2025 code, same class
A fundamental difference in the class needs its own letters.

If the class is delivered differently enough that it can’t reuse the same event page and materials, it is a new class template — give it its own code. Virtual is the clearest case: V-HCS exists because a virtual run needs its own content template (joining instructions instead of a venue, different timings, different materials), even though it teaches the same curriculum.

What does not change: V-HCS still maps to HCS, so it keeps the HCS number sequence and rolls up with HCS revenue. A different room or a different trainer is not a fundamental difference — that is the same template, a new Course ID.

Guardrails Never invent or reuse a Course ID. Gaps in the sequence (e.g. HCS-203) are cancelled classes — leave them. If a number seems missing from HubSpot, check the master sheet before assuming a data error.