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.
Fridays: deals added and won this week from your sales tracker sheet, by rep, with pipeline added and the rows that need cleaning up.
Reads
You get
The card on the right is a sample. Yours shows your own numbers and updates in place every run.
What lands on your board
14 deals added with $96,500 in pipeline, 4 won for $31,200. Maya closed 2 of them.
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.
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.
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.
For each rep: deals added, pipeline added (the sum of Amount), deals won and won value. Add a team row at the bottom.
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.
Team totals, the table by rep, and the rows to fix with their row numbers so they are quick to find.
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.
Pick your agent, where the data comes from and how to schedule it; the commands below follow.
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 | shAsk Claude Code:
promptRun the google-sheets-sales-tracker-summary skillOr 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.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.
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
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
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.
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).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.
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.
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.
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.
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.
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.
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.