The JD names Zapier, n8n, Claude, Gemini, Apps Script and "agentic" routing. So I built three of them against a realistic crypto-API pipeline. Each runs two ways: zero-infra on a Google Sheet today, or live on HubSpot. Code is on the repo; this page is the tour.
Runs each weekday: flags deals missing an owner or amount, and deals that have gone quiet past a per-stage threshold (New 7d · Qualified 14d · Proposal 21d · Negotiation 30d), then nudges the owner in Slack. Kills the leaks that silently corrupt the forecast.
| DEAL | STAGE | ISSUE |
| Veritas Fund | Proposal | stale 48d |
| Wallet9 | Proposal | stale 52d |
| BlockMetrics | Qualified | stale 31d · no owner |
| Meridian DAO | Qualified | no owner · no amount |
| ChainScope | Qualified | stale 16d |
// the rule, identical in Apps Script & n8n const staleDays = { New:7, Qualified:14, Proposal:21, Negotiation:30 }; for (const d of deals) { const issues = []; if (!d.owner) issues.push('missing owner'); if (!d.amount) issues.push('missing amount'); const days = daysSince(d.last_activity); const th = staleDays[d.stage]; if (th && days > th) issues.push(`stale: ${days}d in ${d.stage}`); if (issues.length) nudgeOwner(d, issues); }
// transparent score → capacity-aware assignment let s = 0; s += emp>=500?35: emp>=100?25: emp>=25?15:5; if (['Institutional','Exchange','Fund'] .includes(seg)) s += 25; s += /booked a call|redistribution/.test(sig)?25:10; // only reps with spare capacity + segment/region fit let pool = reps.filter(r => r.segments.includes(seg) && load[r.name] < r.capacity); pool.sort(byMostSpareCapacity); const rep = pool[0]?.name ?? 'escalate';
Each inbound lead gets a transparent 0–100 score (size · segment · intent · source), then is assigned to the best-fit rep who still has capacity — so high-intent institutional leads get a 15-minute first-touch SLA and nobody gets overloaded. The score is plain code; an LLM only labels ambiguous cases.
| LEAD | SCORE | → REP | SLA |
| Northwind Asset Mgmt | 85 | Aisha | 15 min |
| Castell Securities | 85 | Priya | 15 min |
| Stratos Exchange | 85 | Aisha | 15 min |
| Petal Wallet | 23 | Marcus | 1 day |
Every Monday, aggregate the pipeline into metrics (never raw rows — no PII, no hallucinated deals), hand them to Claude, and post a tight, human-approved digest to leadership. It writes the "so what," which is the part leadership actually reads.
// model sees aggregates only { open_pipeline_usd: 941400, target_usd: 600000, coverage_ratio: 1.57, pipeline_by_stage: { Proposal:331600, Negotiation:488000, ... }, stale_deals: 5, deals_missing_fields: 2 }
Healthy on volume (1.57× coverage) — quality is the risk, not quantity.
Prepared by Edward Tay · for the CoinGecko Revenue Operations Associate (L2) role · Jun 2026 · edwardtay.com · Edwardtay7@gmail.com · sample data is synthetic.