Pigeon Atlas
← Integrations

Send email from Zapier

Zapier's own email actions send from Zapier's address. One Webhooks by Zapier step sends from your domain, with your DKIM key, and gives you a message id back.

Updated September 15, 2026

Zapier has two ways to send mail out of the box: Email by Zapier, which sends from @zapiermail.com, and Gmail, which sends from your own mailbox as if you had typed it. The first arrives looking like Zapier; the second uses up your mailbox's daily limit and puts an automation on the same reputation as your personal correspondence. Neither tells you afterwards whether the message was delivered.

One Webhooks by Zapier step sends from a domain you verified, and the reply is a message id you can look up.

The step

Add an action, choose Webhooks by Zapier, event Custom Request. Fill it in:

Field Value
Method POST
URL https://pigeonatlas.com/v1/emails
Data Pass-Through? false
Data the JSON below
Unflatten yes
Headers AuthorizationBearer pa_live_your_key_here, Content-Typeapplication/json

For Data, paste this and swap the mapped fields for the ones from your trigger step:

{
  "from": "Your Company <hello@mail.yourcompany.com>",
  "to": "{{trigger_email}}",
  "subject": "Your order {{order_number}} is confirmed",
  "html": "<p>Thanks, {{first_name}}. We will ship it within two working days.</p>",
  "text": "Thanks, {{first_name}}. We will ship it within two working days."
}

Use Custom Request rather than the plainer POST event. POST builds its body from key–value pairs and turns everything into a string, so a to array or nested JSON never arrives in the shape the API expects. Custom Request sends exactly what you typed.

What comes back

The step's output is {"id": "..."}. Map that id into a spreadsheet row, a CRM note or a Slack message if you want to answer "did that one send?" later — it is what the messages page searches by.

A 4xx reply fails the step and Zapier shows you the body. The two you will meet during setup are 403 validation_error (the from address is not on a verified domain) and 402 quota_exceeded (the month's allowance is gone).

If you are on a plan without webhooks

Webhooks by Zapier is a premium action. Code by Zapier is not, and a JavaScript step does the same job:

const response = await fetch("https://pigeonatlas.com/v1/emails", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${inputData.apiKey}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    from: "Your Company <hello@mail.yourcompany.com>",
    to: [inputData.to],
    subject: inputData.subject,
    text: inputData.body,
  }),
});
output = await response.json();

Pass the key in through Input Data rather than pasting it into the code, so it is not in every copy of the Zap.

Retries, and not sending twice

Zapier replays a step when it times out. Add a third header, Idempotency-Key, mapped to something unique to the trigger — the order number, the row id — and a replay returns the original message instead of sending another. It is the difference between "the customer got one receipt" and "the customer got two and wrote to you".

Before it works

Add mail.yourcompany.com in Pigeon Atlas and publish the three DNS records it gives you — DKIM, SPF and an MX for bounces. Until they resolve you cannot send from that domain at all; that refusal is what stops anyone sending as your domain through us. Keep automations on a subdomain of their own, so a Zap that misfires cannot touch the reputation of the address your people write from.

A thousand a month free, no card

Enough to verify a domain and run a small app from it.

Start sending

Other platforms