Gmail automation infrastructure

Gmail webhooks,
without the plumbing.

Connect your users' Gmail, store every message, and get a signed event the moment new mail lands. Verify the signature, fetch the full content from one API. That's it.

No credit card · self-serve in minutes

PoweringSubmitXBenchPushyour app next

Everything you need to ship on Gmail

The boring, reliable parts — OAuth, change detection, storage, signing, retries — handled. You write the part that matters.

One-click Gmail connect

White-label OAuth. Hand users a branded link; their mailbox connects in two clicks — your name, your colors.

Signed webhooks

Every new email becomes an HMAC-signed message.created POST. At-least-once with retries, a dead-letter queue, and idempotency.

Full-mailbox backfill

On connect we sync the entire mailbox to your store — paginated and quiet, with no webhook flood for historical mail.

Read API

Webhooks stay thin. Pull the full message, headers, and attachment metadata on demand, authenticated with your api_key.

From zero to webhooks in three steps

01

Create your org

Sign up and spin up an organization. Your api_key and webhook signing secret are issued instantly.

02

Connect mailboxes

Share your branded connect link. Users authorize Gmail; we set up change-watching and backfill automatically.

03

Receive & fetch

We POST a signed event on every new email. Verify the signature, then fetch the body from the Read API.

Built for developers

A thin, signed notification plus a fetch-on-demand API — the Nylas pattern. Verify in a few lines, in any language.

The webhook we send
POST https://your-app.com/webhooks/courier-owl
X-CourierOwl-Event: message.created
X-CourierOwl-Signature: 9f86d08…

{
  "type": "message.created",
  "org_id": "org_8129…",
  "data": { "object": {
    "id": "19e77cd732…",
    "from": { "email": "sender@x.com", "name": "Sender" },
    "subject": "hi",
    "snippet": "Hello…",
    "fetch_url": "https://…/v1/orgs/…/messages/…"
  } }
}
Verify it (Node)
import crypto from "crypto";

const expected = crypto
  .createHmac("sha256", WEBHOOK_SECRET)
  .update(rawBody)          // the RAW request bytes
  .digest("hex");

if (crypto.timingSafeEqual(
      Buffer.from(sig), Buffer.from(expected))) {
  // trusted — enqueue data.object.id, ack 2xx fast
}

Ship Gmail webhooks this afternoon.

Create an account, connect a mailbox, and watch the signed events roll in.