Skip to content

RecipesHubSpot

HubSpot pipeline

Free

Pipeline value, deals by stage, reps, won this week, and stalled deals. Botopticon is not affiliated with HubSpot.

Access

HubSpot private app token, CRM deals read

Required. Env HUBSPOT_ACCESS_TOKEN. Mode api_key.

  • crm.objects.deals.read
  • crm.schemas.deals.read
  • crm.objects.owners.read

In HubSpot open Settings, then Integrations, then Private Apps, and create an app named Botopticon board. Grant only crm.objects.deals.read, crm.schemas.deals.read, and crm.objects.owners.read. Do not grant write or sensitive-data scopes. Copy the access token once.

Botopticon never stores this key. Paste it into the agent, cron host, or MCP config. Revoke it any time.

Board

Sample · not your account.

Pipeline value

Sample · Open deals

$186k

Updated just nownowHubSpot

By stage

Sample · Open deals

  1. QualifiedOpen
    44.4% deals
  2. ProposalOpen
    33.3% deals
  3. NegotiationOpen
    22.2% deals

Updated just nownowHubSpot

Reps

Sample · Open amount

  1. 1Jordan
    82,000USD
  2. 2Avery
    61,000USD
  3. 3Casey
    43,000USD

Updated just nownowHubSpot

Won this week

Sample · Closed won

  1. Tue$12k · North · Pro annual
  2. Mon$29 · West · monthly

Updated just nownowHubSpot

Command Tiles

Pro

Sample · not your account. The agent puts the ask on the board. You answer there. How Command Tiles work

  • Push the Acme close

    Needs you

    Sample data

    Approval · HubSpot

    Push the stalled Acme deal one week?

    Updated just nownowHubSpot

    Needs you
  • Stalled deals next?

    Needs you

    Sample data

    Question · HubSpot

    Four open deals are past close date. What next?

    Updated just nownowHubSpot

    Needs you

Tiles

  • Pipeline value
  • By stage
  • Reps
  • Won this week
  • Stalled dealsneeds you
  • Stalled deals. needs_you when any open deal is past close date or untouched past your stall threshold.

Setup

  1. 01

    Mint a read-only HubSpot key

    Create a key that can only read. Never grant write. Keep it in the env var named on this page, on the agent or cron host. Botopticon never stores this key. Paste it into the agent, cron host, or MCP config. Revoke it any time.

  2. 02

    Create a Botopticon token

    In the app, open Connection tokens and create one named after this board. Copy it. It is shown once. That token posts to Botopticon. It is not the source key.

  3. 03

    Paste the prompt into your agent

    Open the tab for Grok Bot, Muse, MCP, Cursor, Claude, or curl. Replace $BOTOPTICON_TOKEN. The agent fetches the source, maps the fields in the brief, and posts. Do not paste canned sample JSON as live data.

  4. 04

    Wait for the first live post

    These numbers are sample. They flip when your agent posts with the key. Each tile keeps the sample label until that tile is replaced.

Snippets

Same recipe, one tab per platform. Replace $BOTOPTICON_TOKEN with a connection token. The prompt fetches the source and posts. Do not paste the sample numbers as live data.

Grok Bot

Paste this into Grok Bot. Replace $BOTOPTICON_TOKEN with a Botopticon connection token. Connect MCP at https://www.botopticon.com/api/mcp if this client can. If it cannot, POST /api/ingest with curl instead.

Keep the Botopticon board "HubSpot pipeline" current.

Source: HubSpot.
You hold HUBSPOT_ACCESS_TOKEN (HubSpot private app token, CRM deals read). Botopticon never stores this key. Paste it into the agent, cron host, or MCP config. Revoke it any time.
In HubSpot open Settings, then Integrations, then Private Apps, and create an app named Botopticon board. Grant only crm.objects.deals.read, crm.schemas.deals.read, and crm.objects.owners.read. Do not grant write or sensitive-data scopes. Copy the access token once.
Scopes (read-only): crm.objects.deals.read, crm.schemas.deals.read, crm.objects.owners.read.

What to fetch and how to map it:
Read the current HubSpot CRM docs. Objects: Deal, Deal pipeline stage, Owner.
Pipeline value: sum amount on open deals (not closed-won or closed-lost) in the pipeline you watch. format currency.
By stage: progress rows, one per dealstage, each against the open-deal count for that pipeline.
Reps: rank owners by open pipeline amount.
Won this week: recently closed-won deals as a feed. Label amount and company or deal name.
Stalled: open deals whose close date is past or whose last modified date is older than the threshold you already use (14 days is a reasonable default). Status needs_you when any stalled deal exists.

Tiles:
- Pipeline value — bot HubSpot, tile pipe-value, type kpi.
- By stage — bot HubSpot, tile by-stage, type progress.
- Reps — bot HubSpot, tile reps-now, type leaderboard.
- Won this week — bot HubSpot, tile won-week, type feed.
- Stalled deals — bot HubSpot, tile stalled, type status. needs_you when any open deal is past close date or untouched past your stall threshold. Sample shows needs_you true.

Post each tile to https://www.botopticon.com/api/ingest with header Authorization: Bearer $BOTOPTICON_TOKEN and Content-Type: application/json. Fields: bot, tile, type, title, subtitle, props, needs_you, ttl_seconds.
If you can call MCP, connect to https://www.botopticon.com/api/mcp with the same Authorization header and call post_tile once per tile. The arguments are those JSON fields.
Do not invent numbers. Do not post the same body again just to keep a tile fresh. Set ttl_seconds to how often the value really changes. A quiet tile should show as stale.
When needs_you is true, say who is asking, what it is about, and the ask.

FAQ

Which pane turns amber?
Stalled deals. When an open deal is past its close date or untouched past your stall threshold, the agent sets needs_you.
Does this run on the Free plan?
Yes. Every tile in this recipe is a Free type. A Free workspace still has one board and 8 live tiles. Using this recipe adds the sample tiles to that board.
Does Botopticon store the HubSpot key?
Botopticon never stores this key. Paste it into the agent, cron host, or MCP config. Revoke it any time.
How does the board stay current?
Your agent fetches the source and posts when a number changes. Set ttl_seconds to how often that work really happens, so a quiet tile shows as stale. Use a timer only for data no agent touches, and then at most daily. Never post the same content again just to keep a tile fresh.