Web widget and Telegram are live. WhatsApp is next.
OpusDone
Log inRequest access
Lead delivery

Every lead lands where you already work

Every lead is delivered to a Google Sheet or a signed webhook.

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.

  • A Google Sheet in your Drive, or a signed webhook
  • Delivered within a minute, with six retries
  • Free on every tier, trial included

Reviewed

An OpusDone activity report
Why this shipped

A captured lead in a tab nobody has open is still a missed lead

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.

01

The record sits where the work 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.

02

Most small firms have no CRM to sync to

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.

03

Elsewhere, a webhook is a paid extra

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.

Where your leads go

Where does OpusDone send a captured lead?

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.

Google Sheets

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.

Signed webhook

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.

Make, n8n or Zapier

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.

How a lead travels

From the conversation to your sheet, in seven steps

Nothing here is configured per lead. You set the destination once and then stop thinking about it.

  1. 01

    You pick a destination

    Open Connections, choose the sheet tile or the webhook tile. For a webhook you paste an https URL and copy the signing secret, which is shown exactly once and then stored encrypted.
  2. 02

    A lead is captured and scored

    Your assistant collects contact details during the conversation and scores the lead 0–100 on published weights — email, phone, a booking, a company, engagement. One lead per person across channels.
  3. 03

    The delivery is committed with the lead

    A transactional outbox writes one row per lead per destination, in the same database transaction as the lead itself. A lead can never exist without its delivery.
  4. 04

    A background job drains the outbox

    Once a minute, on its own dedicated queue, so a hanging client endpoint never holds a slot that would otherwise be answering a customer. Up to 50 rows a pass, and businesses are taken round-robin.
  5. 05

    The row is appended, or the POST is sent

    The sheet write uses valueInputOption=RAW. The webhook carries four headers — signature, timestamp, delivery id and event name — and the receiver has 3 seconds to connect and 5 seconds in total. Redirects are not followed.
  6. 06

    Failures are retried, then stopped

    Six attempts at 1, 5, 30, 120, 360 and 1440 minutes. A failure that will never succeed — a 401, say — dies immediately instead of spinning for a day.
  7. 07

    You can see what happened

    The webhook drawer has a read-only “Recent deliveries” tab with status, attempts, response code, the error in plain English and when the next attempt is due. A banner appears on the Leads page if anything has been dead over the past seven days.
For your developer

How do you verify an OpusDone webhook signature?

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.

js
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.

The numbers

What the mechanism actually promises

1 minoutbox drain interval
6attempts before it stops
10columns in your sheet
€0on every tier
Guardrails

What does OpusDone lead delivery not do?

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.

No native CRM connector

There is no HubSpot, Pipedrive or Salesforce button. Your data reaches your CRM through Make, n8n or Zapier, each consuming the same signed webhook.

No connecting an existing spreadsheet

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.

No inbound sync

Delivery runs one way, outwards. Nothing you type in the sheet or return from your endpoint is read back into OpusDone.

One event, not a stream

Exactly one event exists: lead.captured, sent once per lead per destination. There is no hot-lead event and no score-change event.

No conversation text unless you ask for it

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.

Lead delivery questions, answered

What lands in the sheet?

One row per lead, with Date, Name, Email, Phone, Channel, Score, Status, Booking, Summary and Lead link. Rehearsals are excluded by default: a sandbox conversation records a skipped row rather than a delivery.

Where is the signing secret, and can I change it?

It is shown exactly once when you create the destination and encrypted at rest after that. You can regenerate it on demand from the same drawer. There is no automatic rotation, so the change happens when you decide it does.

How do I know deliveries are working?

The “Recent deliveries” tab shows status, attempts, response code, the error and the next attempt due. “Send test event” fires one real sample payload synchronously and reports the actual status back. Transport errors and Google 403s are turned into a sentence you can act on, not a bare status code.

What does it cost?

Nothing. There is no entitlement checkbox, no tier cap and no feature flag — lead delivery is on every tier including the trial. Zapier charges for webhooks on its Premium app; Make and n8n accept a plain webhook on their free tiers.

What does the webhook send?

A JSON body with event ("lead.captured"), id ("lead_<id>"), an ISO-8601 UTC timestamp, tenant, the lead itself — id, name, email, phone, company, status, score, channel, intent, reachable, created_at — a booking object or null, and summary only if you opted in.

What if my endpoint is down or slow?

Six attempts at 1, 5, 30, 120, 360 and 1440 minutes. Timeouts are 3 seconds to connect and 5 seconds in total, and redirects are not followed. A non-retryable response such as a 401 stops straight away rather than retrying all day.

Can a customer’s message damage my sheet?

Every cell is guarded against formula injection: =, +, -, @, tab and carriage return are apostrophe-prefixed and the write uses RAW, so a name typed as =IMPORTXML(…) stays text. Webhook URLs pass an SSRF guard enforced twice, in TypeScript when saved and again in Python when sent — https only, no redirects, with loopback, private ranges, CGNAT, multicast and the cloud-metadata range blocked. Delivery runs on our infrastructure in Germany and each business is isolated from every other.

Every lead in your sheet within a minute

A Google Sheet in your own Drive, or a signed webhook to your endpoint. Free on every tier, including the trial.

Request access
Lead Delivery — Google Sheets or Signed Webhook | OpusDone