Find the open CRM deals with no email, meeting or call behind them

Fridays: open deals with no email, meeting or Gong call with the buyer in 14 days, and this week's external meetings the CRM never heard about.

Runs
Fridays at 14:00
Posts
Asks you

What lands on your board

AcmeGhost pipeline: CRM deals with no real contact · Claude Code

11 open deals ($84k) with no real contact in 14 days

What should I do with the ghost deals and the unlogged meetings?

11 open deals worth $84,000 have no email, meeting or Gong call with the buyer in 14 days, though 9 of them were edited in the CRM in the last 7 days. 3 external meetings this week have nothing logged in the CRM.

DealAmountStageCRM updatedLast real contact
Contoso$18,000Proposal sent2 days agoEmail, Sep 29
Litware$14,000Negotiation4 days agoMeeting, Sep 24
Adatum$12,000Demo done1 day agoGong call, Oct 2
Proseware$9,500Qualified6 days agoNone in 90 days
Coho Winery$7,000Proposal sent3 days agoEmail, Oct 8
Wingtip Toys$5,500Demo booked5 days agoEmail, Oct 6
Bellows College$4,500Qualified9 days agoMeeting, Sep 18
Northwind Traders$4,000Negotiation2 days agoEmail, Oct 12

Showing 8 of 11. Three more under $4,000 add up to $9,500.

Meeting this weekWhenCompanyIn the CRM
Pricing walkthroughTue Oct 27fourthcoffee.comNo deal for this domain
Security reviewWed Oct 28Lamna HealthcareNothing logged since Oct 9
Kickoff callThu Oct 29Trey ResearchNothing logged since Oct 14

Start with Contoso ($18,000, Proposal sent): the deal was edited 2 days ago, but nobody at contoso.com has written or met with us since Sep 29.

Resolve
An example with made-up numbers. Your agent posts your real ones.

What it does

A deal can look alive in the CRM for weeks. A rep moves the close date, adds a task, edits the amount, and the record stays freshly touched. None of that is a conversation with the buyer. The evidence of a real conversation sits in the inbox, the calendar and the call recorder, and nobody lines those up with the pipeline.

Every Friday the agent takes each open deal, collects its contacts' emails and the company domain, and looks for a thread, a held meeting or a recorded call with those people in the last 14 days. Deals with none are ghost pipeline. It also runs the check the other way round: external meetings this week whose company has no deal, or no update logged since the meeting. Founders and sales leads get both lists before the forecast call.

How it works

  1. 1Collect open deals and their people

    Use whichever CRM you have. HubSpot: POST /crm/v3/objects/deals/search with hs_is_closed EQ false and properties dealname, amount, dealstage, hubspot_owner_id, createdate, notes_last_updated, then POST /crm/v4/associations/deals/contacts/batch/read and /crm/v4/associations/deals/companies/batch/read for contact email and company domain. Pipedrive: GET /api/v2/deals?status=open, then GET /api/v2/persons?deal_id={id} for each person's emails. Salesforce: SELECT Id, Name, Amount, StageName, Owner.Name, CreatedDate, LastActivityDate, Account.Website FROM Opportunity WHERE IsClosed = false and SELECT OpportunityId, Contact.Email FROM OpportunityContactRole WHERE Opportunity.IsClosed = false.

  2. 2

    2Build the match keys

    Lowercase and trim every email. A deal's domain is the company domain (or its website without https://, www. and anything after the first /), else the domain of its contacts' emails. Free-mail domains (gmail.com, outlook.com, hotmail.com, yahoo.com, icloud.com) and your own domain never count as a deal domain, so those deals match on exact contact emails only.

  3. 3Gather contact evidence from the last 14 days

    Gmail: per deal, users.threads.list with q like {from:@contoso.com to:@contoso.com cc:@contoso.com} newer_than:14d (exact addresses for free-mail contacts); skip threads whose only outside sender is a noreply or notification address. Google Calendar: one events.list on primary with timeMin 14 days ago, timeMax now and singleEvents=true, dropping status: cancelled events and those every outside attendee declined. Gong: one POST /v2/calls/extensive for the same 14 days with exposedFields.parties: true, keeping parties with affiliation: External.

  4. 4

    4Join the evidence to the deals

    Match calendar attendee email and Gong party emailAddress to a deal's contact emails first, then to its domain; a Gmail hit already belongs to the deal it was searched for. A deal with no thread, no held meeting and no Gong call is a ghost; leave out deals created in the last 14 days. For each ghost, find the last real contact with the same Gmail search at newer_than:90d and the calendar back 90 days, or write "none in 90 days". Evidence that matches no deal feeds the next step.

  5. 5Run the check the other way

    Take this week's held meetings with an outside, non-free-mail domain and Gong calls whose metaData.scope is External, and group them by domain. Flag a domain with no open deal, or whose deal has nothing logged after the meeting started (HubSpot notes_last_updated, Pipedrive GET /api/v2/activities?deal_id={id}&updated_since=<meeting start>, Salesforce LastActivityDate). Skip the domains on a list the person keeps (investors, vendors, recruiters).

  6. 6Ask, then task owners or log meetings

    Post the ghosts largest amount first, with CRM last activity beside last real contact, plus the unlogged meetings, and ask what to do. On the answer, create a task per ghost for its owner (HubSpot POST /crm/v3/objects/tasks, Pipedrive POST /api/v2/activities, a Salesforce Task) or log the meetings on their deals. Never close a deal or change its stage.

  7. Post it to the board

    With BRIEFKIN_TOKEN set, the agent sends the result as one card that updates in place every run. Without it, you get the report in the chat.

