Case Study

Colorado Golf Association Course Directory

CRM · HubSpot CMS · HubSpot CRM · HubSpot Module
58%
Month over month increase in traffic
Contents

Most “find a location near you” pages are dead ends. They list places, the visitor scans them, and then the data just sits there — disconnected from your CRM, useless for marketing, impossible to report on. When the Colorado Golf Association needed a course directory that could do more than list courses, we built it on HubSpot custom objects so every course became a real record in their CRM — searchable for the public, and connectable to the people who play there.

The starting point: a directory that couldn’t talk to the CRM

The CGA represents more than 98,000 members and is the USGA’s Allied Golf Association of record for Colorado and Wyoming. Golf courses are central to nearly everything they do — membership, events, ratings, advocacy. But course information typically lives in the worst possible place for an organization like that: a static page, a spreadsheet, or a plugin that knows nothing about the contacts in the database.

That creates two problems at once. The public gets a flat list they can’t really filter, and the organization gets data it can’t act on. There’s no clean way to ask “which members are associated with private clubs on the Western Slope?” because the courses and the contacts never live in the same system.

A directory built as content gives you a page. A directory built as data gives you a system — one you can search, segment, and report on.

The decision: custom objects, not another listing plugin

HubSpot ships with standard objects — contacts, companies, deals, tickets. Custom objects let you define your own record type with your own properties and your own associations to those standard objects. For a golf course directory, that distinction is the whole ballgame.

Modeling each course as a custom object record means a course is no longer a blob of text on a page. It’s a structured record with defined fields, it can be associated directly to contact records, and it’s available everywhere HubSpot’s tooling can reach — lists, workflows, reports, and the CMS that renders the public page. We chose custom objects specifically so the same data that powers the public search also powers the CGA’s internal marketing and reporting.

What we built

The public-facing directory at coloradogolf.org/course-directory lets anyone search and filter Colorado’s courses, with results rendered live from the HubSpot custom object records:

  • Free-text search by course name and location.
  • Category filter — Public, Private, Semi-Private, Resort, and Military.
  • Number of holes — from 9-hole par-3 and executive layouts up to 36-hole regulation, so a visitor can match a course to the round they actually want.
  • Region filter — Western Slope, Southern Colorado, Denver-Metro, Central Mountains, and Northern Colorado.
  • “Join Online Available” toggle — surfaces participating facilities where a golfer can become a member directly, turning the directory into a membership funnel rather than a phone book.

Each filter maps to a property on the course custom object, which is why the search feels instant and the results stay accurate: the page is reading structured fields, not parsing prose. Add or update a course in HubSpot and the directory reflects it — no separate content edit required.

The part visitors never see: courses connected to contacts

The public search is the obvious half. The valuable half is the association layer underneath it. Because courses are custom object records, they can be associated to contact records in the same CRM — linking a course to the members, club contacts, or prospects connected to it.

That single design choice is what turns a directory into a marketing and reporting asset:

  • Segmentation that was previously impossible. Build lists by course attribute — region, category, holes — and reach the contacts associated with those courses, instead of guessing from free-text fields.
  • Reporting on the relationship, not just the record. The CGA can analyze membership and engagement against real course attributes, because the course data is structured and joined to contacts rather than stranded on a web page.
  • Workflows that use course context. Associations let automated communications and internal processes reference the course a contact is connected to, so messaging can actually be relevant.
  • One source of truth. The same records power the public directory and the internal CRM, so the team isn’t maintaining the website and the database as two separate jobs.

Content vs. custom object: why it matters

 Directory as contentDirectory as custom objects
What a course isText on a pageA structured CRM record
FilteringLimited, often manualDriven by real properties
Link to peopleNoneAssociated to contact records
SegmentationGuessworkLists by course attribute
ReportingNot possibleNative HubSpot reports
MaintenanceEdit the pageUpdate the record once

Why this approach worked

Nothing here is exotic — it’s a disciplined use of the platform the CGA already runs on. The win came from refusing to treat the directory as a website feature and instead treating it as a data model. By the time the public page was rendering search results, the harder and more durable work was already done underneath: every course was a clean, queryable record that the marketing and membership teams could use long after launch. The directory looks like a convenience for golfers. For the organization, it’s infrastructure.

The honest caveat

Custom objects aren’t the right answer for every list. They add modeling and governance work, and a small, static set of items may genuinely belong in simple content. The case for custom objects gets strong exactly when the directory needs to connect to your contacts, drive segmentation, and feed reporting — which is precisely the situation the CGA was in. The skill is knowing which problem you actually have before you build.

← Back to all work