Build an objection handler that knows the deal before your rep does
This post is part of the GTM Automation Playbook — a 13-part series on building AI-powered GTM agents with HubSpot.
Your rep gets an email back: "We're evaluating a competitor." They stare at the screen. They check Slack. They ask their manager. Twenty minutes later they send something vaguely defensive that doesn't reference anything specific about the deal.
This is where most AI sales tools fail too. They'll give you a template for "competitive objection" that reads like a battle card someone wrote in 2022. The response doesn't mention the prospect's deal size or the three calls your team already had with them. It's generic because the tool has no context.
The fix is straightforward: pull the deal context from HubSpot, classify the objection, and generate a response that's specific to this prospect and this deal.
Four objections, four different responses
B2B objections cluster into four categories. Each one needs different context from your CRM and a different response shape.
Price objections need deal size and ROI data from similar customers — and competitor pricing if you have it. The goal is reframing value, not discounting.
Timing objections ("not right now," "maybe next quarter") require renewal dates and budget cycles from the deal record. The response should create urgency without pressure.
Competitive objections mean the prospect is comparing you to someone else. The model needs to know which competitor and what features they're evaluating. If your rep logged this in notes, it should use it.
Authority objections ("I need to run this by my boss") require the contact's title and materials that help them sell internally. The response should arm the champion, not bypass them.
The five-node workflow
I build this in n8n with five nodes. You could also hit the Claude API directly from a HubSpot custom coded action if you have Operations Hub Professional, but n8n gives you more control over the prompt and the data pipeline.
Node 1: HubSpot trigger. Use a webhook trigger that fires when a deal property changes. I create a custom single-line text property called objection_type (enumeration: price, timing, competition, authority). When a rep logs an objection by setting this field, the workflow runs.
Node 2: Pull deal context. HTTP Request node to GET /crm/v3/objects/deals/{dealId}?properties=dealname,amount,dealstage,pipeline,objection_type&associations=contacts,notes. This gives you the deal details and IDs for associated contacts and notes. Then add a second HTTP Request node to batch-fetch the notes: POST /crm/v3/objects/notes/batch/read with those note IDs. Pull hs_note_body from each. Now you have the full conversation history attached to this deal.
Node 3: Generate the response. Basic LLM Chain node with the Anthropic Chat Model sub-node. Claude Sonnet is the right model here. It's cheap, fast, and structured prompts are where it performs best. Temperature 0.4 — you want consistency, not creativity.
You are a B2B sales advisor generating an objection response.
OBJECTION TYPE: {{ $json.objection_type }}
DEAL CONTEXT:
- Deal name: {{ $json.dealname }}
- Amount: {{ $json.amount }}
- Stage: {{ $json.dealstage }}
- Contact title: {{ $json.contact_jobtitle }}
- Company: {{ $json.company_name }}
CONVERSATION HISTORY:
{{ $json.notes_combined }}
RULES:
- Reference at least one specific detail from the deal or conversation history
- Match the tone to the objection type (price = analytical, timing = consultative, competition = direct, authority = supportive)
- Keep it under 150 words
- Write as if you're coaching the rep on what to say, not writing the email for them
- Never use the word "I understand" as an opener
- Include one suggested question to ask the prospect
Node 4: Write back. Create a note on the deal using POST /crm/v3/objects/notes with hs_note_body set to the generated response and an association to the deal (associationTypeId: 214). Set hs_timestamp to the current time so it appears at the top of the deal timeline.
Node 5: Notify the rep. A Slack node or email node that pings the deal owner with the generated response. This is optional but it cuts the feedback loop from minutes to seconds. The rep gets a notification, reads the suggested response, edits if needed, and sends.
The gotchas
Don't use the AI Agent node for this. You don't need tool-calling or multi-step reasoning. The data pull happens before the LLM call, not during it. A Basic LLM Chain is faster and cheaper.
Notes can be empty. If the deal has no notes, your prompt will have a blank conversation history section. Add a conditional in your prompt: "If no conversation history is available, focus on the deal properties and standard objection-handling best practices for this category."
Prompt tuning takes 20 reps. Run 20 deals through the workflow manually before you turn it on for the team. Read every output. The most common fix is adding examples of good responses to the system prompt so the model calibrates its tone and length.
Where this fits
This doesn't replace your rep's judgment. It replaces the 15 minutes they spend staring at the screen, drafting something from scratch, and second-guessing the wording. The model gives them a starting point that already knows the deal. They edit, send, and move on.
Teams that respond to objections within an hour consistently outperform those that wait a day. The bottleneck was never strategy — it was always speed.

Need a Fractional Head of AI?
I help companies build an AI operating system — shared context across teams, AI handling the repetitive work, and your people focused on what actually matters.
15+
Years in Tech
12+
AI Products Shipped
3
Fortune 500 Brands