Architecting a Relational Recruitment RevOps Engine via HubSpot Custom Objects
Flat ATS-to-CRM syncs destroy relational data vital for recruitment ROI reporting. For an executive search firm, we engineered a multi-object schema in HubSpot (Jobs, Placements, Functions, Attendance) integrated with Bullhorn via Pipedream. This structure enables gated candidate portals, automated placement reporting, and high-touch event-led growth strategies.
Executive Summary
Context
An executive search firm was moving its website and marketing from a legacy recruitment CMS to HubSpot while keeping Bullhorn as its ATS. The firm wanted to unify recruitment operations with marketing automation and drive closed-loop reporting.
What We Built
A complex relational data model in HubSpot using four distinct Custom Objects and a gated candidate portal controlled via CMS Membership Lists.
Tech Stack
- HubSpot Marketing & CMS Hub Enterprise
- HubSpot Custom Objects (Jobs, Placements, Functions, Attendance)
- Bullhorn REST API
- Pipedream (Relational Middleware)
- HubSpot Membership Lists (Authentication Layer)
Not a fit if your ATS does not track placements or event attendance as distinct records, or if you have no middleware layer capable of syncing that relational data into HubSpot. The reporting and portal access logic here depends on real-time status changes flowing from the ATS into four synced custom objects; without that source data feeding the sync, there is nothing for the workflows to act on.
The Challenge
Bullhorn's deeply nested data structure was the constraint: standard off-the-shelf connectors can't replicate it. Mapping the many-to-one relationship, where a single candidate has multiple placements and event attendance records, required a schema that HubSpot's standard objects could not support. The CMO called it dark data: they knew candidates were getting placed, but that data existed only in the ATS, so they couldn't see which marketing workflows or job alerts were actually driving revenue.
Our Approach
We bypassed simple sync tools in favour of a custom Pipedream integration that maintains the relational integrity of the Bullhorn database. We prioritized building a Placements custom object to bridge the gap between application and revenue. Access to the candidate portal ran through HubSpot Membership Lists, triggered by a candidate's status in the ATS. That let us gate the "Functions" and "Attendance" objects, so exclusive industry event data stayed visible only to authenticated, high-value leads. That gave the technical team a stable database and the CMO a full-funnel view of the recruitment lifecycle.
This engagement is part of our customization + optimization work for professional services organisations.
Impact
Closed-Loop Revenue Attribution
Event-Led Growth Capabilities
Self-Service Portal for 14,000+ Candidates
Using Membership Lists for authentication provided a secure, zero-friction portal for 14,000+ candidates. Job seekers can manage their own preference data, which updates both HubSpot and Bullhorn, so recruiters always work with the most current candidate information.
Operational Parity with Specialized ATS
The integration layer handles complex POST requests to four different HubSpot object schemas. It uses the Bullhorn "Placement ID" and "Candidate ID" as primary keys, so records associate correctly across the HubSpot CRM.
The "Functions" and "Attendance" objects manage recruitment events. Attendance carries a Role (Speaker, Attendee, VIP) and a Status (Invited, Registered, Attended), and Pipedream creates the record when a candidate joins the event shortlist in Bullhorn. Workflows trigger based on a change in the "Attendance" status (e.g., "Checked-in"), sending automated, recruiter-personalized emails that reference the specific event attended.
One candidate in Bullhorn can have many placements and event attendance records. Standard connectors can't replicate that nesting, and HubSpot's standard objects couldn't hold it. So we built a custom Pipedream integration that keeps the relational structure, with a Placements custom object. Membership Lists driven by ATS status gate the Functions and Attendance objects. Marketing can now attribute search revenue to specific job alerts or website interactions.
FAQ