What you get

  • Ghost deals: open deals with no email, meeting or Gong call with the buyer in 14 days, with total amount.
  • The list, largest first: amount, stage, owner, when the CRM was last touched and the date of the last real contact.
  • Unlogged meetings: external meetings this week whose company has no deal or no update since.
  • The ask: task the owners, log the meetings, or both.
  • What to do first: the largest ghost whose CRM record was touched most recently, since that is the one being reported as alive.

Install and run it

Pick your agent, where the data comes from and how to schedule it; the commands below follow.

Agent
Data
Schedule
  1. Install the skill

    One command. It puts the SKILL.md in ~/.claude/skills and in ~/.agents/skills, which Codex, Cursor, Gemini CLI, Copilot CLI and OpenCode read too.

    shellcurl -fsSL https://briefkin.dev/skills/hubspot-ghost-pipeline/install | sh
  2. Run it

    Ask Claude Code:

    promptRun the hubspot-ghost-pipeline skill

    Or paste the prompt instead of installing:

    promptFrom my CRM (HubSpot, Pipedrive or Salesforce, read only), list open deals with amount, stage, owner, last activity date, their contacts' emails and company domain. Lowercase emails; ignore free-mail domains and mine for domain matching. For each deal, search my Gmail for threads with those addresses or that domain in the last 14 days, my Google Calendar for held meetings with them in the same window, and Gong calls with them as external parties. Deals older than 14 days with none of the three are ghost deals: give me each with amount, stage, owner, when the CRM was last updated and the date of the last real contact (look back 90 days). Then do the reverse: external meetings I had this week whose company has no open deal or nothing logged on the deal since the meeting. Sort ghosts by amount, total them, and ask me whether to create follow-up tasks for owners or log the meetings. Change nothing until I answer.
  3. Put it on a schedule

    Fridays at 14:00, from cron on any machine where Claude Code is signed in:

    crontab0 14 * * 5 claude -p "Run the hubspot-ghost-pipeline skill"

    Add it with crontab -e. A laptop asleep at that time runs it when it wakes if you use launchd or Task Scheduler instead; GitHub Actions works for the API route.

  4. Send it to your board

    Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a question for you. How setup works

View the SKILL.mdRaw file
SKILL.md---
name: hubspot-ghost-pipeline
description: "Fridays: open deals with no email, meeting or Gong call with the buyer in 14 days, and this week's external meetings the CRM never heard about. Use when the user asks for this, or when it runs on a schedule."
---

# Ghost pipeline: CRM deals with no real contact

Fridays: open deals with no email, meeting or Gong call with the buyer in 14 days, and this week's external meetings the CRM never heard about.

A deal can look alive in the CRM for weeks. A rep moves the close date, adds a task, edits the amount, and the record stays freshly touched. None of that is a conversation with the buyer. The evidence of a real conversation sits in the inbox, the calendar and the call recorder, and nobody lines those up with the pipeline.

Every Friday the agent takes each open deal, collects its contacts' emails and the company domain, and looks for a thread, a held meeting or a recorded call with those people in the last 14 days. Deals with none are ghost pipeline. It also runs the check the other way round: external meetings this week whose company has no deal, or no update logged since the meeting. Founders and sales leads get both lists before the forecast call.

