Skip to content

RecipesMakeLeaderboards

Deal ranks

Free

Make posts a deal leaderboard, a week of deal value, and what closed today. Ranks are accounts, not people. Botopticon is not affiliated with Make.

  • Deal ranks
  • Deal trend
  • Won today
  • Rank notes

Board

Sample data. Your agent replaces a tile when it posts that tile.

Deal ranks

Sample · Open value

  1. 1Acme
    42,000USD+5%
  2. 2Northwind
    31,000USD+1%
  3. 3Bright
    22,000USD-2%

Updated just nownowCloser

Deal trend

Sample · Open value, 7 days

$91.00

min $79.00max $91.00

TueWedThuFriSatSunMon

Updated just nownowCloser

Won today

Sample · Closed-won value

$12k

Updated just nownowCloser

Rank notes

Sample · Moves since yesterday

  1. 08:15Acme raised the quote
  2. 08:02Bright slipped a stage

Updated just nownowCloser

Setup

  1. 01

    Create a connection token

    Name it Make deals. Copy it once.

  2. 02

    Add an HTTP module

    URL is your origin plus /api/ingest. Method POST. Header Authorization: Bearer and the token. Header Content-Type: application/json. Map CRM fields into the JSON body. One module run per tile, or a repeater.

  3. 03

    Schedule it after the CRM sync

    Daily is enough when no agent touches the numbers. Post again when a deal stage changes. Do not repost unchanged rows just to keep the tile fresh.

Snippets

Replace $BOTOPTICON_TOKEN with a connection token. The URL is this app origin plus /api/ingest or /api/mcp.

curl

#!/bin/sh
# Deal ranks. Posts each tile. Exits non-zero unless curl itself fails.
# Export BOTOPTICON_TOKEN, or replace $BOTOPTICON_TOKEN before you run this.
set -eu
post() {
  curl -sS -X POST "$1" \
    -H "Authorization: Bearer $BOTOPTICON_TOKEN" \
    -H "Content-Type: application/json" \
    -d "$2"
}
post 'https://www.botopticon.com/api/ingest' '{"bot":"Closer","tile":"deal-ranks","type":"leaderboard","title":"Deal ranks","props":{"unit":"USD","emphasis":"top","rows":[{"label":"Acme","value":42000,"delta":0.05},{"label":"Northwind","value":31000,"delta":0.01},{"label":"Bright","value":22000,"delta":-0.02}]},"needs_you":false,"ttl_seconds":86400,"subtitle":"Open value"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Closer","tile":"deal-trend","type":"trend","title":"Deal trend","props":{"window":7,"unit":"USD","series":[{"name":"open","points":[{"date":"2026-03-24","value":80},{"date":"2026-03-25","value":82},{"date":"2026-03-26","value":79},{"date":"2026-03-27","value":88},{"date":"2026-03-28","value":90},{"date":"2026-03-29","value":86},{"date":"2026-03-30","value":91}]}]},"needs_you":false,"ttl_seconds":86400,"subtitle":"Open value, 7 days"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Closer","tile":"won-today","type":"kpi","title":"Won today","props":{"value":12000,"unit":"USD"},"needs_you":false,"ttl_seconds":86400,"subtitle":"Closed-won value"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Closer","tile":"rank-notes","type":"feed","title":"Rank notes","props":{"items":[{"time":"08:15","label":"Acme raised the quote","tone":"ok"},{"time":"08:02","label":"Bright slipped a stage","tone":"warn"}]},"needs_you":false,"ttl_seconds":86400,"subtitle":"Moves since yesterday"}'

Agent prompt

Keep the Botopticon board "Deal ranks" current.
Post each JSON body below to https://www.botopticon.com/api/ingest.
Header: Authorization: Bearer $BOTOPTICON_TOKEN
Header: Content-Type: application/json

If you can call MCP, connect to https://www.botopticon.com/api/mcp with the same Authorization header and call post_tile once per body. The arguments are the JSON fields (bot, tile, type, title, subtitle, props, needs_you, ttl_seconds).

