email-webhook vs. SendGrid Inbound Parse: Which Should You Use?

SendGrid Inbound Parse is the most widely known way to receive email over HTTP. email-webhook does the same job with considerably less ceremony. This article breaks down exactly where they differ so you can choose the right tool.


How each approach works

SendGrid Inbound Parse works through your own domain. You point an MX record at SendGrid's mail servers, configure an inbound parse domain in their dashboard, and SendGrid forwards arriving mail to a URL you control โ€” as a multipart/form-data POST.

email-webhook gives you a dedicated @email-webhook.com address the moment you sign up. You point that address wherever you like (forward from your own inbox, use it directly, set it as a reply-to), then configure a webhook URL in the dashboard. Incoming mail is forwarded as a JSON POST.


Side-by-side comparison

SendGrid Inbound Parse email-webhook
Setup MX record change + domain verification + parse domain config Sign up and paste a URL
Payload format multipart/form-data application/json
Attachments Binary multipart parts; count in attachments, metadata in attachment-info Inline base64 array in the JSON body
Email content stored? Yes โ€” passes through SendGrid's infrastructure No โ€” forwarded from memory, never written to disk
HTTP methods supported POST only POST, PUT, PATCH, DELETE, GET
Custom headers Not configurable on the outgoing webhook request Up to 5 per webhook
Own domain required Yes โ€” you must control DNS for the receiving domain No โ€” you use a @email-webhook.com address out of the box
Primary product focus Email sending platform; inbound parse is a secondary feature Purpose-built for receiving email over HTTP

The payload format gap

This is the most practical difference day-to-day.

SendGrid delivers mail as multipart/form-data. Your handler has to extract fields from a form post, not a JSON body โ€” which means framework-specific parsing, extra middleware, and more boilerplate:

// SendGrid Inbound Parse handler โ€” multipart form-data
import multer from "multer";
const upload = multer();

app.post("/webhook", upload.any(), (req, res) => {
  const from    = req.body.from;
  const subject = req.body.subject;
  const text    = req.body.text;

  // `attachments` is a count; `attachment-info` is a JSON string with metadata.
  // Actual file data arrives as binary multipart parts, accessible via req.files.
  const attachmentCount = Number(req.body.attachments ?? 0);
  const attachmentInfo  = JSON.parse(req.body["attachment-info"] ?? "{}");
  const files           = req.files; // array of multer file objects

  res.sendStatus(200);
});

email-webhook sends a plain JSON body. No form parser, no extra middleware:

// email-webhook handler โ€” plain JSON
app.post("/webhook", express.json(), (req, res) => {
  const { from, subject, message, attachments } = req.body;
  res.sendStatus(200);
});

Attachments are inline in the attachments array, each with a filename and base64-encoded content. No multipart parser, no separate binary parts to reassemble.


Setup complexity

Getting SendGrid Inbound Parse running requires:

  1. A domain you control with access to its DNS settings.
  2. Adding an MX record pointing at mx.sendgrid.net โ€” which routes all mail for that subdomain through SendGrid.
  3. Verifying the domain inside SendGrid's dashboard.
  4. Configuring an "Inbound Parse" entry with the hostname and destination URL.
  5. Waiting for DNS propagation.

With email-webhook:

  1. Sign up.
  2. Create a webhook with your URL.
  3. Send a test email to your @email-webhook.com address.

No DNS changes. No domain required. No propagation wait. You can be receiving webhooks in under five minutes.


Privacy and data handling

SendGrid is part of Twilio's infrastructure. When a message hits their inbound parse pipeline, it passes through their systems before arriving at your endpoint. Your email content โ€” bodies, attachments, sender details โ€” transits and is processed on their servers.

email-webhook is designed as a pass-through. When an email arrives, it is parsed in memory and immediately forwarded to your endpoint. The body and attachment content are never written to disk. If you have Message Logs enabled, only metadata is stored (sender, subject line, HTTP status, duration) โ€” never the email content itself.

For teams routing business email, confidential notifications, or any privacy-sensitive messages through a third-party service, this distinction matters.


When SendGrid Inbound Parse is the right choice

  • You are already using SendGrid for email sending and want a single vendor.
  • You need to receive email at an address on your own domain (e.g. support@mycompany.com) and can change its MX records.
  • You need the spam score, DKIM result, and SPF status that SendGrid includes in the payload.

When email-webhook is the right choice

  • You want to receive webhook deliveries without touching DNS.
  • Your handler is built to consume JSON โ€” you don't want to deal with multipart/form-data parsing.
  • You are building something where email content must not be stored by a third party.
  • You want to use POST, PUT, PATCH, DELETE, or GET and send custom authentication headers with every delivery.
  • You are building a serverless function, an AI pipeline, or any stateless HTTP handler and want the simplest possible integration.

Using email-webhook with your own domain

If you need to receive mail at your own domain address, you are not limited to the @email-webhook.com address. Most email providers โ€” Gmail, Fastmail, Postfix โ€” support forwarding rules. Set up a forwarding rule that sends mail from support@mycompany.com to your @email-webhook.com address, and your webhook fires on every delivery, no MX record change required.


Summary

Choose SendGrid Inbound Parse if you are already on SendGrid, need inbound mail on your own domain's MX record, or need the spam and authentication metadata it provides.

Choose email-webhook if you want a simpler setup, a clean JSON payload, stronger privacy guarantees, and a service built specifically for this use case. Get started in under five minutes โ†’