## Two ways to get the data

Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.

## Route A: API or MCP server

### What you need

- Read access to open deals, their contacts and companies in HubSpot, Pipedrive or Salesforce (whichever you use), with the buyer's email on each deal's contacts: the whole join runs on those emails and domains.
- Read access to the Gmail and Google Calendar whose threads and meetings count (`gmail.readonly`, `calendar.events.readonly`), and a Gong API access key if you record calls.
- Permission to create tasks or activities in the CRM, only if you want the agent to act on your answer.

If something is missing, say what and stop; do not invent numbers.

### Steps

1. **Collect open deals and their people** (HubSpot): Use whichever CRM you have. HubSpot: `POST /crm/v3/objects/deals/search` with `hs_is_closed EQ false` and properties `dealname`, `amount`, `dealstage`, `hubspot_owner_id`, `createdate`, `notes_last_updated`, then `POST /crm/v4/associations/deals/contacts/batch/read` and `/crm/v4/associations/deals/companies/batch/read` for contact `email` and company `domain`. Pipedrive: `GET /api/v2/deals?status=open`, then `GET /api/v2/persons?deal_id={id}` for each person's `emails`. Salesforce: `SELECT Id, Name, Amount, StageName, Owner.Name, CreatedDate, LastActivityDate, Account.Website FROM Opportunity WHERE IsClosed = false` and `SELECT OpportunityId, Contact.Email FROM OpportunityContactRole WHERE Opportunity.IsClosed = false`.
2. **Build the match keys**: Lowercase and trim every email. A deal's domain is the company domain (or its website without `https://`, `www.` and anything after the first `/`), else the domain of its contacts' emails. Free-mail domains (`gmail.com`, `outlook.com`, `hotmail.com`, `yahoo.com`, `icloud.com`) and your own domain never count as a deal domain, so those deals match on exact contact emails only.
3. **Gather contact evidence from the last 14 days** (Gmail): Gmail: per deal, `users.threads.list` with `q` like `{from:@contoso.com to:@contoso.com cc:@contoso.com} newer_than:14d` (exact addresses for free-mail contacts); skip threads whose only outside sender is a `noreply` or notification address. Google Calendar: one `events.list` on `primary` with `timeMin` 14 days ago, `timeMax` now and `singleEvents=true`, dropping `status: cancelled` events and those every outside attendee declined. Gong: one `POST /v2/calls/extensive` for the same 14 days with `exposedFields.parties: true`, keeping parties with `affiliation: External`.
4. **Join the evidence to the deals**: Match calendar attendee `email` and Gong party `emailAddress` to a deal's contact emails first, then to its domain; a Gmail hit already belongs to the deal it was searched for. A deal with no thread, no held meeting and no Gong call is a ghost; leave out deals created in the last 14 days. For each ghost, find the last real contact with the same Gmail search at `newer_than:90d` and the calendar back 90 days, or write "none in 90 days". Evidence that matches no deal feeds the next step.
5. **Run the check the other way** (Google Calendar): Take this week's held meetings with an outside, non-free-mail domain and Gong calls whose `metaData.scope` is `External`, and group them by domain. Flag a domain with no open deal, or whose deal has nothing logged after the meeting started (HubSpot `notes_last_updated`, Pipedrive `GET /api/v2/activities?deal_id={id}&updated_since=<meeting start>`, Salesforce `LastActivityDate`). Skip the domains on a list the person keeps (investors, vendors, recruiters).
6. **Ask, then task owners or log meetings** (HubSpot): Post the ghosts largest amount first, with CRM last activity beside last real contact, plus the unlogged meetings, and ask what to do. On the answer, create a task per ghost for its owner (HubSpot `POST /crm/v3/objects/tasks`, Pipedrive `POST /api/v2/activities`, a Salesforce `Task`) or log the meetings on their deals. Never close a deal or change its stage.

## Route B: the browser

### What you need

- Signed in to the CRM with view access to all open deals, to the Gmail and Google Calendar whose threads and meetings count, and to Gong if you record calls.

If something is missing, say what and stop; do not invent numbers.

### Steps

Start at https://app.hubspot.com/contacts/. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.

