<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ReceiveHQ</title>
    <description>The latest articles on DEV Community by ReceiveHQ (@receivehq).</description>
    <link>https://dev.to/receivehq</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4118146%2F0035a73e-5150-4af5-b4b0-d25e58b2d798.png</url>
      <title>DEV Community: ReceiveHQ</title>
      <link>https://dev.to/receivehq</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/receivehq"/>
    <language>en</language>
    <item>
      <title>Why compliance pages matter (DPA, sub-processors, hosting, imprint)</title>
      <dc:creator>ReceiveHQ</dc:creator>
      <pubDate>Thu, 17 Sep 2026 08:34:52 +0000</pubDate>
      <link>https://dev.to/receivehq/why-compliance-pages-matter-dpa-sub-processors-hosting-imprint-142k</link>
      <guid>https://dev.to/receivehq/why-compliance-pages-matter-dpa-sub-processors-hosting-imprint-142k</guid>
      <description>&lt;p&gt;I'm Sebastian, CTO at &lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;ReceiveHQ&lt;/a&gt; (Cortena B.V.). Use-case #7 — the last in this series: after fan-out, filters, anti-spam, retries, and German baremetal, the question procurement actually asks — &lt;em&gt;where are the pages I can send to legal?&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Topics 2–6 made the pipeline useful. None of that closes a security review if the buyer has to chase you in email for a DPA, a sub-processor list, a hosting declaration, or an imprint. For German legal, tax, healthcare, and similar customers, "we'll send the PDF later" is not a posture — it is a delay.&lt;/p&gt;

