Automating Resume Attachment Sync from HubSpot Forms into Bullhorn ATS
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
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
A serverless Pipedream middleware integration handles binary file transfers and relational data mapping between Bullhorn, Idibu, and HubSpot.
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
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
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
~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%.
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.
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.
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.
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.
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.
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.
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.
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
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.
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.