# Placement pricing desk for recruiting and staffing agencies

> Open a live deal, see the market pay range for that role and city, set your markup, and write the agreed numbers straight back onto the deal.

- Workflow type: app
- Services: Job Salary Data, HubSpot
- Categories: Sales, HR & People
- Published: 2026-08-24

## What it does

- Lists your open staffing deals down the left side, pulled live from HubSpot with role title, client, city, stage and close date
- Shows the market pay range for that exact role and city as a low, median and high, always with the confidence level attached, never a single number presented as fact
- Calculates bill rate, gross margin and the direct hire fee in real time as you type pay rate, markup and burden, with guardrails set to the ranges agencies actually charge
- Saves the agreed numbers onto the deal and files the full breakdown as a timeline note, so the math behind every quote stays on the record
- Flags any deal where the client's stated budget sits below the market median, so the account lead can reset expectations before the search starts
- Includes a Draft rate justification button that sends an assistant off to benchmark nearby markets and the next seniority level, then posts a client-ready paragraph back onto the deal

## What you'll need

- A HubSpot account with your staffing pipeline and open deals in it
- Permission to update deals and add notes in HubSpot
- A Job Salary Data key for the market pay lookups, which has a free tier for light use
- Your standard markup, burden and direct hire fee percentages, so the defaults match how your agency actually quotes

## Prompt

I run a recruiting and staffing agency. Build me a placement pricing desk: one screen where a recruiter opens a live HubSpot deal and prices the placement before sending the quote. Today the market lookup, the margin math and the deal record live in three different places, so quotes get built in a throwaway spreadsheet and the numbers never make it back onto the deal. This app closes that gap.

Layout: a two pane working screen. The left pane is the deal list, the right pane is the pricing workspace for whichever deal is selected. Recruiters live in this screen while quoting, and account leads open it to sanity check a price before it goes out.

Left pane, the deal list. Use HubSpot Search Deals to load open deals in our staffing pipeline, sorted by close date with the soonest first. Each row shows the role title (the deal name), the client company, the city, the current stage and the close date. Use HubSpot List Pipelines so I can pick which pipeline is the staffing pipeline and which stages count as open, and remember that choice. Where a deal is associated with a company, use HubSpot Get Company to show the real client name and, if the deal has no city of its own, fall back to the company's city. Add a search box and a stage filter at the top of the list. Selecting a row loads the right pane.

Market pay panel, top of the right pane. When a deal is selected, call Job Salary Data Get Job Salary Estimate with that deal's role title and city, and show the minimum, median and maximum side by side along with the confidence value the service returns. This is a hard rule: never show a single salary number as fact. The range and the confidence value always travel together, and every figure is labelled as an estimate. The service can return up to three estimates from different publishers for the same query, so show each of them with its publisher name rather than only reading the first one. If the lookup returns nothing usable, say so plainly and give the recruiter an inline way to retype the job title in a more standard form or try a nearby city and run the lookup again. Cache the result per deal so switching between deals does not burn a lookup every time.

Pricing panel, the heart of the app. A mode toggle switches the deal between contract and direct hire. In contract mode the inputs are pay rate (hourly), markup percentage and burden percentage, and the panel computes in real time as I type: bill rate = pay rate x (1 + markup); gross margin in dollars = bill rate minus pay rate; gross margin percent = gross margin divided by bill rate; and net margin after burden is subtracted from the pay side. In direct hire mode the inputs are first year salary and fee percentage, and the panel computes the placement fee in dollars. Seed the fields with sane defaults and show a soft warning, not a hard block, when an input falls outside the normal bands: contract markup 30 to 75 percent, direct hire fee 15 to 30 percent of first year salary, and a healthy gross margin target of 25 to 35 percent with 10 to 20 percent net after burden. Show every computed figure next to the market range above it so the recruiter can see whether the pay rate they are quoting sits at the bottom, middle or top of the market.

