Every lead lands where you already work
OpusDone sends every captured lead to one of two destinations: a Google Sheet it creates in your own Drive, or a signed webhook to any https endpoint you control. The delivery row is committed in the same transaction as the lead, so a lead can never exist without its delivery. Failed deliveries retry six times, and delivery is free on every tier.
Reviewed

The leads workspace already lets you filter, search, sort and export. That helps the person who opens it. Delivery is for everyone who does not.
An alert goes out when a lead scores 50 or more, and the full record waits in the workspace. Your receptionist works from a phone, your sales list lives somewhere else, and the two never meet.
Roughly three in four small Spanish firms run without one. A spreadsheet a receptionist can already sort and filter on her phone needs no new software and no training.
Zapier’s free plan does not include webhooks — Webhooks is a Premium app and needs a paid plan. Make and n8n both accept a plain webhook on their free tiers.
Each destination is a tile in the “Where your leads go” section of Connections. Turn on one, or both. Every lead is delivered once per destination.
We create “<Business> — Leads” in your own Drive, with a Leads tab. Ten columns — Date, Name, Email, Phone, Channel, Score, Status, Booking, Summary, Lead link — appended by position, so you can rename any header and nothing breaks.
One POST per lead to any https endpoint, signed with HMAC-SHA256 over the timestamp and the raw body. Four headers, a stable id for dedupe, and six retries on a widening curve.
There is no native app for any of them. Each one consumes the same plain webhook, which is how a lead reaches your CRM — through Make, n8n or Zapier rather than a connector we maintain.
Nothing here is configured per lead. You set the destination once and then stop thinking about it.
The header is sha256=<hex>, computed over the timestamp, a full stop, and the exact bytes on the wire. The timestamp is inside the signed string, so a captured request cannot be replayed forever.
const crypto = require('crypto');
// Mount this route with express.raw({ type: 'application/json' }).
function verified(req, secret) {
const sent = req.get('X-OpusDone-Signature') || '';
const ts = req.get('X-OpusDone-Timestamp') || '';
const age = Math.abs(Date.now() - Date.parse(ts));
if (!(age < 5 * 60 * 1000)) return false;
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(ts + '.')
.update(req.body) // raw bytes, not the parsed object
.digest('hex');
const a = Buffer.from(sent);
const b = Buffer.from(expected);
return a.length === b.length && crypto.timingSafeEqual(a, b);
}Compare in constant time, and treat X-OpusDone-Delivery as the retry handle: the same id may arrive twice, so store it and ignore repeats.
Two destinations and one event. Everything below was left out on purpose, and we would rather you read it here than find it after signing up.
There is no HubSpot, Pipedrive or Salesforce button. Your data reaches your CRM through Make, n8n or Zapier, each consuming the same signed webhook.
We create a new sheet in your Drive and own row 1. There is no file picker, no tab chooser and no column-mapping screen. Rename the headers if you like — we write by position.
Delivery runs one way, outwards. Nothing you type in the sheet or return from your endpoint is read back into OpusDone.
Exactly one event exists: lead.captured, sent once per lead per destination. There is no hot-lead event and no score-change event.
The summary field is opt-in and off by default, so a clinic or a law firm can send contact details without ever transmitting what a patient or a client said.
A Google Sheet in your own Drive, or a signed webhook to your endpoint. Free on every tier, including the trial.
Solicitar acceso