Log Call
Tool names below are expected names for the HubSpot MCP connector. If a named tool isn't available, check for updates to the skill and/or alternates in the HubSpot toolset as available tools may change
Phase 1 — Parse the message
Extract from user input:
- Contact name or email
- Summary — what was discussed
- Outcome — any decision or result
- Next step — any specific follow-up action mentioned
- Deal signals — stage movement, timeline change, priority shift, deal size revision
- Contact status signals — did you reach them? Are they engaged? Bad timing?
If contact name is missing, ask: "Who was the call with?"
Phase 2 — Find the contact and deal
Run simultaneously:
get_organization_details→ storeportalId,uiDomainsearch_crm_objectscontacts, query: name or email, properties: firstname, lastname, email, jobtitle, associatedcompanyid, hs_lead_status, lifecyclestage
If multiple contacts match, show disambiguation list (name, title, company) and wait for confirmation.
Then search deals filtered by associations.contact = contactId, properties: dealname, dealstage, pipeline, amount, closedate, hs_next_step, hs_priority. Store dealId, currentStage, dealPipeline, dealName, currentNextStep.
Phase 3 — Build the update plan
Based on what was said, propose updates across note, deal, and contact.
Stage resolution — if stage signals were detected, resolve before building the plan. This is fail-closed: if resolution fails at any step, omit the stage change entirely and ask the user.
- If the deal has no
pipelinevalue, omit the stage change and ask: "I couldn't determine the pipeline for this deal — which stage should I move it to?" - Call
get_properties: objectType: deals, propertyNames: ["dealstage", "pipeline"]. If this call fails or returns no data, omit the stage change — do not proceed. - Filter
dealstageoptions to only those belonging todealPipeline. If no stages match, omit the stage change and ask the user. - Sort matching stages by
displayOrder. Match the user's words against the actual stage labels. - If no stage label clearly fits, or more than one is plausible, omit the stage change and ask — never guess.
- Only when a single unambiguous match is found: store
proposedStageLabel(for the confirm block) andproposedStageValue(API value for Phase 5).
Show a single confirm block — do not write until confirmed.
Omit lines that don't apply. If no deal exists, omit the Deal section. Always include the task line.
Phase 4 — Write the note
manage_crm_objects notes, createRequest:
hs_note_body:📞 Call logged — [today's date]\n\n[Summary]\n\n[Outcome]\n[Next step]hs_timestamp: current ISO 8601 timestamp- associations: contact → contactId, deal → dealId (if present)
Phase 5 — Update deal and contact fields
Run Phase 5 (deal) and Phase 6 (contact) simultaneously — they are independent writes.
If a deal exists, update via manage_crm_objects deals, updateRequest, objectId: dealId. Run all field changes in a single call.
Fields to update (only those that changed):
If stage mapping is ambiguous, ask before updating — never guess.
Phase 6 — Update contact fields
If contact status signals were present, update via manage_crm_objects contacts, updateRequest, objectId: contactId.
Only update if the signal is clear. Skip if ambiguous.
Phase 7 — Create follow-up task
Always create a task. Pre-fill from the next step if mentioned; default to "Follow up with [firstName]" in 7 days.
manage_crm_objects tasks, createRequest:
hs_task_subject: "Follow up with [firstName] — [next step if mentioned]"hs_task_type: CALLhs_task_status: NOT_STARTEDhs_task_priority: MEDIUM (or HIGH if deal is closing soon / urgent)hs_timestamp: [due date ISO]hs_task_body: [brief context from call]- associations: contact → contactId, deal → dealId (if present)
Phase 8 — Confirm
Error handling
- Contact not found: Ask to clarify. Do not write anything until confirmed.
- Multiple matches: Show disambiguation list, wait.
- No deal found: Log the note and create the task. Skip deal update phases.
- Stage mapping unclear: Ask before updating — never guess.
- Note save fails: Show the composed note in chat so nothing is lost.
- Partial failure: Report which updates succeeded and which failed. Offer to retry failed ones.