Budget flag. Compare the client's stated budget, taken from the deal amount or a budget property on the deal, against the market median for that role and city. If the stated budget sits below the median, flag it clearly on the deal card in the left pane and again at the top of the pricing panel, with copy telling the account lead to reset expectations with the client before the search starts. Make this flag visible without opening the deal, so someone scanning the list can see which searches are priced to fail.

Saving. A save button writes the agreed numbers back to the deal with HubSpot Update Deal (agreed pay rate, markup, burden, bill rate, gross margin, placement fee and deal amount) and then logs the full breakdown as a timeline note with HubSpot Create Note associated with that deal. The note is the audit trail, so write it as readable client facing math: role and city, the market range with its confidence value and publisher, every input the recruiter entered, every computed output, and who saved it and when. Let me map which HubSpot deal properties each number writes into, since custom property names vary between agencies, and if a mapped property is missing, still save the note rather than failing the whole save. When I reopen a deal that was priced before, read the saved values back so the panel opens on the last agreed numbers instead of blank defaults.

Draft rate justification button, powered by a background agent. From the pricing panel I click Draft rate justification and a background agent runs while I keep working. The agent takes the role title, the city and the agreed rate, benchmarks the same title in two or three nearby markets and at the adjacent seniority level using more Job Salary Data Get Job Salary Estimate calls, then writes one short client facing paragraph explaining why the rate we are quoting is fair given what that role costs in comparable markets and at the next level up. It posts that paragraph back onto the deal as a HubSpot note with Create Note. The app shows the agent's progress and the finished paragraph in the panel with a copy button, so the recruiter can paste it straight into the proposal. Same rule applies to the agent: it cites ranges with confidence values, never a single number as fact, it never invents a figure for a market where the lookup came back empty, and it keeps the output to one tight paragraph in plain client facing language with no internal margin figures in it.

Persistence: store per user defaults for markup, burden and fee percentage, the chosen pipeline and open stages, and the field mapping. Everything else about a placement lives in HubSpot on the deal and its notes, so the CRM stays the single source of truth.

## How to customize

- Set your own default markup, burden and direct hire fee percentages so the calculator opens on your rate card instead of the industry averages
- Point the deal list at a different pipeline or set of stages, or filter it down to only the deals you own
- Choose which nearby markets and seniority levels the rate justification assistant benchmarks against
- Map the saved numbers to whichever deal fields your team already uses, or keep everything in the timeline note

## FAQ

### Where does the market pay data come from?

It comes from a live salary estimate service that returns pay figures for a given job title and location, sourced from Glassdoor data. Each lookup returns a low, median and high figure plus a confidence level, and often several independent estimates for the same role. The app shows all of it rather than picking one number to present as fact.

### Will this overwrite anything in my HubSpot deals?

Nothing is written until you press save. When you do, the agreed pricing numbers go onto the deal and the full breakdown is filed as a note on the deal timeline. You choose which fields the numbers land in, and if a field does not exist the breakdown is still saved as a note.

### Does it handle both contract placements and direct hire?

Yes. Contract placements are priced from an hourly pay rate with markup and burden to produce a bill rate and gross margin. Direct hire is priced as a percentage of first year salary. You switch modes per deal, and the defaults follow the usual industry bands of 30 to 75 percent markup for contract and 15 to 30 percent for direct hire.

### What happens if there is no salary data for that role or city?

The app says so plainly instead of guessing. You can retype the job title in a more standard form or try a nearby city and run the lookup again, and the confidence level shown alongside every range tells you how much weight to put on the numbers you do get back.

### Can my whole recruiting team use the same screen?

Yes. Everyone works from the same live deal list, and because saved pricing is written back onto the HubSpot deal and its timeline, whoever opens that deal next sees what was already agreed and who agreed it.

### Do I need a paid HubSpot plan?

It works with the standard deals, pipelines and notes that come with HubSpot CRM, including free accounts. You only need a login with permission to view your pipeline and to update deals and create notes.

Use this prompt in General Input: https://www.generalinput.com/prompts/placement-pricing-desk-for-recruiting-and-staffing-agencies