1. **List the open deals**: HubSpot: pick the account, go to **CRM > Deals** in list view, filter **Deal stage** to the open stages and sort by **Amount**. Pipedrive: **Deals** in list view filtered to open deals. Salesforce: **Opportunities**, **All Opportunities**, open stages only. For the 25 largest, note amount, stage, owner, **Last activity date**, the contacts' emails and the company domain.
2. **Search Gmail for each deal**: In `https://mail.google.com/` search `{from:@contoso.com to:@contoso.com} newer_than:14d` with the deal's domain, or the contact's exact address for gmail.com and similar. A thread where they wrote, or you wrote to them, counts; automated notifications do not.
3. **Check Calendar and Gong**: In `https://calendar.google.com/` type the domain in **Search** and look for events in the last 14 days that took place and were not declined. In Gong, search the company name and look for a call in the same 14 days. A deal with none of the three is a ghost; for ghosts, change the Gmail search to `newer_than:90d` to date the last real contact.
4. **Check this week's meetings the other way**: In Calendar's week view, open each meeting with outside guests and take their domain. In the CRM, search the company: is there an open deal, and does its activity timeline show anything logged after the meeting? Skip investors, vendors and recruiters.
5. **Report and ask**: Ghost deals largest first with CRM last activity beside the last real contact and the total, then the unlogged meetings. Ask whether to create a follow-up task for each owner or log the meetings, and do only what the answer says.

Note: Each deal takes three searches, so the browser route suits about 25 deals; past that, use the API route. Gmail and Calendar only show the signed-in person's mail and meetings, so threads that live in a rep's mailbox count only if the rep runs it. Calendar search matches guests' emails as well as titles.

## The report

- **Ghost deals**: open deals with no email, meeting or Gong call with the buyer in 14 days, with total amount.
- **The list**, largest first: amount, stage, owner, when the CRM was last touched and the date of the last real contact.
- **Unlogged meetings**: external meetings this week whose company has no deal or no update since.
- The ask: task the owners, log the meetings, or both.
- What to do first: the largest ghost whose CRM record was touched most recently, since that is the one being reported as alive.

## Post it to Briefkin

When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.

```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
  -H "authorization: Bearer $BRIEFKIN_TOKEN" \
  -H "content-type: application/json" \
  -d @- <<'JSON'
{
  "v": 1,
  "event_id": "hubspot-ghost-pipeline/<date of this run, e.g. 2026-10-16>",
  "item_key": "hubspot-ghost-pipeline",
  "project": "Acme",
  "source": "Ghost pipeline: CRM deals with no real contact skill",
  "kind": "action",
  "title": "11 open deals ($84k) with no real contact in 14 days",
  "summary": "**11 open deals worth $84,000** have no email, meeting or Gong call with the buyer in 14 days, though 9 of them were edited in the CRM in the last 7 days. **3 external meetings** this week have nothing logged in the CRM.",
  "action": {
    "request": "What should I do with the ghost deals and the unlogged meetings?",
    "options": [
      "Task owners and log meetings",
      "Task the owners only",
      "Log the meetings only",
      "Nothing this week"
    ]
  },
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Deal",
          "Amount",
          "Stage",
          "CRM updated",
          "Last real contact"
        ],
        "align": [
          "left",
          "right",
          "left",
          "left",
          "left"
        ],
        "rows": [
          [
            "Contoso",
            "$18,000",
            "Proposal sent",
            "2 days ago",
            "Email, Sep 29"
          ],
          [
            "Litware",
            "$14,000",
            "Negotiation",
            "4 days ago",
            "Meeting, Sep 24"
          ],
          [
            "Adatum",
            "$12,000",
            "Demo done",
            "1 day ago",
            "Gong call, Oct 2"
          ],
          [
            "Proseware",
            "$9,500",
            "Qualified",
            "6 days ago",
            "None in 90 days"
          ],
          [
            "Coho Winery",
            "$7,000",
            "Proposal sent",
            "3 days ago",
            "Email, Oct 8"
          ],
          [
            "Wingtip Toys",
            "$5,500",
            "Demo booked",
            "5 days ago",
            "Email, Oct 6"
          ],
          [
            "Bellows College",
            "$4,500",
            "Qualified",
            "9 days ago",
            "Meeting, Sep 18"
          ],
          [
            "Northwind Traders",
            "$4,000",
            "Negotiation",
            "2 days ago",
            "Email, Oct 12"
          ]
        ]
      }
    },
    {
      "type": "Text",
      "props": {
        "text": "Showing 8 of 11. Three more under $4,000 add up to $9,500.",
        "variant": "muted"
      }
    },
    {
      "type": "Table",
      "props": {
        "columns": [
          "Meeting this week",
          "When",
          "Company",
          "In the CRM"
        ],
        "rows": [
          [
            "Pricing walkthrough",
            "Tue Oct 27",
            "fourthcoffee.com",
            "No deal for this domain"
          ],
          [
            "Security review",
            "Wed Oct 28",
            "Lamna Healthcare",
            "Nothing logged since Oct 9"
          ],
          [
            "Kickoff call",
            "Thu Oct 29",
            "Trey Research",
            "Nothing logged since Oct 14"
          ]
        ]
      }
    },
    {
      "type": "Callout",
      "props": {
        "text": "Start with Contoso ($18,000, Proposal sent): the deal was edited 2 days ago, but nobody at contoso.com has written or met with us since Sep 29.",
        "tone": "warn"
      }
    }
  ]
}
JSON
```

Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.

