RecipesMakeLeaderboards
Deal ranks
FreeMake 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
- 1Acme42,000USD+5%
- 2Northwind31,000USD+1%
- 3Bright22,000USD-2%
Deal trend
min $79.00max $91.00
Won today
Rank notes
- 08:15Acme raised the quote
- 08:02Bright slipped a stage
Setup
01
Create a connection token
Name it Make deals. Copy it once.
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.
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.
#!/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"}'
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.
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.