Skip to content
Solutions Blueprint

Automating Resume Attachment Sync from HubSpot Forms into Bullhorn ATS

Hero featured image

Standard HubSpot-to-Bullhorn integrations fail on binary file transfers. For an executive search firm, we engineered a serverless Pipedream middleware layer that intercepts HubSpot form submissions and streams resume files directly into Bullhorn Candidate entities. The firm's 14,000+ profiles stayed functionally complete with no manual uploads.

Executive Summary

context-header-icon

Context

An executive recruitment firm had to replace a legacy Volcanic site with HubSpot while keeping Bullhorn as their system of record. The non-negotiable requirement was a zero-touch sync for candidate resumes from HubSpot CMS forms into the Bullhorn candidate file repository.

what-we-built-header-icon

What We Built

A serverless Pipedream middleware integration handles binary file transfers and relational data mapping between Bullhorn, Idibu, and HubSpot.

tech-stack-header-icon

Tech Stack

  • Bullhorn (ATS)
  • HubSpot Marketing & CMS Hub Enterprise
  • Pipedream (Node.js Environment)
  • HubSpot Files API
  • Bullhorn REST API

Not a fit for firms that only need contact record syncing and don't store original resume files or legal documents inside the ATS environment.

the-challenge-header-icon

The Challenge

Bullhorn was the technical bottleneck: it can't ingest the public URLs that HubSpot's file upload fields generate. Bullhorn requires files to attach as specific entities (CandidateFile), so a direct mapping was impossible. Mid-deployment, the firm switched from Broadbean to Idibu, which shifted the payload structure for incoming job alerts. The middleware architecture therefore had to handle asynchronous file processing, or large PDF or DOCX files would hit timeout errors during transfer.

our-approach-header-icon

Our Approach

Pipedream acts as an intermediary file processor. When a candidate submits a resume on the HubSpot CMS, the middleware triggers a GET request to the HubSpot Files API and retrieves the binary content. The script then sends an authenticated POST request to the Bullhorn `/file` endpoint, tying the binary data to the newly created Candidate ID. For the switch from Broadbean to Idibu, we abstracted the data transformation logic into separate Node.js modules. The job board provider can change without anyone rewriting the file-handling routine.

This engagement is part of our systems integration work for professional services organisations.

impact-header-icon

Impact

check-icon

~90% Faster Candidate Time-to-Entry

The recruitment team no longer downloads CVs from HubSpot and re-uploads them to Bullhorn by hand. Automated file transfer logic cut time-to-entry for new candidates by an estimated 90%.

check-icon

Data Consistency Across Systems

The file physically moves rather than just syncing as a URL. Recruiters working exclusively in Bullhorn get immediate access to candidate resumes, even if the HubSpot public link expires or the file moves in the CMS.

check-icon

Middleware-Level API Throttling

The Pipedream queue managed the API load for binary transfers, which cost far more resources than standard JSON updates. The integration never hit Bullhorn's concurrency limits, even during peak application windows.

check-icon

Failed File Transfers Retried Automatically

A resume lost during a sync is a high-cost failure in the specialized executive search vertical. A retry-logic loop implemented within the middleware automatically re-attempts any failed file transfer. A failed transfer is retried rather than lost.

Technical Blueprint
1

A serverless function downloads the file from HubSpot's CDN into temporary Pipedream storage first. From that staging point, the system calculates the necessary metadata (file size, MIME type) that the Bullhorn API requires before the final upload occurs.

2

Jobs live as a Custom Object and candidates as Contacts in HubSpot. When a candidate applies, the middleware updates the HubSpot record and creates the Bullhorn entity at the same time, so the attachment links to the correct internal ID in both environments.

3

Duplicate file uploads get detected by dedicated logic. When a candidate re-applies with a new resume, the system creates a new "CandidateFile" record in Bullhorn with a timestamp instead of overwriting the previous version. The candidate's professional history stays intact.

4

The middleware manages the OAuth 2.0 refresh tokens for both Bullhorn and HubSpot to keep the connection secure. Token expiration can't interrupt a long-running binary transfer, and that expiration is a common failure point in long-form data syncs.

A resume submitted on a HubSpot form passing through Pipedream and attaching to a Bullhorn candidate record.

Bullhorn can't ingest the public URLs that HubSpot file upload fields generate. It needs the file attached as a CandidateFile entity. Pipedream now fetches the binary from the HubSpot Files API and posts it to the Bullhorn /file endpoint against the new Candidate ID. We kept the job board logic in separate Node.js modules, so the switch from Broadbean to Idibu didn't touch the file handling.

FAQ

Why not just use the HubSpot public file URL inside a custom field in Bullhorn?

Bullhorn's internal search and parsing tools can't "read" or index a file stored on an external URL. Pushing the binary file into Bullhorn turns on the ATS's native resume parsing and keyword search capabilities. Both are critical for executive search workflows.

How does the system handle very large attachments that might timeout?

Pipedream's asynchronous execution runs the file transfer independently of the HubSpot form submission. For a particularly large file, the middleware queues the task. The user sees a successful submission on the website while the background transfer continues to Bullhorn.

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