## Run it on a schedule

Suggested: Fridays at 14:00 (`0 14 * * 5`). From cron, with the agent signed in on that machine:

```bash
0 14 * * 5 claude -p "Run the hubspot-ghost-pipeline skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```

Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/hubspot-ghost-pipeline#schedule

Source: https://briefkin.dev/skills/hubspot-ghost-pipeline

What your agent needs

  • Read access to open deals, their contacts and companies in HubSpot, Pipedrive or Salesforce (whichever you use), with the buyer's email on each deal's contacts: the whole join runs on those emails and domains.

  • Read access to the Gmail and Google Calendar whose threads and meetings count (gmail.readonly, calendar.events.readonly), and a Gong API access key if you record calls.

  • Permission to create tasks or activities in the CRM, only if you want the agent to act on your answer.

Connecting HubSpot

  1. HubSpot MCP server, HubSpot's remote server at https://mcp.hubspot.com. HubSpot also offers a Claude connector built on the same server; you sign in with your HubSpot user and it sees what that user can see (docs).
  2. API with a private app token. Create a private app in your HubSpot account settings, give it only the scopes the report reads (crm.objects.deals.read, crm.objects.contacts.read, crm.objects.companies.read, crm.objects.owners.read), and store its token in HUBSPOT_ACCESS_TOKEN.

The MCP server and connector can create and update records, so for unattended reports a private app with only .read scopes is the safer credential.

Connecting Pipedrive

  1. Pipedrive MCP server, Pipedrive's official remote server at https://mcp.pipedrive.ai/mcp, signed in with OAuth, with usage limits that depend on your plan. It's in Claude's connector directory, and Pipedrive says it works with any assistant that supports custom MCP connections: in Claude Code, claude mcp add --transport http pipedrive https://mcp.pipedrive.ai/mcp, and the same URL in Codex and Cursor (overview). It searches and reads deals, people, organizations, activities and notes, and can also create and update them.
  2. API with your API token. Find it under Personal preferences > API (app.pipedrive.com/settings/api), store it in PIPEDRIVE_API_TOKEN with PIPEDRIVE_COMPANY_DOMAIN, and send it in the x-api-token header.
  3. OAuth app. For a shared or unattended setup, a Pipedrive app can request read-only scopes such as deals:read, activities:read and contacts:read.

The API token and the MCP server act with your full user rights (MCP changes do show up in the change log); read-only OAuth scopes are the way to keep a scheduled report from editing anything.