Post when work happens. Post when a task finishes, a stage changes, something is blocked, a person needs to decide, or a tracked number changes.
When needs_you is true, say who is asking, what it is about, and the ask.
Set ttl_seconds to how often you really work. A quiet tile should show as stale.
Use a timer only for data no agent touches, such as an outside metric. Daily is the default.
Never post the same content again just to keep a tile fresh.

{"bot":"Closer","tile":"deal-ranks","type":"leaderboard","title":"Deal ranks","props":{"unit":"USD","emphasis":"top","rows":[{"label":"Acme","value":42000,"delta":0.05},{"label":"Northwind","value":31000,"delta":0.01},{"label":"Bright","value":22000,"delta":-0.02}]},"needs_you":false,"ttl_seconds":86400,"subtitle":"Open value"}
{"bot":"Closer","tile":"deal-trend","type":"trend","title":"Deal trend","props":{"window":7,"unit":"USD","series":[{"name":"open","points":[{"date":"2026-03-24","value":80},{"date":"2026-03-25","value":82},{"date":"2026-03-26","value":79},{"date":"2026-03-27","value":88},{"date":"2026-03-28","value":90},{"date":"2026-03-29","value":86},{"date":"2026-03-30","value":91}]}]},"needs_you":false,"ttl_seconds":86400,"subtitle":"Open value, 7 days"}
{"bot":"Closer","tile":"won-today","type":"kpi","title":"Won today","props":{"value":12000,"unit":"USD"},"needs_you":false,"ttl_seconds":86400,"subtitle":"Closed-won value"}
{"bot":"Closer","tile":"rank-notes","type":"feed","title":"Rank notes","props":{"items":[{"time":"08:15","label":"Acme raised the quote","tone":"ok"},{"time":"08:02","label":"Bright slipped a stage","tone":"warn"}]},"needs_you":false,"ttl_seconds":86400,"subtitle":"Moves since yesterday"}

Make HTTP module

Make HTTP module.
Method: POST
URL: https://www.botopticon.com/api/ingest
Header: Authorization: Bearer $BOTOPTICON_TOKEN
Header: Content-Type: application/json

Send one request per tile. First body:

{"bot":"Closer","tile":"deal-ranks","type":"leaderboard","title":"Deal ranks","props":{"unit":"USD","emphasis":"top","rows":[{"label":"Acme","value":42000,"delta":0.05},{"label":"Northwind","value":31000,"delta":0.01},{"label":"Bright","value":22000,"delta":-0.02}]},"needs_you":false,"ttl_seconds":86400,"subtitle":"Open value"}

Then:

{"bot":"Closer","tile":"deal-trend","type":"trend","title":"Deal trend","props":{"window":7,"unit":"USD","series":[{"name":"open","points":[{"date":"2026-03-24","value":80},{"date":"2026-03-25","value":82},{"date":"2026-03-26","value":79},{"date":"2026-03-27","value":88},{"date":"2026-03-28","value":90},{"date":"2026-03-29","value":86},{"date":"2026-03-30","value":91}]}]},"needs_you":false,"ttl_seconds":86400,"subtitle":"Open value, 7 days"}

{"bot":"Closer","tile":"won-today","type":"kpi","title":"Won today","props":{"value":12000,"unit":"USD"},"needs_you":false,"ttl_seconds":86400,"subtitle":"Closed-won value"}

{"bot":"Closer","tile":"rank-notes","type":"feed","title":"Rank notes","props":{"items":[{"time":"08:15","label":"Acme raised the quote","tone":"ok"},{"time":"08:02","label":"Bright slipped a stage","tone":"warn"}]},"needs_you":false,"ttl_seconds":86400,"subtitle":"Moves since yesterday"}

Post when the number changes. Use a timer only for data no agent touches, and then at most once a day. Never post the same body again just to keep a tile fresh.

FAQ

Can the rows be sales reps?
Use account or deal names. This board ranks deals. It does not rank people.
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.
How does the board stay current?
Post when the work 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.