Make.com HubSpot AI scenarios are stateless. Every execution starts fresh — no memory of what was said to this contact last week, no context from previous calls, no record of past objections. This guide shows how to fix that using retainr, adding persistent per-contact memory to any Make.com HubSpot scenario.
The Problem with Stateless HubSpot AI
A typical Make.com HubSpot AI scenario looks like this:
- HubSpot — Watch Contacts (trigger on new contact or field change)
- OpenAI — generate personalized outreach email
- Gmail — send the email
The AI generates reasonable output. But it generates the same quality of output for a brand-new lead and a contact you've been nurturing for six months — because it has no idea this contact exists in your history.
With memory, the scenario becomes:
- HubSpot — Watch Contacts
- retainr HTTP GET — retrieve all past AI interactions with this contact
- OpenAI — generate outreach that accounts for full relationship history
- Gmail — send
- retainr HTTP POST — store this interaction for next time
The AI now knows about the pricing objection from three months ago, the product demo they attended, the feature request they mentioned. That context changes the quality of every output.
Setting Up HubSpot AI Memory in Make.com
Step 1: Get your retainr API key
Create a free account at retainr.dev/dashboard. Copy your API key. The free plan includes 1,000 memory operations per month.
Step 2: Add the HTTP GET module
After your HubSpot trigger module, add an HTTP — Make a request module:
- URL:
https://api.retainr.dev/v1/memories/search - Method: GET
- Query String:
namespace:hubspot:{{contact.id}}q:{{current_context_or_subject}}limit:5
- Headers:
Authorization: Bearer YOUR_API_KEY
Map {{contact.id}} from the HubSpot trigger. This scopes all memory to this specific HubSpot contact.
Step 3: Inject memory into your AI module
In the OpenAI (or Claude/Gemini) module, add the memory results to the system prompt:
You are a sales assistant with deep knowledge of this contact's history.
Contact memory:
{{http_get_results}}
Use this context to personalize your response. Reference specific past interactions when relevant.
If the HTTP GET returns an array, use Make.com's join() function to convert it to a text string before injecting: {{join(http_get_results[].content; "\n")}}.
Step 4: Add the HTTP POST module
After the AI module, add another HTTP — Make a request module:
- URL:
https://api.retainr.dev/v1/memories - Method: POST
- Headers:
Authorization: Bearer YOUR_API_KEY,Content-Type: application/json - Body (JSON):
{
"namespace": "hubspot:{{contact.id}}",
"content": "{{interaction_summary}}"
}Store a 1-3 sentence summary of what happened: the context, the AI output, and any commitments or next steps.
Namespace Patterns for HubSpot
| Scenario | Namespace |
|---|---|
| Per contact | hubspot:{contact_id} |
| Per deal | hubspot:deal:{deal_id} |
| Per company | hubspot:company:{company_id} |
| Per contact email (stable across recreations) | email:{contact_email} |
For most HubSpot scenarios, hubspot:{contact_id} is the right choice. It is stable, unique, and directly available from any HubSpot trigger.
What to Store in HubSpot Contact Memory
Store the AI interaction context, not raw HubSpot data (HubSpot already stores that). The goal is to capture what the AI knows that HubSpot fields don't:
Good to store:
- "Lead expressed interest in enterprise plan. Objection: integration complexity with legacy ERP."
- "Demo call completed. Showed project management module. Asked about Salesforce migration path."
- "Followed up on trial. Reported confusion with onboarding. Suggested getting started guide."
- "Deal stalled. Champion left company. New contact is Sarah Chen, same company."
Not worth storing (already in HubSpot):
- Contact email, phone, company name
- Deal value, close date, stage
- Form submission data
The retainr memory gives the AI the relationship context that structured CRM fields don't capture.
Use Cases
Lead nurture sequences
When a lead triggers a stage change in HubSpot, the AI can draft a follow-up that references the specific pain point they mentioned three weeks ago — not a generic template. Conversion rates improve because the outreach feels earned.
Sales call prep
When a deal moves to "Meeting Scheduled," trigger a Make.com scenario that retrieves the full interaction history for this contact and generates a briefing doc. The sales rep walks in knowing everything the AI knows about this relationship.
Post-demo follow-up
After a demo call, store the AI's summary of what was covered and what objections were raised. The next follow-up AI call retrieves this and generates a response that directly addresses those objections.
Churn prevention
When a customer's health score drops below a threshold in HubSpot, the AI retrieves the full support and engagement history and generates a personalized outreach — not a generic "we noticed you haven't logged in" email.
Writing AI Summaries Back to HubSpot
A useful pattern: after generating the AI summary, write it back to HubSpot as a note using the HubSpot — Create a Note module. This makes the AI's work visible to human reps in HubSpot without requiring them to use retainr directly.
The flow:
- AI generates response + summary
- retainr POST — stores summary for future AI context
- HubSpot — Create a Note — stores summary for human reps
Both systems get updated. The AI improves on future runs; humans see the history in HubSpot's timeline.
Give your AI agents a real memory
Free plan includes 1,000 memory operations/month. No credit card required.
Add memory to your Make.com HubSpot scenario — free plan →Frequently Asked Questions
How is retainr different from HubSpot notes for AI? HubSpot notes are human-readable but not AI-searchable. retainr uses semantic vector search — the AI retrieves the most relevant past interactions for the current context, not just the most recent ones. A note from six months ago about a specific objection can surface when that objection comes up again.
Can I use this with HubSpot workflow webhooks instead of Make.com triggers? Yes. Configure a HubSpot workflow to send a webhook to a Make.com webhook URL on any automation trigger. The retainr HTTP modules work identically regardless of how the Make.com scenario is triggered.
What if the same contact has hundreds of past interactions? retainr returns the most semantically relevant results (controlled by limit). With limit=5, you get the 5 most relevant memories for the current query — not the 5 most recent. This keeps prompts concise even for long-running customer relationships.
Does the same API key work across n8n and Make.com? Yes. One retainr API key works across all platforms. Your HubSpot contact memories are accessible from Make.com scenarios, n8n workflows, Zapier Zaps, or direct API calls using the same namespace.
What Make.com plan do I need? Any Make.com paid plan. The scenario needs at least 3 modules: HubSpot trigger, HTTP GET, HTTP POST (4 with the AI module). Make.com Free only allows 2 modules per scenario.
Add memory to any Make.com scenario
Working with a different app? These guides cover the exact setup:
- Make.com Gmail AI Memory — Per-sender memory for Gmail AI scenarios
- Make.com Zendesk AI Memory — AI memory for Zendesk support scenarios
- Make.com Airtable AI Memory — Persistent memory for Airtable scenarios
- Make.com WhatsApp AI Memory — Persistent memory for WhatsApp scenarios
- Make.com Slack AI Memory — Persistent memory for Slack scenarios