Agent Templates
CRM AI agent

CRM AI agent that updates HubSpot records after every call

Reads the Granola transcript after every call, extracts next steps and updates the HubSpot record, drafts the follow-up in Gmail, and confirms in Slack, all on the rep's own delegated OAuth.

CRM AI agent
Sample Agent for Acme
May 22 · 10:00 AM ·
47s
Update CRM from today's TechFlow Inc call
J
Fetching recent Granola transcripts
Fetch call transcript
granolamcp_get_meeting_transcript
Sync to HubSpot deal
hubspot_deal_update
Post Slack summary
slack_send_message
Post-call update: TechFlow Inc
HubSpot deal updated · $350K
"Stage: Proposal → Negotiation"
Gmail draft saved, Slack summary posted to #deal-desk
Result · 15s end-to-end
HubSpot updated with summary and action items
Follow-up draft saved to Gmail
Message Claude...
Trusted by teams shipping agents to production
CRM AI agent
Sample Agent for Acme
May 22 · 10:00 AM ·
47s
Update CRM from today's TechFlow Inc call
J
Fetching recent Granola transcripts
Fetch call transcript
granolamcp_get_meeting_transcript
Sync to HubSpot deal
hubspot_deal_update
Post Slack summary
slack_send_message
Post-call update: TechFlow Inc
HubSpot deal updated · $350K
"Stage: Proposal → Negotiation"
Gmail draft saved, Slack summary posted to #deal-desk
Result · 15s end-to-end
HubSpot updated with summary and action items
Follow-up draft saved to Gmail
Message Claude...

How the agent goes from call transcript to CRM update in five steps

0:00 / 0:00

A real working agent you can deploy

This repo uses a single SCALEKIT_USER_ID env var to simulate one user. In production, pass each user's real ID as the identifier on every Scalekit call, and send them an authorization link whenever their connector status is not ACTIVE. HubSpot's 30-minute token expiry is handled automatically.

01
Authorize, then orchestrate
run_flow.py
Every connection is authorized once via a one-time link. Scalekit refreshes tokens for you, including HubSpot's 30-minute expiry. ensure_authorized() calls get_or_create_connected_account for each connector at startup; if any is not ACTIVE it prints a magic link and waits before continuing.
run_flow.py
connect = ScalekitClient(
    env_url=SCALEKIT_ENV_URL,
    client_id=SCALEKIT_CLIENT_ID,
    client_secret=SCALEKIT_CLIENT_SECRET,
)

def ensure_authorized(connector):
    account = connect.actions.get_or_create_connected_account(
        connection_name=connector,
        identifier=USER_ID,
    )
    if account.status != "ACTIVE":
        link = connect.actions.get_authorization_link(
            connection_name=connector,
            identifier=USER_ID,
        )
        print(f"Authorize {connector}:\n{link}")
        input("Press Enter after authorization...")

for connector in ["granolamcp", "hubspot", "gmail", "slack"]:
    ensure_authorized(connector)
02
Fetch Granola call transcripts
run_flow.py
03
Extract deal data with LLM
run_flow.py
04
Sync to HubSpot deal
run_flow.py
05
Create Gmail draft and post to Slack
connectors/gmail.py

Agents that update your CRM, without the auth plumbing

Four things you'd otherwise build: Granola MCP auth, HubSpot OAuth with 30-minute refresh, Gmail credentials, Slack auth. Handled.

1
Install
npx @scalekit-inc/cli setup
# select your coding agent
# enable scalekit MCP server on coding agent
terminal
npx @scalekit-inc/cli setup
# select your coding agent
# enable scalekit MCP server on coding agent
terminal
npx @scalekit-inc/cli setup
# select your coding agent
# enable scalekit MCP server on coding agent
terminal
npx @scalekit-inc/cli setup
# select your coding agent
# enable scalekit MCP server on coding agent
terminal
npx @scalekit-inc/cli setup
# select your coding agent
# enable scalekit MCP server on coding agent
2
You have the Scalekit authstack plugin installed (AgentKit + SaaSKit skills and MCP auth). Before coding, auto-load the AgentKit skills relevant to connectors (Granola MCP, HubSpot, Gmail, Slack) and use the Scalekit MCP server to validate tool calls instead of hand-written API logic.

Fetch recent Granola call transcripts and extract deal stage, action items, and follow-up email content. Search HubSpot for the matching deal and update it, save a follow-up draft in Gmail, and post a summary to Slack — all via the appropriate AgentKit connector tools. Ask before using write tools (updating HubSpot, saving the Gmail draft, posting to Slack); reading transcripts runs without asking.
Why choose Scalekit

Delegated identity. Not service accounts.

Credentials never touch agent code or LLM context. The agent acts as the user, not as a shared bot.
Delegated OAuth - Agent reads your calendar, your inbox — scoped to the authorizing identity, not org-wide.
Credentials outside agent runtime  -  Tokens never touch agent code or LLM context. Both failure modes covered.
Token lifecycle automatic  -  Refresh, expiry, rotation across all connectors. One SDK call. Zero management code.
200+ prebuilt connectors  -  Google, Slack, HubSpot, GitHub, Jira, Notion, Salesforce — same auth pattern everywhere.
Try other Agent Templates

Prebuilt agents you can ship today

Each one runs on delegated identity, scoped per user.

SALES
Sales call prep agent
Read tomorrow's calls from Google Calendar, mine Granola notes and Attio history, and deliver each rep a prep brief in Slack.
SALES
Deal intelligence agent
Score Gong call risk with an LLM, cross-reference the Attio record, and DM each owner their at-risk deals in Slack.
SALES
Outbound prospecting agent
Search Apollo for ICP matches, rank them, draft personalised Gmail outreach, and log every send to Google Sheets.
GTM
HubSpot to Slack updates agent
Watch HubSpot deal stage changes and post structured updates to the right Slack channel. Reps stop checking the CRM all day.
ENGINEERING
Engineering standup agent
Pull commits from GitHub and GitLab, track Jira issue movement, and post a per-engineer standup brief to Slack.
OPS
Email-to-calendar scheduling agent
Read scheduling intent out of Gmail threads, resolve mutual free time, and create the Google Calendar event.

Build your own
multi-connector agent

Add connectors. Change the LLM. Same delegated auth pattern.