Connecting Salesforce

  1. Salesforce Hosted MCP Servers. Salesforce runs MCP servers for your org; in Setup under MCP Servers, activate the read-only SObject Reads server and copy its URL. To use it from Claude, create an External Client App with OAuth (scopes mcp_api and refresh_token, callback https://claude.ai/api/mcp/auth_callback) and add the URL as a custom connector (server reference).
  2. The sf CLI. Log in once with sf org login web --alias prod, then run sf data query --query "SELECT Name, StageName, Amount, CloseDate FROM Opportunity WHERE IsClosed = false" --target-org prod --json. Salesforce's DX MCP server (npx @salesforce/mcp) reuses the same CLI login for local agents.
  3. REST API with OAuth. An External Client App with the api and refresh_token scopes; the skill reads SF_INSTANCE_URL and SF_ACCESS_TOKEN (or a refresh token) and calls the query endpoint.

SObject Reads and SOQL never write, but the user's permissions are the real limit: run reports as an integration user whose permission set grants Read on Opportunity, Account, Lead and Case and nothing else.

Connecting Gmail

  1. Claude's Gmail connector. In Claude, connect Gmail from the connector directory with your Google account to search and read your mail.
  2. Gmail MCP server, Google's own remote server at https://gmailmcp.googleapis.com/mcp/v1, in developer preview with the other Google Workspace MCP servers. It needs an OAuth client in Google Cloud set up for an AI agent (setup).
  3. Gmail API with OAuth. Create a desktop OAuth client, authorize once with the gmail.readonly scope, and store GMAIL_CLIENT_ID, GMAIL_CLIENT_SECRET and GMAIL_REFRESH_TOKEN. Publish the OAuth app (or make it Internal in Workspace): refresh tokens from an app left in Testing expire after seven days.

gmail.readonly can search and read but not send, delete or relabel; add gmail.compose only if you want the agent to leave drafts.

Connecting Google Calendar

  1. Claude's Google Calendar connector, added from Claude's connector directory with your Google account, reads your calendars and events.
  2. Google Calendar MCP server, Google's remote server at https://calendarmcp.googleapis.com/mcp/v1, in developer preview alongside Google's other Workspace MCP servers and signed in through an OAuth client you create in Google Cloud.
  3. Calendar API. For your own calendar, an OAuth client with the calendar.events.readonly scope and a stored refresh token in GOOGLE_CALENDAR_REFRESH_TOKEN. For a team or room calendar, share it with a service account's email using "See all event details", point GOOGLE_APPLICATION_CREDENTIALS at the key and set CALENDAR_ID.

calendar.events.readonly is all an agenda or meeting-load report needs, and a calendar shared as "See all event details" gives the service account no way to edit or delete events.

Connecting Gong

  1. Gong MCP server, Gong's official remote server at https://mcp.gong.io/mcp, read-only. A technical administrator creates an MCP integration in Gong with Personal access, so each person sees only the calls they already can, adds the client's redirect URI, and shares the client ID and secret; in Claude you add it as a custom connector with those values. Its tools (ask_account, ask_deal, generate_brief) return Gong's AI-generated insights about accounts and deals, not raw transcripts, and leave private calls out. Users need a paid Gong seat (docs).
  2. API v2 with an access key. A technical administrator creates an access key and secret in Gong's API settings (Company Settings > Ecosystem > API). The skill reads GONG_ACCESS_KEY, GONG_ACCESS_KEY_SECRET and GONG_BASE_URL and uses basic auth.

The API key reads every call in the company, transcripts included, so keep it in a secret store and point the skill at the deals in the report; for per-person access, use the MCP server with Personal access.

Questions

My reps send the emails, not me. Will it see their threads?

Only the mailbox and calendar it is connected to. For a team, either each rep runs it on their own deals, or a Google Workspace admin grants a service account domain-wide delegation with gmail.readonly and calendar.events.readonly so the agent can read each owner's mailbox for their deals. Gong calls are company-wide with an API key, so they always count.

What if the buyer uses a Gmail address or the company domain differs?

Free-mail contacts are matched on their exact address only, so add every address the buyer uses to the deal's contacts. For a buyer writing from a parent company or a second domain, add that domain to the company record (HubSpot companies can hold more than one domain) and the next run picks it up.

Do I need Briefkin to use the Ghost pipeline: CRM deals with no real contact skill?

No. The skill runs with your own agent and gives you the report in the chat. With a Briefkin token set, each run also posts it to your board as a asks you, so you can glance at it instead of asking again.

Which agents can run it?

Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, Windsurf and Amp all read SKILL.md files. The install command puts it in ~/.claude/skills and ~/.agents/skills, where they look. ChatGPT, the Claude app and Grok take the prompt instead. Pick your agent under "Install and run it" and the commands change to match.

Can it work without an API or MCP server, from my browser?

Yes. Switch the data source to "Your browser" and the steps change to the HubSpot, Pipedrive, Salesforce, Gmail, Google Calendar and Gong pages themselves: the agent opens app.hubspot.com/contacts in a browser you are signed in to and reads the numbers off the page. Claude Code, Codex, Cursor, Claude app and ChatGPT can drive a browser out of the box; Gemini CLI, Copilot CLI and OpenCode need a Playwright or Chrome DevTools MCP server first. It is slower than the API and needs you signed in, so it suits a report you run by hand or from a scheduler on your own computer.

Answer your agents from one board, or from Telegram

Skills are free to use with any agent. Briefkin is where their results land: one board for every report, number and question your agents send, with a ping when something needs you.

Free during the open beta. No card.