&lt;p&gt;We built ReceiveHQ because we were tired of shipping European data through American infrastructure. Cortena already runs self-managed baremetal Kubernetes with a short, mostly European subprocessor list. Postmark inbound was a pragmatic compromise for years. When outbound/dunning forced consolidation, we wanted inbound that matched the rest of the stack — and public trust pages you can open without asking.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four pages (and what each one answers)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Page&lt;/th&gt;
&lt;th&gt;URL&lt;/th&gt;
&lt;th&gt;What it answers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hosting&lt;/td&gt;
&lt;td&gt;&lt;a href="https://receivehq.com/hosting" rel="noopener noreferrer"&gt;receivehq.com/hosting&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Where mail content and app data live (Germany / EEA, Hetzner baremetal, private K8s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DPA&lt;/td&gt;
&lt;td&gt;&lt;a href="https://receivehq.com/dpa" rel="noopener noreferrer"&gt;receivehq.com/dpa&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Processor terms under GDPR Art. 28 — scope, security, breach notice, deletion, audits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sub-processors&lt;/td&gt;
&lt;td&gt;&lt;a href="https://receivehq.com/sub-processors" rel="noopener noreferrer"&gt;receivehq.com/sub-processors&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Who else touches data; how you get notice when the list changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Imprint&lt;/td&gt;
&lt;td&gt;&lt;a href="https://receivehq.com/imprint" rel="noopener noreferrer"&gt;receivehq.com/imprint&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Legal entity, address, contacts — who you are contracting with&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are not marketing footnotes. They are the documents a DPO or vendor-risk team expects before a trial becomes a production MX.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the DPA actually covers
&lt;/h2&gt;

&lt;p&gt;The public DPA (&lt;a href="https://receivehq.com/dpa" rel="noopener noreferrer"&gt;/dpa&lt;/a&gt;) is incorporated into the ReceiveHQ customer agreement. Highlights that matter in a review:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Processor role&lt;/strong&gt; — Cortena B.V. processes Customer Personal Data only on documented instructions (the agreement + your endpoint config)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Purpose limit&lt;/strong&gt; — inbound reception, MIME parse, storage, webhook/blackhole delivery, console, support. No training AI models on your mail&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt; — TLS in transit, encrypted volumes at rest, private German K8s, MFA for production, CIDR-restricted SMTP, optional Basic auth on webhooks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retention&lt;/strong&gt; — operational MinIO raw &lt;code&gt;.eml&lt;/code&gt; / delivery logs: 14-day window unless otherwise agreed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Breach notice&lt;/strong&gt; — without undue delay, and in any event within 72 hours of awareness&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sub-processors&lt;/strong&gt; — authorised list at &lt;a href="https://receivehq.com/sub-processors" rel="noopener noreferrer"&gt;/sub-processors&lt;/a&gt;; ≥30 days written notice before add/replace; objection path&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transfers&lt;/strong&gt; — core mail and application data stay in Germany / the EEA; no unauthorised transfers outside the EEA without prior written consent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Governing law&lt;/strong&gt; — Netherlands; Amsterdam courts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contacts&lt;/strong&gt; — &lt;a href="mailto:compliance@cortena.ai"&gt;compliance@cortena.ai&lt;/a&gt; · DPO Sharon Klaver (&lt;a href="mailto:dpo@cortena.ai"&gt;dpo@cortena.ai&lt;/a&gt;) · signed DPAs on request&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sub-processors vs your webhooks
&lt;/h2&gt;

&lt;p&gt;Core hosting is Hetzner Online GmbH (Germany). Where you enable DNSRBLs, Abusix may see &lt;strong&gt;connection metadata only&lt;/strong&gt; (sender IP/domain) — not mail content. Your configured webhook destinations are under &lt;em&gt;your&lt;/em&gt; control; they are not Cortena subprocessors. Pointing a webhook at a US SaaS is a hop you justify, not one we hide.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this cut of the story matters
&lt;/h2&gt;

&lt;p&gt;The canonical spine is unchanged: tired of EU data via US infra → Cortena baremetal K8s + short EU subprocessors → Postmark inbound compromise → finance-critical mail forced consolidation → no great EU inbound at sane price → ReceiveHQ (custom domains, multi-endpoint fan-out + filters, anti-spam, MCP agent inbox).&lt;/p&gt;

&lt;p&gt;Compliance pages are how that spine survives a vendor questionnaire. Hosting says where. The DPA says under what rules. Sub-processors say who else. The imprint says who signs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup sketch (for the security review, not just the MX)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;https://receivehq.com&lt;/a&gt; — magic-link sign-in
&lt;/li&gt;
&lt;li&gt;Domain + MX → &lt;code&gt;mx.receivehq.com&lt;/code&gt;, verify
&lt;/li&gt;
&lt;li&gt;Endpoints + filters / anti-spam as in prior posts
&lt;/li&gt;
&lt;li&gt;Send legal: &lt;a href="https://receivehq.com/hosting" rel="noopener noreferrer"&gt;hosting&lt;/a&gt; · &lt;a href="https://receivehq.com/dpa" rel="noopener noreferrer"&gt;DPA&lt;/a&gt; · &lt;a href="https://receivehq.com/sub-processors" rel="noopener noreferrer"&gt;sub-processors&lt;/a&gt; · &lt;a href="https://receivehq.com/imprint" rel="noopener noreferrer"&gt;imprint&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Signed DPA / AVV: &lt;a href="mailto:compliance@cortena.ai"&gt;compliance@cortena.ai&lt;/a&gt; · DPO: &lt;a href="mailto:dpo@cortena.ai"&gt;dpo@cortena.ai&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Series wrap
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Agent inbox (MCP / blackhole)
&lt;/li&gt;
&lt;li&gt;One domain → prod + staging webhooks
&lt;/li&gt;
&lt;li&gt;Recipient filters (&lt;code&gt;support@&lt;/code&gt; vs &lt;code&gt;invoices@&lt;/code&gt;)
&lt;/li&gt;
&lt;li&gt;Anti-spam before webhooks fire
&lt;/li&gt;
&lt;li&gt;Retries, resend, multi-endpoint
&lt;/li&gt;
&lt;li&gt;German baremetal — what stays in the EU
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;This post&lt;/strong&gt; — why the compliance pages matter
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Try: &lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;https://receivehq.com&lt;/a&gt; · €10/mo or €100/yr · 100k inbound · first 10 free&lt;/p&gt;

&lt;p&gt;Disclosure: I work on ReceiveHQ as CTO &amp;amp; Co-founder of Cortena B.V.&lt;/p&gt;

</description>
      <category>inboundemail</category>
      <category>eu</category>
      <category>devops</category>
      <category>saas</category>
    </item>
    <item>
      <title>German baremetal hosting: what stays in the EU</title>
      <dc:creator>ReceiveHQ</dc:creator>
      <pubDate>Wed, 16 Sep 2026 08:36:19 +0000</pubDate>
      <link>https://dev.to/receivehq/german-baremetal-hosting-what-stays-in-the-eu-6a5</link>
      <guid>https://dev.to/receivehq/german-baremetal-hosting-what-stays-in-the-eu-6a5</guid>
      <description>&lt;p&gt;I'm Sebastian, CTO at &lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;ReceiveHQ&lt;/a&gt; (Cortena B.V.). Use-case #6: after retries and resend, the quieter question — &lt;em&gt;where does the mail actually live?&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Topics 2–5 covered fan-out, recipient filters, anti-spam, and delivery survival. None of that helps if the payload still lands on US-region infrastructure by default. For German legal, tax, healthcare, and similar customers, residency is not a checkbox — it is the exam.&lt;/p&gt;

&lt;p&gt;We ran Cortena for years with Postmark inbound: great product, wrong continent. When outbound/dunning forced consolidation, we looked for an EU inbound relay at a sane price and found almost nothing. So we built ReceiveHQ on the same posture as the rest of Cortena: self-managed baremetal, short EU-heavy subprocessors, public trust pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  What stays in Germany / the EEA
&lt;/h2&gt;

&lt;p&gt;ReceiveHQ hosts inbound mail content and related application data in the EU — specifically Germany — so payloads, parse artifacts, and delivery logs stay under EU jurisdiction by default. No US region for core mail storage.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Declaration&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Operator&lt;/td&gt;
&lt;td&gt;Cortena B.V. (Netherlands)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Primary hosting country&lt;/td&gt;
&lt;td&gt;Germany&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure&lt;/td&gt;
&lt;td&gt;Hetzner Online GmbH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;Private Kubernetes on dedicated / bare-metal servers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Object storage&lt;/td&gt;
&lt;td&gt;Cortena-operated MinIO on the same German infra (14-day evidence window for raw &lt;code&gt;.eml&lt;/code&gt; / logs)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What lives there:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Captured inbound messages and MIME parse artifacts&lt;/li&gt;
&lt;li&gt;Delivery attempt logs and activity console records&lt;/li&gt;
&lt;li&gt;Tenant configuration and console account records&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Customer-configured webhook destinations are under &lt;em&gt;your&lt;/em&gt; control — they are not Cortena subprocessors. If you point a webhook at a US SaaS, that hop is yours to justify.&lt;/p&gt;

&lt;h2&gt;
  
  
  How access is controlled
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Encryption in transit (TLS) and at rest (encrypted volumes)&lt;/li&gt;
&lt;li&gt;Role-based access; production MFA&lt;/li&gt;
&lt;li&gt;SMTP ingest can be CIDR-restricted&lt;/li&gt;
&lt;li&gt;Webhooks support HTTPS and optional Basic auth&lt;/li&gt;
&lt;li&gt;Operational access is logged so it can be reviewed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Subprocessors (the short list)
&lt;/h2&gt;

&lt;p&gt;| Sub-processor | Country | Purpose |&lt;br&gt;
| --- | --- |&lt;br&gt;
| Hetzner Online GmbH | Germany | Core infra — servers, private K8s, DB, object storage, SMTP edge |&lt;br&gt;
| Abusix.com | US / Germany | &lt;strong&gt;Metadata only&lt;/strong&gt; — DNSRBL lookups for sender IP/domain when you enable blocklists; &lt;strong&gt;no mail content&lt;/strong&gt; |&lt;/p&gt;

&lt;p&gt;Live list: &lt;a href="https://receivehq.com/sub-processors" rel="noopener noreferrer"&gt;sub-processors&lt;/a&gt;. Hosting declaration: &lt;a href="https://receivehq.com/hosting" rel="noopener noreferrer"&gt;hosting&lt;/a&gt;. DPA: &lt;a href="https://receivehq.com/dpa" rel="noopener noreferrer"&gt;dpa&lt;/a&gt;. Imprint: &lt;a href="https://receivehq.com/imprint" rel="noopener noreferrer"&gt;imprint&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this cut of the story matters
&lt;/h2&gt;

&lt;p&gt;The canonical spine is unchanged: tired of shipping European data through American infrastructure → Cortena baremetal K8s + short EU subprocessors → Postmark inbound as a pragmatic compromise → finance-critical mail forced consolidation → no great EU inbound at sane price → ReceiveHQ.&lt;/p&gt;

&lt;p&gt;Hosting is not a marketing badge. It is the reason multi-endpoint fan-out, filters, anti-spam, and retries are useful for the customers we already serve: evidence you can open, residency you can point to, and a public page when procurement asks "where is the mail?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup sketch
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;https://receivehq.com&lt;/a&gt; — magic-link sign-in&lt;/li&gt;
&lt;li&gt;Domain + MX → &lt;code&gt;mx.receivehq.com&lt;/code&gt;, verify&lt;/li&gt;
&lt;li&gt;Endpoints + filters / anti-spam as in prior posts&lt;/li&gt;
&lt;li&gt;Read &lt;a href="https://receivehq.com/hosting" rel="noopener noreferrer"&gt;hosting&lt;/a&gt; and &lt;a href="https://receivehq.com/dpa" rel="noopener noreferrer"&gt;DPA&lt;/a&gt; before the security review&lt;/li&gt;
&lt;li&gt;For signed DPAs: &lt;a href="mailto:compliance@cortena.ai"&gt;compliance@cortena.ai&lt;/a&gt; · DPO: &lt;a href="mailto:dpo@cortena.ai"&gt;dpo@cortena.ai&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Next
&lt;/h2&gt;

&lt;p&gt;Why compliance pages matter (DPA, sub-processors, hosting, imprint).&lt;/p&gt;

&lt;p&gt;Try: &lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;https://receivehq.com&lt;/a&gt; · €10/mo or €100/yr · 100k inbound · first 10 free&lt;/p&gt;

&lt;p&gt;Disclosure: I work on ReceiveHQ as CTO &amp;amp; Co-founder of Cortena B.V.&lt;/p&gt;

</description>
      <category>email</category>
      <category>eu</category>
      <category>gdpr</category>
      <category>webhooks</category>
    </item>
    <item>
      <title>Retries, resend, and the same message to different endpoints</title>
      <dc:creator>ReceiveHQ</dc:creator>
      <pubDate>Tue, 15 Sep 2026 08:41:19 +0000</pubDate>
      <link>https://dev.to/receivehq/retries-resend-and-the-same-message-to-different-endpoints-1da9</link>
      <guid>https://dev.to/receivehq/retries-resend-and-the-same-message-to-different-endpoints-1da9</guid>
      <description>&lt;p&gt;I'm Sebastian, CTO at &lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;ReceiveHQ&lt;/a&gt; (Cortena B.V.). Use-case #5: after fan-out, recipient filters, and anti-spam, what happens when your webhook hiccups — or when you need that stored message somewhere else.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Topics 2–4 got one inbound domain onto several least-privilege webhooks, with junk stopped before HTTPS. That still leaves the operational reality: handlers go down, deploys wedge, and a single message sometimes needs to land on a second endpoint after the fact (new staging sink, rebuilt worker, audit copy).&lt;/p&gt;

&lt;p&gt;US-first inbound relays often bury retry policy in a black box, or leave you fishing for raw mail in a support ticket when you need a clean resend. We wanted delivery evidence you can open yourself — on German baremetal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Retry at the relay, not in every handler
&lt;/h2&gt;

&lt;p&gt;ReceiveHQ's spine stays the same: MIME parsed &lt;strong&gt;once&lt;/strong&gt; on German baremetal, then per-endpoint delivery. Retries are &lt;strong&gt;per endpoint&lt;/strong&gt;, so a flaky staging sink does not stall production:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Control&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Automatic backoff&lt;/td&gt;
&lt;td&gt;1m → 5m → 30m → 1h → 2h after non-success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-endpoint max attempts&lt;/td&gt;
&lt;td&gt;Cap how hard each webhook is pushed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP &lt;strong&gt;406&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Permanently drop that delivery (no more retries)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2xx&lt;/td&gt;
&lt;td&gt;Success — stop the schedule&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At-least-once delivery still means handlers should be idempotent. What you get back is request/response attempt logs plus the retained raw &lt;code&gt;.eml&lt;/code&gt; (14-day evidence window) — not a shrug and a ticket.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resend when you need a second shot
&lt;/h2&gt;

&lt;p&gt;From the activity console or MCP you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search messages and inspect each delivery attempt&lt;/li&gt;
&lt;li&gt;Open the raw &lt;code&gt;.eml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resend&lt;/strong&gt; with optional &lt;code&gt;To&lt;/code&gt; / &lt;code&gt;OriginalRecipient&lt;/code&gt; overrides&lt;/li&gt;
&lt;li&gt;Point a resend at a &lt;strong&gt;different&lt;/strong&gt; webhook endpoint when you need the same stored message on another sink&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That pairs with multi-endpoint fan-out: live traffic can already hit prod + staging; resend covers the "we added a sink later" and "replay after the outage" cases without a second MX or a mailbox dump.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this cut of the story matters
&lt;/h2&gt;

&lt;p&gt;We built ReceiveHQ after years on Postmark inbound — great product, wrong continent — and after deciding finance-critical mail shouldn't share infrastructure with the spammers next door. Retries and resend are part of that posture: residency in Germany, short EU-heavy subprocessor list, and delivery evidence you can show when a customer asks what happened to invoice mail at 02:17.&lt;/p&gt;

&lt;p&gt;Anti-spam decides &lt;em&gt;whether&lt;/em&gt; a message deserves a webhook. Retries and resend decide &lt;em&gt;how&lt;/em&gt; it survives your stack's bad day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup sketch
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;https://receivehq.com&lt;/a&gt; — magic-link sign-in
&lt;/li&gt;
&lt;li&gt;Domain + MX → &lt;code&gt;mx.receivehq.com&lt;/code&gt;, verify
&lt;/li&gt;
&lt;li&gt;Keep existing webhook endpoints (and filters / anti-spam from prior posts)
&lt;/li&gt;
&lt;li&gt;Confirm per-endpoint attempt limits fit your SLOs
&lt;/li&gt;
&lt;li&gt;On a failure: console or MCP → inspect attempts → resend (optionally to another endpoint)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Docs: &lt;a href="https://receivehq.com/mcp.md" rel="noopener noreferrer"&gt;https://receivehq.com/mcp.md&lt;/a&gt; · Trust: &lt;a href="https://receivehq.com/hosting" rel="noopener noreferrer"&gt;hosting&lt;/a&gt; · &lt;a href="https://receivehq.com/dpa" rel="noopener noreferrer"&gt;DPA&lt;/a&gt; · &lt;a href="https://receivehq.com/sub-processors" rel="noopener noreferrer"&gt;sub-processors&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Next
&lt;/h2&gt;

&lt;p&gt;European / German baremetal hosting details — what stays in the EU.&lt;/p&gt;

&lt;p&gt;Try: &lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;https://receivehq.com&lt;/a&gt; · €10/mo or €100/yr · 100k inbound · first 10 free&lt;/p&gt;

&lt;p&gt;Disclosure: I work on ReceiveHQ as CTO &amp;amp; Co-founder of Cortena B.V.&lt;/p&gt;

</description>
      <category>inboundemail</category>
      <category>webhooks</category>
      <category>retries</category>
      <category>gdpr</category>
    </item>
    <item>
      <title>Anti-spam before webhooks fire: EU DNSRBLs + scoring you control</title>
      <dc:creator>ReceiveHQ</dc:creator>
      <pubDate>Mon, 14 Sep 2026 08:39:51 +0000</pubDate>
      <link>https://dev.to/receivehq/anti-spam-before-webhooks-fire-eu-dnsrbls-scoring-you-control-5257</link>
      <guid>https://dev.to/receivehq/anti-spam-before-webhooks-fire-eu-dnsrbls-scoring-you-control-5257</guid>
      <description>&lt;p&gt;I'm Sebastian, CTO at &lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;ReceiveHQ&lt;/a&gt; (Cortena B.V.). Use-case #4: after fan-out and recipient filters, stop junk from ever hitting your HTTPS handlers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Topics 2–3 got one inbound domain onto several webhooks with least-privilege recipient filters. That still leaves a quieter failure mode: every accepted SMTP message that matches a filter becomes a webhook POST.&lt;/p&gt;

&lt;p&gt;Spam and phishing shouldn't burn your workers, fill ticket queues, or force every handler to re-implement reputation checks. US-first inbound relays often bury that policy in a black box — or push it onto your app after the POST already landed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Filter at SMTP and before forward — in the EU
&lt;/h2&gt;

&lt;p&gt;ReceiveHQ's spine stays the same: MIME parsed &lt;strong&gt;once&lt;/strong&gt; on German baremetal, then per-endpoint delivery. Anti-spam sits &lt;strong&gt;upstream&lt;/strong&gt; of that POST:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Optional DNSRBLs&lt;/td&gt;
&lt;td&gt;Reject / mark at SMTP time against EU-hosted blocklists&lt;/td&gt;
&lt;td&gt;Per domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule / heuristic scoring&lt;/td&gt;
&lt;td&gt;Score before forward so borderline mail can stay out of webhooks&lt;/td&gt;
&lt;td&gt;Per domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You decide&lt;/td&gt;
&lt;td&gt;Console or MCP — not a opaque vendor default you can't explain in a DPA review&lt;/td&gt;
&lt;td&gt;Your tenant&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Junk that never forwards never retries. Clean mail still lands in Postmark / Mailgun-SendGrid / CloudMailin (and other drop-in) shapes on the endpoints you already configured.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this cut of the story matters
&lt;/h2&gt;

&lt;p&gt;We built ReceiveHQ after years on Postmark inbound — great product, wrong continent — and after deciding finance-critical mail shouldn't share infrastructure with the spammers next door. Fine-grained anti-spam is part of that posture: residency in Germany, short EU-heavy subprocessor list, and controls you can point to when a customer asks what gets through.&lt;/p&gt;

&lt;p&gt;Recipient filters decide &lt;em&gt;which&lt;/em&gt; of your endpoints see an address. Anti-spam decides &lt;em&gt;whether&lt;/em&gt; a message deserves a webhook at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup sketch
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;https://receivehq.com&lt;/a&gt; — magic-link sign-in
&lt;/li&gt;
&lt;li&gt;Domain + MX → &lt;code&gt;mx.receivehq.com&lt;/code&gt;, verify
&lt;/li&gt;
&lt;li&gt;Configure domain anti-spam (DNSRBL + scoring) in console or via MCP
&lt;/li&gt;
&lt;li&gt;Keep existing webhook / blackhole endpoints and recipient filters
&lt;/li&gt;
&lt;li&gt;Send a known-good test; confirm deliveries with console or &lt;code&gt;list_deliveries&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Docs: &lt;a href="https://receivehq.com/mcp.md" rel="noopener noreferrer"&gt;https://receivehq.com/mcp.md&lt;/a&gt; · Trust: &lt;a href="https://receivehq.com/hosting" rel="noopener noreferrer"&gt;hosting&lt;/a&gt; · &lt;a href="https://receivehq.com/dpa" rel="noopener noreferrer"&gt;DPA&lt;/a&gt; · &lt;a href="https://receivehq.com/sub-processors" rel="noopener noreferrer"&gt;sub-processors&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Next
&lt;/h2&gt;

&lt;p&gt;Retries, resend, and sending the same stored message to different endpoints.&lt;/p&gt;

&lt;p&gt;Try: &lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;https://receivehq.com&lt;/a&gt; · €10/mo or €100/yr · 100k inbound · first 10 free&lt;/p&gt;

&lt;p&gt;Disclosure: I work on ReceiveHQ as CTO &amp;amp; Co-founder of Cortena B.V.&lt;/p&gt;

</description>
      <category>inboundemail</category>
      <category>webhooks</category>
      <category>antispam</category>
    </item>
    <item>
      <title>support@ vs invoices@: recipient filters per webhook endpoint</title>
      <dc:creator>ReceiveHQ</dc:creator>
      <pubDate>Sun, 13 Sep 2026 08:32:00 +0000</pubDate>
      <link>https://dev.to/receivehq/support-vs-invoices-recipient-filters-per-webhook-endpoint-57o1</link>
      <guid>https://dev.to/receivehq/support-vs-invoices-recipient-filters-per-webhook-endpoint-57o1</guid>
      <description>&lt;p&gt;I'm Sebastian, CTO at &lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;ReceiveHQ&lt;/a&gt; (Cortena B.V.). Use-case #3 in our series: after you fan out one inbound domain to several webhooks, stop every endpoint from eating every address.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Yesterday's cut was multi-endpoint fan-out — same MX, prod + staging (or support + billing) without a second domain. Useful, until &lt;code&gt;invoices@&lt;/code&gt; lands on your support ticket webhook and &lt;code&gt;support@&lt;/code&gt; hits the AR pipeline.&lt;/p&gt;

&lt;p&gt;Classic escapes: separate MX domains per mailbox, a shared "god" webhook that re-routes in app code, or copy-paste handlers with &lt;code&gt;if (to.includes("invoices"))&lt;/code&gt;. All work. All get messy under GDPR evidence, retries, and drop-in Postmark/Mailgun parsers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Filter at the endpoint, not in every handler
&lt;/h2&gt;

&lt;p&gt;ReceiveHQ still parses MIME &lt;strong&gt;once&lt;/strong&gt; in Germany. Delivery is &lt;strong&gt;per endpoint&lt;/strong&gt;. Each endpoint can carry a &lt;strong&gt;recipient filter&lt;/strong&gt; so only matching &lt;code&gt;To&lt;/code&gt; / &lt;code&gt;OriginalRecipient&lt;/code&gt; addresses forward:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Filter idea&lt;/th&gt;
&lt;th&gt;Destination&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Support&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;support@&lt;/code&gt;, &lt;code&gt;help@&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;ticketing webhook (Postmark shape)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invoices&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;invoices@&lt;/code&gt;, &lt;code&gt;billing@&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;AR / bookkeeping webhook&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Catch-all or blackhole&lt;/td&gt;
&lt;td&gt;unmatched / empty&lt;/td&gt;
&lt;td&gt;MCP audit, triage later&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same domain. Same MX (&lt;code&gt;mx.receivehq.com&lt;/code&gt;). Independent delivery logs and retries. Staging can keep a looser filter; prod invoices stay on the finance URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup sketch
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;https://receivehq.com&lt;/a&gt; — magic-link sign-in&lt;/li&gt;
&lt;li&gt;Domain + MX → &lt;code&gt;mx.receivehq.com&lt;/code&gt;, verify&lt;/li&gt;
&lt;li&gt;Add two (or more) &lt;code&gt;webhook&lt;/code&gt; endpoints — console or MCP &lt;code&gt;create_inbound_domain_endpoint&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Set recipient filters per endpoint (address / pattern for that route)&lt;/li&gt;
&lt;li&gt;Send tests to &lt;code&gt;support@&lt;/code&gt; and &lt;code&gt;invoices@&lt;/code&gt;; confirm with console or &lt;code&gt;list_deliveries&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Docs: &lt;a href="https://receivehq.com/mcp.md" rel="noopener noreferrer"&gt;https://receivehq.com/mcp.md&lt;/a&gt; · Webhook shapes: Postmark / Mailgun-SendGrid / CloudMailin&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this belongs next to fan-out
&lt;/h2&gt;

&lt;p&gt;Fan-out without filters is a firehose. Filters keep least-privilege delivery: finance mail never has to touch the support stack, and support never has to special-case invoice MIME. You still get 14-day &lt;code&gt;.eml&lt;/code&gt; retention, per-endpoint backoff (1m→5m→30m→1h→2h), and HTTP 406 drop — without rewriting every handler.&lt;/p&gt;

&lt;p&gt;Next: anti-spam / scoring &lt;strong&gt;before&lt;/strong&gt; webhooks fire.&lt;/p&gt;

&lt;p&gt;Try: &lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;https://receivehq.com&lt;/a&gt; · €10/mo or €100/yr · 100k inbound · first 10 free&lt;/p&gt;

&lt;p&gt;Trust: &lt;a href="https://receivehq.com/hosting" rel="noopener noreferrer"&gt;hosting&lt;/a&gt; · &lt;a href="https://receivehq.com/dpa" rel="noopener noreferrer"&gt;DPA&lt;/a&gt; · &lt;a href="https://receivehq.com/sub-processors" rel="noopener noreferrer"&gt;sub-processors&lt;/a&gt; · &lt;a href="https://receivehq.com/imprint" rel="noopener noreferrer"&gt;imprint&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Disclosure: I work on ReceiveHQ as CTO &amp;amp; Co-founder of Cortena B.V.&lt;/p&gt;

</description>
      <category>inboundemail</category>
      <category>webhooks</category>
      <category>saas</category>
      <category>devops</category>
    </item>
    <item>
      <title>One inbound domain, two webhooks: prod + staging without a second MX</title>
      <dc:creator>ReceiveHQ</dc:creator>
      <pubDate>Sat, 12 Sep 2026 08:28:20 +0000</pubDate>
      <link>https://dev.to/receivehq/one-inbound-domain-two-webhooks-prod-staging-without-a-second-mx-m5n</link>
      <guid>https://dev.to/receivehq/one-inbound-domain-two-webhooks-prod-staging-without-a-second-mx-m5n</guid>
      <description>&lt;p&gt;I'm Sebastian, CTO at &lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;ReceiveHQ&lt;/a&gt; (Cortena B.V.). Use-case #2: one inbound domain, multiple webhooks — prod + staging without a second MX.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;You want the same mailbox on &lt;code&gt;inbound.example.com&lt;/code&gt; in production &lt;em&gt;and&lt;/em&gt; staging. Classic options (second MX, re-POST proxy, duplicated DNS) are awkward for GDPR-sensitive or Postmark-shaped parsers.&lt;/p&gt;

&lt;h2&gt;
  
  
  One parse, many deliveries
&lt;/h2&gt;

&lt;p&gt;ReceiveHQ accepts SMTP, parses MIME once in Germany, then delivers &lt;strong&gt;per endpoint&lt;/strong&gt; on the same domain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;prod&lt;/strong&gt; → live HTTPS webhook (Postmark / Mailgun-SendGrid / CloudMailin shape)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;staging&lt;/strong&gt; → second HTTPS URL, independent retries/logs&lt;/li&gt;
&lt;li&gt;optional &lt;strong&gt;blackhole&lt;/strong&gt; → store-only for MCP/audit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same MX (&lt;code&gt;mx.receivehq.com&lt;/code&gt;). Same message. Separate attempt streams. Staging can 500 without poisoning prod.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;https://receivehq.com&lt;/a&gt; — magic-link sign-in&lt;/li&gt;
&lt;li&gt;Create domain, MX → &lt;code&gt;mx.receivehq.com&lt;/code&gt;, verify&lt;/li&gt;
&lt;li&gt;Add two &lt;code&gt;webhook&lt;/code&gt; endpoints (console or MCP &lt;code&gt;create_inbound_domain_endpoint&lt;/code&gt; twice)&lt;/li&gt;
&lt;li&gt;Send a test; confirm both deliveries via console or &lt;code&gt;list_deliveries&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Docs: &lt;a href="https://receivehq.com/mcp.md" rel="noopener noreferrer"&gt;https://receivehq.com/mcp.md&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this beats a re-post proxy
&lt;/h2&gt;

&lt;p&gt;Parse once (14-day &lt;code&gt;.eml&lt;/code&gt; retention). Independent backoff (1m→5m→30m→1h→2h) and HTTP 406 drop per endpoint. Drop-in payload shapes. EU residency on German Hetzner baremetal (Cortena B.V.).&lt;/p&gt;

&lt;p&gt;Next: recipient filters so staging does not eat &lt;code&gt;invoices@&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Try: &lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;https://receivehq.com&lt;/a&gt; · €10/mo or €100/yr · 100k inbound · first 10 free&lt;/p&gt;

&lt;p&gt;Trust: &lt;a href="https://receivehq.com/hosting" rel="noopener noreferrer"&gt;hosting&lt;/a&gt; · &lt;a href="https://receivehq.com/dpa" rel="noopener noreferrer"&gt;DPA&lt;/a&gt; · &lt;a href="https://receivehq.com/sub-processors" rel="noopener noreferrer"&gt;sub-processors&lt;/a&gt; · &lt;a href="https://receivehq.com/imprint" rel="noopener noreferrer"&gt;imprint&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Disclosure: I work on ReceiveHQ as CTO &amp;amp; Co-founder of Cortena B.V.&lt;/p&gt;

</description>
      <category>webhooks</category>
      <category>saas</category>
      <category>devops</category>
      <category>europe</category>
    </item>
    <item>
      <title>We were tired of shipping European data through American infrastructure — so we built ReceiveHQ</title>
      <dc:creator>ReceiveHQ</dc:creator>
      <pubDate>Fri, 11 Sep 2026 18:45:54 +0000</pubDate>
      <link>https://dev.to/receivehq/we-were-tired-of-shipping-european-data-through-american-infrastructure-so-we-built-receivehq-4kgh</link>
      <guid>https://dev.to/receivehq/we-were-tired-of-shipping-european-data-through-american-infrastructure-so-we-built-receivehq-4kgh</guid>
      <description>&lt;h1&gt;
  
  
  We were tired of shipping European data through American infrastructure — so we built ReceiveHQ
&lt;/h1&gt;

&lt;p&gt;At Cortena we run our own Kubernetes cluster on self-managed baremetal, treat infrastructure as code from day one, and keep a short, vetted subprocessor list — mostly European, with a couple of carefully scoped exceptions.&lt;/p&gt;

&lt;p&gt;That posture exists because our customers are German legal, tax, healthcare, and defensive practices. For them, data protection is not a checkbox. It is the exam.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Postmark compromise
&lt;/h2&gt;

&lt;p&gt;Early on we made one pragmatic compromise: Postmark for inbound email-to-webhook. Great product. Wrong continent. At the time there was no European inbound-only option with a sane business model. We used it for years. It worked.&lt;/p&gt;

&lt;p&gt;Then customers asked for outbound — dunning, accounts receivable, the unglamorous machinery that actually gets companies paid. That raised an uncomfortable question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do we want finance-critical email sharing infrastructure with the spammers next door?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. So we decided to consolidate email onto our own platform. While researching European inbound options we found… basically nothing great at a reasonable price. Again.&lt;/p&gt;

&lt;p&gt;We need this. So other teams probably do too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet ReceiveHQ
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;ReceiveHQ&lt;/a&gt; is a European inbound email-to-webhook service. Philosophy: simple for the simple things, flexible when you need it. A straight inbound-to-webhook pipeline with what we wished Postmark had while running our own product:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Custom inbound domains&lt;/strong&gt; — minutes, not an afternoon&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-endpoint fan-out&lt;/strong&gt; — same mail to multiple webhooks, with per-endpoint filters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fine-grained anti-spam&lt;/strong&gt; — you decide what gets through&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP access to email history&lt;/strong&gt; — give an AI agent a real email address&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop-in webhook shapes for Postmark, Mailgun/SendGrid, and CloudMailin are supported so you can keep an existing handler.&lt;/p&gt;

&lt;p&gt;Built on our own baremetal in Europe, with the compliance pages German customers expect: &lt;a href="https://receivehq.com/hosting" rel="noopener noreferrer"&gt;hosting&lt;/a&gt;, &lt;a href="https://receivehq.com/dpa" rel="noopener noreferrer"&gt;DPA&lt;/a&gt;, &lt;a href="https://receivehq.com/sub-processors" rel="noopener noreferrer"&gt;sub-processors&lt;/a&gt;, &lt;a href="https://receivehq.com/imprint" rel="noopener noreferrer"&gt;imprint&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;€10/month (or €100/year) for up to 100k inbound emails. First 10 free per tenant.&lt;/p&gt;

&lt;p&gt;If you have been shipping sensitive European email through US infrastructure because there was no alternative — &lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;there is now&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;—&lt;br&gt;
Sebastian Lagemann, CTO &amp;amp; Co-founder, Cortena B.V. (disclosure: I work on ReceiveHQ)&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webhooks</category>
      <category>security</category>
    </item>
    <item>
      <title>Let your agent receive email when it needs to</title>
      <dc:creator>ReceiveHQ</dc:creator>
      <pubDate>Fri, 11 Sep 2026 08:34:44 +0000</pubDate>
      <link>https://dev.to/receivehq/let-your-agent-receive-email-when-it-needs-to-1g7</link>
      <guid>https://dev.to/receivehq/let-your-agent-receive-email-when-it-needs-to-1g7</guid>
      <description>&lt;p&gt;I'm Sebastian, CTO at &lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;ReceiveHQ&lt;/a&gt; (Cortena B.V.). This is a concrete walkthrough of one feature we use ourselves: giving Cursor or Claude a real inbound mailbox over MCP, without waiting for a webhook handler to exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Agent workflows often need email mid-task: a vendor sends a confirmation, a support reply lands, a magic link arrives, or you want the agent to triage overnight mail. Most inbound products assume you already have a public HTTPS endpoint and a parser wired up. Agents don't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Blackhole first, webhook later
&lt;/h2&gt;

&lt;p&gt;ReceiveHQ endpoints come in two kinds:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kind&lt;/th&gt;
&lt;th&gt;URL&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Create an account at &lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;https://receivehq.com&lt;/a&gt; (magic-link sign-in).&lt;/li&gt;
&lt;li&gt;Add the MCP server to your client:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"receivehq"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://receivehq.com/api/mcp"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Start the client — OAuth 2.1 + PKCE opens a browser for login and consent.&lt;/li&gt;
&lt;li&gt;Revoke apps anytime under Settings → MCP in the console.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Endpoint docs live at &lt;a href="https://receivehq.com/mcp.md" rel="noopener noreferrer"&gt;https://receivehq.com/mcp.md&lt;/a&gt; (also &lt;code&gt;/llms.txt&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent quick start
&lt;/h2&gt;

&lt;p&gt;From Cursor, Claude, or another MCP client:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run &lt;code&gt;setup_inbound_domain&lt;/code&gt; with &lt;code&gt;endpointKind: "blackhole"&lt;/code&gt; (no &lt;code&gt;endpointUrl&lt;/code&gt;), or create the domain then &lt;code&gt;create_inbound_domain_endpoint&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Point MX to &lt;code&gt;mx.receivehq.com&lt;/code&gt;, then &lt;code&gt;verify_inbound_domain_mx&lt;/code&gt;.## What else the agent can do&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Tenants, domains, and endpoints (CRUD)&lt;/li&gt;
&lt;li&gt;Search messages, inspect delivery attempts, resend&lt;/li&gt;
&lt;li&gt;Invite teammates&lt;/li&gt;
&lt;li&gt;Billing: Checkout / Customer Portal URLs&lt;/li&gt;
&lt;li&gt;Fetch retained attempt and raw-mail objects by key (14-day evidence window)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scopes: &lt;code&gt;mcp:read&lt;/code&gt; for reads, &lt;code&gt;mcp:admin&lt;/code&gt; for mutations. Tokens are user-scoped across that user's tenants.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this beats "paste the email into chat"
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Real SMTP address on your domain (or a ReceiveHQ receive domain)&lt;/li&gt;
&lt;li&gt;MIME parsed once; raw &lt;code&gt;.eml&lt;/code&gt; retained for support and compliance&lt;/li&gt;
&lt;li&gt;Same account can later fan out to webhooks without re-ingesting history&lt;/li&gt;
&lt;li&gt;Hosted in Germany (Hetzner); DPA / sub-processors / hosting / imprint are public for GDPR buyers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Sign up: &lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;https://receivehq.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Connect MCP: &lt;code&gt;https://receivehq.com/api/mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create a blackhole endpoint and send yourself a test message&lt;/li&gt;
&lt;li&gt;Ask the agent to &lt;code&gt;list_messages&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pricing: €10/mo or €100/yr for up to 100k inbound emails; first 10 free per tenant.&lt;/p&gt;

&lt;p&gt;Trust links: &lt;a href="https://receivehq.com/hosting" rel="noopener noreferrer"&gt;hosting&lt;/a&gt; · &lt;a href="https://receivehq.com/dpa" rel="noopener noreferrer"&gt;DPA&lt;/a&gt; · &lt;a href="https://receivehq.com/sub-processors" rel="noopener noreferrer"&gt;sub-processors&lt;/a&gt; · &lt;a href="https://receivehq.com/imprint" rel="noopener noreferrer"&gt;imprint&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read mail with &lt;code&gt;list_messages&lt;/code&gt; / &lt;code&gt;get_message&lt;/code&gt; / &lt;code&gt;list_deliveries&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When you are ready for production delivery, create or update an endpoint as &lt;code&gt;webhook&lt;/code&gt; with your URL and &lt;code&gt;payloadFormat&lt;/code&gt; (&lt;code&gt;postmark&lt;/code&gt;, Mailgun/SendGrid, or CloudMailin). Same mailbox, no DNS redo.&lt;/p&gt;

&lt;p&gt;| &lt;code&gt;blackhole&lt;/code&gt; | omit / empty | Mail is received, parsed, and stored. Delivery status is &lt;code&gt;blackholed&lt;/code&gt;. No HTTP forward. Works on trial. |&lt;br&gt;
| &lt;code&gt;webhook&lt;/code&gt; | required HTTPS | Same parse, then POST in Postmark / Mailgun-SendGrid / CloudMailin shape |&lt;/p&gt;

&lt;p&gt;Blackhole is the agent-friendly path: capture mail now, decide routing later.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>agents</category>
      <category>email</category>
      <category>webhooks</category>
    </item>
    <item>
      <title>Launching ReceiveHQ: inbound email webhook, hosted in Germany</title>
      <dc:creator>ReceiveHQ</dc:creator>
      <pubDate>Thu, 10 Sep 2026 19:09:40 +0000</pubDate>
      <link>https://dev.to/receivehq/launching-receivehq-inbound-email-webhook-hosted-in-germany-2fb3</link>
      <guid>https://dev.to/receivehq/launching-receivehq-inbound-email-webhook-hosted-in-germany-2fb3</guid>
      <description>&lt;p&gt;We're launching &lt;strong&gt;ReceiveHQ&lt;/strong&gt; — inbound email infrastructure for teams that need SMTP in and HTTPS out, without rewriting webhook handlers or shipping mail through US-first relays.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;https://receivehq.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is
&lt;/h2&gt;

&lt;p&gt;ReceiveHQ receives mail on your domain, parses MIME, and delivers it to your app as webhooks in the same shapes used by Postmark, Mailgun/SendGrid, and CloudMailin. Point your MX records at ReceiveHQ and keep the parser you already trust.&lt;/p&gt;

&lt;p&gt;It is inbound-only, flat-priced, and hosted in Germany for GDPR-minded and EU-only stacks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we built it
&lt;/h2&gt;

&lt;p&gt;Moving off Postmark, Mailgun, SendGrid, or CloudMailin inbound often means two migrations: DNS and the webhook contract. ReceiveHQ makes the second one optional.&lt;/p&gt;

&lt;p&gt;For EU buyers, “maybe an EU region” on a US product is often not enough for invoices, payroll, or support mail. ReceiveHQ runs on German infrastructure by default — not as a checkbox.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features live today
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Drop-in inbound webhooks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Postmark-compatible JSON&lt;/strong&gt;: &lt;code&gt;From&lt;/code&gt;, &lt;code&gt;To&lt;/code&gt;, &lt;code&gt;OriginalRecipient&lt;/code&gt;, &lt;code&gt;TextBody&lt;/code&gt;, &lt;code&gt;HtmlBody&lt;/code&gt;, attachments, headers, raw email, and more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mailgun / SendGrid multipart&lt;/strong&gt;: &lt;code&gt;text&lt;/code&gt; / &lt;code&gt;html&lt;/code&gt;, &lt;code&gt;body-plain&lt;/code&gt; / &lt;code&gt;body-html&lt;/code&gt;, &lt;code&gt;envelope&lt;/code&gt;, attachment fields, and raw MIME&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CloudMailin-compatible JSON&lt;/strong&gt;: envelope, headers, plain text, HTML, and base64 attachm- Multi-tenant domains, address filters, and optional Basic auth on webhooks&lt;/li&gt;
&lt;li&gt;14-day retention of raw mail and attempt logs for support/compliance evidence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blackhole endpoints&lt;/strong&gt; to receive and store mail without forwarding, useful when an agent reads the inbox via MCP/API before a webhook URL exists&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Agent-native MCP
&lt;/h3&gt;

&lt;p&gt;Connect Cursor, Claude, or another MCP client over &lt;strong&gt;OAuth 2.1 + PKCE&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Endpoint: &lt;code&gt;https://receivehq.com/api/mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Configure domains, create blackhole or webhook endpoints, search messages, inspect deliveries, invite teammates, and manage billing from the agent&lt;/li&gt;
&lt;li&gt;Agent docs: &lt;a href="https://receivehq.com/llms.txt" rel="noopener noreferrer"&gt;&lt;code&gt;/llms.txt&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://receivehq.com/mcp.md" rel="noopener noreferrer"&gt;&lt;code&gt;/mcp.md&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  EU / GDPR posture
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Hosting declaration: &lt;a href="https://receivehq.com/hosting" rel="noopener noreferrer"&gt;Germany / Hetzner&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://receivehq.com/dpa" rel="noopener noreferrer"&gt;DPA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://receivehq.com/sub-processors" rel="noopener noreferrer"&gt;Sub-processors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://receivehq.com/imprint" rel="noopener noreferrer"&gt;Imprint&lt;/a&gt; (Cortena B.V., Netherlands)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;€10 / month&lt;/strong&gt; for up to &lt;strong&gt;100,000&lt;/strong&gt; inbound emails&lt;/li&gt;
&lt;li&gt;Or &lt;strong&gt;€100 / year&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;First &lt;strong&gt;10&lt;/strong&gt; emails free per tenant, with up to 3 trial tenants&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no outbound bundle required to unlock inbound.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Sign up at &lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;receivehq.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Add your receive domain and set MX&lt;/li&gt;
&lt;li&gt;Pick the Postmark, Mailgun/SendGrid, or CloudMailin payload format&lt;/li&gt;
&lt;li&gt;Or connect MCP and create a blackhole endpoint to start reading mail immediately&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Webhook API docs are on the site. Feedback is especially welcome from anyone who has migrated an established inbound integration: which provider-specific edge cases were hardest to preserve?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I work on ReceiveHQ as CTO &amp;amp; Co-founder of Cortena B.V.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;—&lt;/p&gt;

&lt;p&gt;Sebastian Lagemann&lt;/p&gt;

&lt;p&gt;&lt;a href="https://receivehq.com" rel="noopener noreferrer"&gt;https://receivehq.com&lt;/a&gt; · &lt;a href="mailto:listings@receivehq.com"&gt;listings@receivehq.com&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Who it is for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;EU / GDPR-sensitive products that already speak Postmark, Mailgun, SendGrid, or CloudMailin inbound&lt;/li&gt;
&lt;li&gt;Teams tired of SES + SNS + Lambda glue just to get email into an HTTP handler&lt;/li&gt;
&lt;li&gt;Agent workflows that need a real inbound mailbox readable and configurable over MCP
ents&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Production inbound
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;SMTP in → HTTPS out, with multi-endpoint fan-out&lt;/li&gt;
&lt;li&gt;Automatic retry backoff (1m → 5m → 30m → 1h → 2h), per-endpoint attempt limits, and HTTP 406 to permanently drop&lt;/li&gt;
&lt;li&gt;Activity console with message search, delivery attempts, request/response logs, raw &lt;code&gt;.eml&lt;/code&gt;, and resend with &lt;code&gt;To&lt;/code&gt; / &lt;code&gt;OriginalRecipient&lt;/code&gt; overrides&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
