Turn your Google Sheets sales tracker into a weekly summary by rep

Fridays: deals added and won this week from your sales tracker sheet, by rep, with pipeline added and the rows that need cleaning up.

Runs
Fridays at 16:00
For
Sales
Posts
Report card

From your apps to your board

How the skill works: your agent reads tracker from Google Sheets; spreadsheet id from What you tell it, fridays at 16:00, and gives you report card and the report in the chat.

Reads

  • Google SheetsTracker
  • What you tell itSpreadsheet ID
reads
Your agentClaude Code, Codex, Cursor or GeminiFridays at 16:00
posts

You get

  • Report cardOn your board, updated in place every run
  • The report in the chatEvery run, with or without Briefkin

What you get

  • Deals won this week and their value, and pipeline added.
  • A row per rep: added, pipeline, won, won value.
  • Rows to fix, with row numbers: missing amount or rep, past close dates, unknown stages.

The card on the right is a sample. Yours shows your own numbers and updates in place every run.

What lands on your board

AcmeGoogle Sheets sales tracker summary · Claude Code

4 deals won this week for $31,200

14 deals added with $96,500 in pipeline, 4 won for $31,200. Maya closed 2 of them.

RepAddedPipelineWonWon value
Maya5$38,0002$18,400
Jordan4$27,5001$7,800
Priya3$19,0001$5,000
Sam2$12,0000$0
Team14$96,5004$31,200

Fix in the sheet: rows 212, 218 and 231 have no amount, and 2 open deals have a close date in the past (rows 140 and 177).

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

What it does

Before a team buys a CRM, the pipeline lives in a shared sheet: one row per deal, a rep, a stage, an amount. It works until Friday, when someone has to filter by date, sum by rep and work out what was actually won this week.

The agent does that pass on the sheet as it stands and posts the week per rep. It also lists the rows that would throw the totals off, like a deal with no amount or a close date in the past, so the tracker gets a little cleaner every week.

How it works

  1. 1Read the tracker

    Call spreadsheets.values.get on Deals!A1:J500 with valueRenderOption=UNFORMATTED_VALUE and dateTimeRenderOption=FORMATTED_STRING. Map the header row: Deal, Company, Rep, Stage, Amount, Created, Close date, Won date.

  2. 2

    2Pick this week's rows

    Added means Created between Monday and today. Won means Stage is Won (or Closed won) with a Won date in the same range. Lost works the same way.

  3. 3

    3Total by rep

    For each rep: deals added, pipeline added (the sum of Amount), deals won and won value. Add a team row at the bottom.

  4. 4

    4Find rows to fix

    Open deals whose close date has passed, new rows with no Amount or no Rep, and stages that don't match the list the other rows use.

  5. 5

    5Write the summary

    Team totals, the table by rep, and the rows to fix with their row numbers so they are quick to find.

  6. 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.

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/google-sheets-sales-tracker-summary/install | sh
  2. Run it

    Ask Claude Code:

    promptRun the google-sheets-sales-tracker-summary skill

    Or paste the prompt instead of installing:

    promptRead the Deals tab of my sales tracker in Google Sheets (ID below). Columns: deal, company, rep, stage, amount, created, close date, won date. For this week (Monday to today), count per rep: deals added, pipeline added (sum of amount), deals won (stage Won with a won date this week) and won value, plus a team total. Then list rows that need fixing, with their row numbers: new rows with no amount or rep, open deals whose close date has passed, and stages that don't match the others. Start with the team's won value and pipeline added.
  3. Put it on a schedule

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

    crontab0 16 * * 5 claude -p "Run the google-sheets-sales-tracker-summary 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 report card. How setup works

View the SKILL.mdRaw file
SKILL.md---
name: google-sheets-sales-tracker-summary
description: "Fridays: deals added and won this week from your sales tracker sheet, by rep, with pipeline added and the rows that need cleaning up. Use when the user asks for this, or when it runs on a schedule."
---

# Google Sheets sales tracker summary

Fridays: deals added and won this week from your sales tracker sheet, by rep, with pipeline added and the rows that need cleaning up.

Before a team buys a CRM, the pipeline lives in a shared sheet: one row per deal, a rep, a stage, an amount. It works until Friday, when someone has to filter by date, sum by rep and work out what was actually won this week.

The agent does that pass on the sheet as it stands and posts the week per rep. It also lists the rows that would throw the totals off, like a deal with no amount or a close date in the past, so the tracker gets a little cleaner every week.

## 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

- Viewer access to the tracker for the agent's Google account or service account, plus the spreadsheet ID; a Google Sheets connector or MCP server is the easiest way in.

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

### Steps

1. **Read the tracker** (Google Sheets): Call `spreadsheets.values.get` on `Deals!A1:J500` with `valueRenderOption=UNFORMATTED_VALUE` and `dateTimeRenderOption=FORMATTED_STRING`. Map the header row: Deal, Company, Rep, Stage, Amount, Created, Close date, Won date.
2. **Pick this week's rows**: Added means Created between Monday and today. Won means Stage is Won (or Closed won) with a Won date in the same range. Lost works the same way.
3. **Total by rep**: For each rep: deals added, pipeline added (the sum of Amount), deals won and won value. Add a team row at the bottom.
4. **Find rows to fix**: Open deals whose close date has passed, new rows with no Amount or no Rep, and stages that don't match the list the other rows use.
5. **Write the summary**: Team totals, the table by rep, and the rows to fix with their row numbers so they are quick to find.

