Candidate submission portal for your Bullhorn job orders

Pick candidates from a job's pipeline, edit each summary, then send a client safe shortlist by email and log the submissions in Bullhorn.

App
BullhornGmailHR & PeopleSalesContent GenerationEmail Automation
PromptCreate

Build me an app my recruiters open whenever they are ready to put candidates in front of a client. Today that means exporting CVs and emailing PDFs around, and I want the whole ritual to happen on one screen: pick the job, tick the candidates, edit the blurb, send. Sending must both create the submission records in Bullhorn and email a clean shortlist to the client.

The first screen is a list of my open Bullhorn job orders. For each job show the job title, the client company, the job owner, how many days it has been open, and how many candidates are already submitted. Default the list to only the job orders owned by the recruiter using the app, and give them a toggle to switch to the whole desk. Resolve the current recruiter from the Bullhorn user behind the connected account; if that cannot be matched confidently, let them choose their name from a list of owners and remember the choice. Sort by days open descending so stale jobs surface, and let them search by job title or client name.

Opening a job goes to a job detail screen showing every candidate available to put forward. That is two groups merged into one list: candidates currently in that job's pipeline (the existing submissions on the job order) and the candidates sitting on the tearsheet linked to that job. Label which group each candidate came from, and mark anyone already submitted so nobody gets sent twice. For each candidate show name, headline, availability, rate, and the internal details the recruiter needs to make the call. Internal detail is fine to display inside the app; it just must never reach the email.

The recruiter ticks the two or three candidates they want to put forward. For each ticked candidate, auto-draft a one paragraph summary written for the client, pitching why this person fits this specific job, using the candidate's own record and the job order's requirements. Show each draft in an editable text box next to the candidate so the recruiter can rewrite it in their own voice. Keep the drafts to a single tight paragraph. Give them a preview of the outgoing email rendered exactly as the client will see it before they commit.

Send does two things. First, create a submission in Bullhorn for each ticked candidate against that job order using the Create Job Submission operation. Second, send the formatted shortlist to the job's client contact using the Gmail Send a Message operation, from the recruiter's own mailbox, with a subject naming the role and the client. If a candidate's submission fails to create, tell the recruiter which one and do not silently drop it from the email. If the job order has no client contact, ask the recruiter to pick a recipient rather than guessing.

The outgoing email must be client safe. Include only the candidate name, headline, availability, rate and the recruiter's paragraph, for each candidate, plus a short intro naming the role. Never include internal notes, margin, pay rate, candidate ID, or any other internal field. Build the email body from an explicit allowlist of those fields rather than dumping the candidate record, so a new field appearing in Bullhorn can never leak into a client's inbox.

Bullhorn specifics the handlers need to respect. Log in exactly once per run with the Authenticate and Get Session operation, then reuse the returned BhRestToken and restUrl for every following call; the access token backs a single login, so a second login attempt in the same run will fail. Read job orders, submissions and candidates through the entity search endpoints with Lucene syntax, and use the query endpoints for entities that do not support search, such as Tearsheet. Every read needs an explicit fields parameter, so name the fields you want including nested ones like the client corporation name and the owner name. Remember that PUT creates records and POST updates them, which is backwards from most APIs. All timestamps are epoch milliseconds, so convert before working out days open.

Persist enough to make the app feel like it remembers: each recruiter's desk toggle, and a local record of what was sent for each job (which candidates, to which contact, when, and the blurb that went out). Show that send history on the job detail screen so a recruiter picking the job back up can see what the client has already been shown. Handle the empty and slow states properly: a job with nobody in the pipeline and nothing on the tearsheet should say so, and the list should stay usable while Bullhorn is paginating.

What does this prompt do?

  • Lists your open job orders with the client company, the owner, how many days the job has been open, and how many candidates are already submitted
  • Opens any job to show everyone currently in the pipeline plus the candidates sitting on that job's saved shortlist, in one place
  • Drafts a one paragraph summary for each candidate you tick, which you edit in the app before anything leaves the building
  • Sends a formatted shortlist to the job's client contact and records each submission back in Bullhorn, so nothing gets typed twice

What do I need to use this?

  • A Bullhorn account with API access, and permission to view job orders and create submissions
  • A Gmail account your recruiters send client email from
  • Job orders that have a client contact on record, so the shortlist knows who to send to
  • Candidates with the basics filled in: headline, availability and rate

How can I customize it?

  • Change which candidate details appear in the client email, for example adding location or notice period, or dropping the rate
  • Set whether recruiters land on their own jobs or the whole desk by default
  • Adjust the tone and length of the drafted candidate summaries to match how your agency writes to clients

FAQs

Will the client ever see our internal notes, margin or pay rate?
No. The email is built from a fixed, client safe set of details: candidate name, headline, availability, charge rate and the recruiter's own paragraph. Internal notes, margin and pay rate are never included, even if they are visible inside the app.
Does this create the submission record in Bullhorn, or only send the email?
Both. When you hit Send, the app creates a submission against the job order for each candidate you ticked, then sends the shortlist email. Your pipeline stays accurate without anyone updating it by hand afterwards.
Can I edit the drafted summary before it goes out?
Yes. Every candidate summary is drafted for you as a starting point and is fully editable in the app. Nothing sends until you press Send, and you can preview the email exactly as the client will read it.
Can recruiters see each other's job orders?
By default each recruiter sees only the job orders they own, which keeps the first screen focused. A toggle switches the view to the whole desk when someone is covering for a colleague or running a team review.
What happens if a job order has no client contact on it?
The app will tell you and ask you to choose a recipient before sending, rather than guessing. The submissions still get created in Bullhorn once you confirm who the shortlist is going to.

Related templates

Compare every Hireflix candidate for a role side by side

A calibration board that lines up every candidate's answer to the same question, hides names until your panel has scored, and writes the agreed rating back.

Hireflix
Gmail
App
Build a PR media list from real worldwide news coverage

Search three months of global coverage on your topic, rank the outlets actually writing about it, and draft a tailored pitch for each one.

GDELT
Google Sheets
Gmail
App
Morning review board for your open Housecall Pro quotes

Open one board every morning to see every outstanding quote by age and value, decide on each one, and send follow-ups only after you approve them.

Housecall Pro
Gmail
App
Booked vs collected cash flow desk for HoneyBook studios

See every HoneyBook project's booked revenue next to what actually landed in your bank, chase what is late, and bill the next payment in one click.

HoneyBook
Xero
Gmail
App
Gumroad buyer support console with refunds and license control

Paste a customer email or license key and see every purchase, license, and membership in one place, then refund or reset a key right from the row.

Gumroad
Gmail
App
Contractor payment board that keeps you 1099 ready all year

See every contractor's paperwork, bank details and year to date pay in one table, then run and fund this cycle's payment batch from the same screen.

Gusto
Gmail
Google Sheets
App

Stop sending candidate CVs as PDF attachments.

Give your recruiters one screen to shortlist, summarize and submit candidates straight from Bullhorn.