
Turn closed HubSpot deals into a sales review a rep can check line by line
PerfCopilot reads the HubSpot deals each rep owned and closed during the review cycle, then drafts a performance review where every claim points back to the deal record behind it, bias-checked before a manager sees it. The connection is a read-only private app token, and nothing is ever written back into HubSpot.
Connect HubSpot, free up to 5 seats → · read-only, no credit card, no seat minimum
✓ Closed deals, renewals and upsells · ✓ Every line cited to a deal record · ✓ Bias-checked before you send
What PerfCopilot reads from HubSpot
Two endpoints, and no others. The deal sync posts to the deals search API, filtered to one owner and to deals that closed inside the cycle. Rep mapping reads the owners list.
POST /crm/v3/objects/deals/search
hubspot_owner_id EQ <this rep>
closedate GTE <the day the cycle opened>
dealstage IN closedwon, closedlost
properties dealname, dealstage, amount, closedate, pipeline,
hs_deal_stage_probability, hs_time_in_closedwon
GET /crm/v3/owners
Seven deal properties are requested and five are kept: the probability and time-in-stage fields are read and then discarded rather than stored. Access is a HubSpot private app token with read scopes only, created once in your own HubSpot settings and pasted into PerfCopilot. From those deals PerfCopilot derives three signal types:
- Closed deals. Every deal the rep owned that reached closed-won or closed-lost inside the cycle, with its name, amount, close date and pipeline.
- Renewals. Deals matching your renewal property, tracked by the ARR they retained and whether each one actually renewed.
- Upsells. Expansion deals that closed won, tracked by amount.
Each deal is stored as its own evidence row, timestamped by its close date and stamped with the review cycle it belongs to, so editing a cycle's dates later cannot move evidence between review periods. That is what makes a line in the finished review traceable to one deal rather than to a dashboard total.
What actually reaches the review draft
The model that writes the review never sees a CRM dump. Every deal the sync collected is stored and citable, but what goes into the prompt is a compact [CRM DATA] block of four fields: deals_won, close_rate, arr_retained and renewals_closed. The deals themselves stay in the evidence set, which is where a citation in the finished draft points.
Next to that block sits a median for deals won, taken from the organization's own previously submitted reviews and labeled in the prompt as a historical reference rather than a rating rule. That reference set excludes the cycle being reviewed, so the draft is never a same-cycle ranking of one rep against another, and in a single-rep organization it falls back to that rep's own history.
You tell it which property marks a renewal and which marks an upsell
Teams record the shape of a deal in different places, so PerfCopilot does not try to infer it. Which property marks a renewal, and which marks an expansion deal, are settings you hand it. Four fields sit on the HubSpot card, each with a default it falls back to when you leave it blank:
| Field | Default | What it selects |
|---|---|---|
| Renewal property name | dealtype | The property that marks a renewal |
| Renewal property value | existingbusiness | The value that means renewal |
| Upsell property name | deal_source | The property that marks an expansion deal |
| Upsell property value | upsell | The value that means upsell |
Those defaults are a fallback, not a detection step. If your team records renewals or expansion against a property of its own, fill these in with the property and value you actually use. Until you do, the deals concerned still arrive as closed-won deals, they are simply not split out as renewals or upsells.
Next to the fields is a Test query button. It runs the filter you just typed, org-wide, across the last 90 days, and reports how many deals matched plus one example deal by name and amount. A property name HubSpot does not recognize comes back as HubSpot's own error message instead of a silent zero. The point is to find out now rather than halfway through a review cycle.
Mapping reps to HubSpot owners
The deal query filters strictly by owner, so each employee needs their HubSpot owner id on file. PerfCopilot pulls the owners list from HubSpot, pages through all of it, and matches on email address, so for most teams mapping a rep is a click rather than a lookup. An unmapped employee returns nothing at all rather than a partial picture, which is deliberate: an empty CRM section is visible to the manager, a silently halved one is not.
Where this is honest about its limits
- One CRM per organization. HubSpot or Salesforce, not both at once. The shared mechanics for either are in the CRM integration docs.
- Deal records only. The two endpoints above are the only ones the sync calls. Companies, tickets, conversations and email logged against a record are out of scope.
- The lookback is anchored on the cycle start, to the nearest day. It is counted in whole days from the day the cycle opened, so it can reach back up to a day earlier than the cycle's own start time, and there is no upper bound at the other end: a deal that closes after the cycle's end date but before you sync is still read in. Once a row is written it carries the cycle id, so editing a cycle's dates cannot move it into another period.
- Renewal and upsell splits are only as good as the property you name. Deals your team classifies its own way still count as wins, they are simply not broken out.
- This is a review-writing layer. Not a commission engine, not a forecast, not a territory planner, and not a system of record. The finished review leaves as a sealed PDF you file wherever your records already live.
HubSpot reports, revenue tools and HR platforms compared
| HubSpot reports & dashboards | Sales performance / commission tools | HR review platforms | PerfCopilot | |
|---|---|---|---|---|
| Pulls closed deals per owner | ✓ | ✓ | ✗ | ✓ |
| Cites the specific deal behind a claim | ✗ (aggregates) | ✗ (totals and payouts) | ✗ | ✓ |
| Bias and fairness check on the review | ✗ | ✗ | partial (language hints) | ✓ |
| Writes the review, not just the metric | ✗ | ✗ | ✗ (blank form) | ✓ |
| Reads your own renewal and upsell properties | ✗ (report filters) | varies by vendor | ✗ | ✓ |
| Combines CRM with calls, email and meetings | ✗ | ✗ | ✗ | ✓ |
| Cost floor | included in your HubSpot seat | varies by vendor | varies by vendor | Free up to 5 seats, no seat minimum |
The row that matters is the second one. A dashboard tells a manager that a rep closed six figures. A cited review shows which deals made that up, which renewals held, and which sentence rests on which record, so the rating survives the comp conversation that follows it. Beyond the free tier, pricing is per seat per month with no seat minimum, so one sales manager can run this for one team.
Pair HubSpot with the rest of the cycle
CRM evidence says what closed. It does not say how. A go-to-market review gets sharper when the deal record sits next to the work that produced it:
- Aircall call activity for outbound cadence, connect rate and dispositions on the way to a close.
- Email collaboration signals, headers and volume only, never message bodies, for the follow-up discipline behind a long cycle.
- Zoom meeting quality for customer-facing calls themselves, opt-in.
- Salesforce if your team is on the other CRM: the same mechanics, different field names.
For the wider picture, the performance review software buyer's guide covers where a writing layer sits next to a full HR platform, performance review phrases has competency framings you can reuse for revenue roles, and reducing bias in performance reviews explains what the screen on every draft is looking for.
Setting it up
- In HubSpot, open Settings → Integrations → Private Apps, create an app named PerfCopilot, and enable the deal, owner and deal-schema read scopes. Copy the access token, which HubSpot shows once.
- In PerfCopilot, open Admin → Integrations, find the HubSpot card, paste the token and save. Test checks the token against HubSpot's owners endpoint before anything is scheduled.
- If your team records renewals or upsells against a property of its own, fill in the four property fields and press Test query until the counts look like your pipeline.
- Match each rep to their HubSpot owner, then run Sync All for the active cycle and generate. The full walkthrough, including the token and scope errors worth knowing about, is in the HubSpot setup docs.
Prefer to see the output before connecting anything? Run the performance review generator or the standalone bias checker first, and read how signals are stored and retained on the security page.
Connect HubSpot, free up to 5 seats → · read-only, no credit card, no seat minimum
Frequently asked questions
- What does PerfCopilot read from HubSpot?
- Closed deals owned by each mapped rep inside the review cycle, read through the HubSpot deals search API: deal name, stage, amount, close date and pipeline. From those it derives whether each deal was won or lost, renewals and whether each one renewed, and upsells. The review prompt itself sees a four-field summary: deals won, close rate, ARR retained and renewals closed. Access is a read-only private app token, and nothing is written back into HubSpot.
- Does it read my contacts, companies or conversations?
- No. The sync calls two HubSpot endpoints: the deals search API, filtered to one owner and to deals that closed inside the cycle, and the owners list used to map reps. Companies, tickets, conversations and email logged against a record are out of scope. Note that the scope list in our setup guide also includes contacts read, which the deal sync does not use.
- Why are my upsells showing as zero?
- Because the upsell filter is looking at a property your team may not use. PerfCopilot falls back to a deal_source property with the value upsell, and that is a default rather than a detection step. Fill in the upsell property name and value on the HubSpot card with whatever your team actually records, then press Test query to confirm the filter matches real deals. Until then those deals still arrive as closed-won wins, they are just not broken out as expansion.
- Will the review just rank reps by revenue closed?
- No. Revenue arrives with context: deals won, close rate, ARR retained, renewals closed, and a median for deals won drawn from the organization's own previously submitted reviews, so a rep in a tougher patch is not read as a weaker rep. That reference set excludes the cycle being reviewed, so it is not a same-cycle leaderboard, and the prompt labels it a historical reference rather than a rating rule. A bias and fairness check then runs on the draft before a manager sees it.
- Do I have to move my team off Lattice, 15Five or BambooHR?
- No. PerfCopilot is a review-writing layer rather than a platform migration. It drafts from HubSpot activity and hands you the finished review as a sealed PDF to file wherever your records already live, so there is nothing to migrate out of your existing system of record. There is no seat minimum, so a single sales manager can run it for one team.