## Route B: the browser

### What you need

- Signed in to Google with an account that has at least Viewer access to the tracker; Commenter or Editor is needed to save a filter view, otherwise the agent uses a temporary filter and clears it afterwards.

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

### Steps

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

1. **Open the tracker**: From the Sheets home page, open the sales tracker and click the `Deals` tab at the bottom. Read the header row so the columns are clear: Deal, Company, Rep, Stage, Amount, Created, Close date, Won date.
2. **Filter to this week without disturbing the team**: Use **Data > Create filter view** rather than a plain filter, so other people's view stays as it is. On the Created column choose **Filter by condition > Date is after** and pick last Sunday; read every row, with its row number, rep and amount.
3. **Find the deals won**: Change the filter view: Stage **Filter by values** to `Won` (or `Closed won`), and Won date **Date is after** last Sunday. Note each row's rep and amount. Do the same for Lost if the sheet tracks it.
4. **Look for rows to fix**: Clear the filter view and set Amount to **Is empty**, then Rep to **Is empty**, and read the row numbers. Then filter Stage to everything except Won and Lost and Close date to **Date is before** today for the open deals that have slipped. Scan the Stage column's filter values for spellings that appear once.
5. **Total and write it up**: Add up added deals, pipeline, won deals and won value per rep and for the team, then close the filter view (the X at the top right of the filter bar) so the sheet is left as you found it.

Note: Filter views need Commenter access or better to save; with Viewer access the agent can still sort and read the tab, just more slowly. On a tracker with more than a few thousand rows, reading row by row in the browser is slow; the API route is better there.

## The report

- **Deals won** this week and their value, and **pipeline added**.
- A row per rep: added, pipeline, won, won value.
- Rows to fix, with row numbers: missing amount or rep, past close dates, unknown stages.

## 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": "google-sheets-sales-tracker-summary/<date of this run, e.g. 2026-10-16>",
  "item_key": "google-sheets-sales-tracker-summary",
  "project": "Acme",
  "source": "Google Sheets sales tracker summary skill",
  "kind": "update",
  "title": "4 deals won this week for $31,200",
  "summary": "**14** deals added with **$96,500** in pipeline, **4** won for **$31,200**. Maya closed 2 of them.",
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Rep",
          "Added",
          "Pipeline",
          "Won",
          "Won value"
        ],
        "align": [
          "left",
          "right",
          "right",
          "right",
          "right"
        ],
        "rows": [
          [
            "Maya",
            5,
            "$38,000",
            2,
            "$18,400"
          ],
          [
            "Jordan",
            4,
            "$27,500",
            1,
            "$7,800"
          ],
          [
            "Priya",
            3,
            "$19,000",
            1,
            "$5,000"
          ],
          [
            "Sam",
            2,
            "$12,000",
            0,
            "$0"
          ],
          [
            "Team",
            14,
            "$96,500",
            4,
            "$31,200"
          ]
        ]
      }
    },
    {
      "type": "Callout",
      "props": {
        "text": "Fix in the sheet: rows 212, 218 and 231 have no amount, and 2 open deals have a close date in the past (rows 140 and 177).",
        "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 16:00 (`0 16 * * 5`). From cron, with the agent signed in on that machine:

```bash
0 16 * * 5 claude -p "Run the google-sheets-sales-tracker-summary 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/google-sheets-sales-tracker-summary#schedule

Source: https://briefkin.dev/skills/google-sheets-sales-tracker-summary

What your agent needs

  • Viewer access to the tracker for the agent's Google account or service account, plus the spreadsheet ID; a Google Sheets connector or MCP server is the easiest way in.

Connecting Google Sheets

  1. Google Sheets MCP server, Google's remote server at https://sheetsmcp.googleapis.com/mcp/v1, part of the Google Workspace MCP servers in developer preview, with read-only spreadsheets.readonly and drive.readonly scopes available (setup).
  2. Claude's Google Drive connector searches and opens files in your Drive, which is enough to find a sheet and read it in a chat.
  3. Sheets API with a service account. Enable the Google Sheets API, create a service account, share the spreadsheet with its email, and set GOOGLE_APPLICATION_CREDENTIALS and SHEET_ID (the long ID in the sheet's URL). Use the spreadsheets.readonly scope unless the skill appends rows.

Share the sheet with the service account as Viewer unless the skill writes; it can only open files someone shared with it, so the rest of your Drive stays out of reach.

Questions

What if our stages are named differently?

Tell the agent which stage means won and which means lost, for example "Signed" and "Dead". Everything else counts as open. It also lists stage names it sees only once, which are usually typos.

Can it update the sheet, like filling in missing reps?

Not by default; it only reads, so the tracker stays the team's. With edit access and your go-ahead it can write with spreadsheets.values.update, for example marking past-due deals in a Notes column.

Do I need Briefkin to use the Google Sheets sales tracker summary 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 report card, 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 Google Sheets pages themselves: the agent opens docs.google.com/spreadsheets 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.

Read this report on your board, not in a chat log

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.