Changelog

Stay up to date with the latest features, improvements, and fixes.

Changes that could break an integration are announced here in advance. The exception is a security fix: we ship it as soon as it is ready and describe it here afterwards, marked security, with a severity.

RSS feed
security

Every attachment download is audit-logged, and log responses no longer carry attachment content

Each download of an attachment, through its download link or from the dashboard, is now recorded in the audit log with the time, IP address and user agent. Inline attachments can be downloaded from the delivery details. The logs API no longer returns attachment content.

Read more

What changed

  • Every attachment download is audit-logged. A fetch of a file's downloadUrl records the time, IP address and user agent. A download from the dashboard also records the account, and an EmailConnect admin when one was acting as it. The entries appear under Logs, Activity (Platform plan) and are kept for your audit retention period, 90 days by default. The filename is not recorded.
  • Inline attachments can be downloaded from the dashboard. The Files card in a message's delivery details now lists attachments that were delivered inside the payload, with a download button.
  • Files are saved, not opened. A download from the dashboard or through a downloadUrl now saves the file under its original name instead of opening it in the browser.
  • The logs API no longer returns attachment content. GET /api/v1/logs, GET /api/v1/emails/{id} and the dashboard's log list leave out each attachment's base64 content. Every other attachment field stays. Reading content there bypassed the audit log, and a single inline file could make a page of logs several megabytes. This took effect at once, without the usual notice period, because it closes an unaudited path to mail content.

A replay still sends the full payload, attachment content included. Stored files are fetched through their downloadUrl as before.

changed

Managed attachment storage moved to Paris

Attachments kept in our managed storage are now stored at Scaleway in Paris, France, in a data centre Scaleway owns itself, instead of Amsterdam. The Data Processing Agreement and the security page say so.

Read more

What changed

  • Managed attachment storage is in Paris. Files we store for you, the ones a webhook payload links to with a downloadUrl, now live at Scaleway in the fr-par region (Paris, France). They used to be in Amsterdam, the Netherlands. Scaleway owns the Paris data centre itself.
  • The Data Processing Agreement is updated. It now places managed attachment storage in France. The encrypted copy of our backups stays at Scaleway in Amsterdam, so the Scaleway sub-processor entry still reads "France and the Netherlands".

Nothing changes for you. Download links work as before, and files in your own S3 bucket stay where you put them.

changed

Webhook signing on every plan, Free included

Signing webhooks with the Standard Webhooks scheme was a Maker feature. It is now available on every plan, Free included, because an unsigned webhook URL lets anyone who has it post a forged email into your flow. A downgrade to Free also keeps your signing secrets, so a receiver that checks signatures keeps accepting deliveries.

Read more

What changed

  • Free accounts can sign webhooks. Set or generate a signing secret on a webhook in the dashboard, or pass generateSecret: true or webhookSecret through the API. Deliveries then carry the webhook-id, webhook-timestamp and webhook-signature headers. See webhook signing for verification code.
  • The n8n EmailConnect Trigger can verify signatures on Free. Turn on Verify Signatures in the trigger and activate the workflow.
  • A downgrade keeps signing secrets. Moving from a paid plan to Free used to clear them, which made a receiver that verifies signatures reject every delivery afterwards. Custom webhook headers are still removed on a downgrade.

Nothing changes for an existing webhook until you set a secret on it.

fixed

Ending an n8n test session no longer deletes aliases

When an n8n test session ends, the node calls POST /api/webhooks/alias/teardown. That call used to delete the aliases attached to the webhook, so a test session could remove a live production alias. It now deactivates them instead and keeps their settings and the webhook. The response's action is "deactivated", with deactivatedAliasIds listing the aliases this call switched off. While an alias is deactivated, its mail goes to the domain's catch-all if one is active, and is refused otherwise. Switch the alias back on in the dashboard, or let the integration register again, to bring it back. A webhook with no aliases is still deleted. Older n8n nodes keep working. In production since 14 October.

changedbreaking

Webhook payload changes on 9 November 2026

On Monday 9 November 2026 between 8:00 and 9:00 UTC the webhook JSON changes in three places. Attachment entries get one status and one reason instead of four overlapping fields. An image shown in the message body arrives once, as an attachment the HTML points to. spam.report is removed. Every payload in the new shape carries "schemaVersion": 2, so your code can handle both shapes and you can deploy before the date.

Read more

Who needs to act

Your endpoint needs a change if it reads any of these:

  • storage, uploadType, excluded or excludeReason on an attachment entry, or the status values rejected and unknown
  • base64 images inside message.content.html
  • spam.report

The change applies to every webhook at the same moment. There is no per-webhook switch.

Telling the two shapes apart

From 9 November every payload carries "schemaVersion": 2 at the top level. A payload without it is the old shape. Messages stored before the change are replayed and retried in the old shape, without that field. Check for the field and you can handle both shapes, so you can deploy your change before the date.

1. Attachments: one status, one reason

Each entry in message.attachments loses storage, uploadType, excluded and excludeReason. Three fields take their place: status (always present), reason (when a file was left out or failed) and inline (always present).

Before

{
  "filename": "report.pdf",
  "contentType": "application/pdf",
  "size": 482113,
  "status": "completed",
  "storage": "s3",
  "uploadType": "sync",
  "downloadUrl": "https://…"
}

After

{
  "filename": "report.pdf",
  "contentType": "application/pdf",
  "size": 482113,
  "contentId": null,
  "inline": false,
  "status": "completed",
  "downloadUrl": "https://…"
}

status is one of:

status Meaning
included The file is in this payload, base64 in content.
completed Stored. Fetch it from downloadUrl.
pending Upload still running. downloadUrl answers 202 until it is done.
excluded Left out by a rule or setting. reason says which.
failed We could not process it. reason says why.

The payload is a snapshot taken at delivery: an entry that was pending stays pending in a replay.

A file that was left out:

Before

{
  "filename": "scan.tiff",
  "status": "rejected",
  "excluded": true,
  "excludeReason": "File size 3.20MB exceeds your attachment limit of 1MB. Adjust in Settings → Storage."
}

After

{
  "filename": "scan.tiff",
  "contentId": null,
  "inline": false,
  "status": "excluded",
  "reason": "too-large",
  "reasonDetail": "3.20 MB, limit 1 MB"
}

reason comes from a fixed list, so you can branch on it. reasonDetail is a short text for people and may change; do not parse it.

reason With status
virus-detected excluded
too-large excluded
too-many-attachments excluded
file-type-not-allowed excluded
disabled-in-alias-settings excluded
storage-not-available excluded
content-unreadable failed
storage-unreachable failed
storage-rejected failed
internal failed

2. Images in the message body arrive once

Today an image pasted into a mail is written into message.content.html as base64 and also delivered as an attachment. From 9 November the HTML keeps the sender's cid: reference, and the image arrives once, as the attachment with the matching contentId and inline: true.

Before

{
  "content": {
    "html": "<p>See below</p><img src=\"data:image/png;base64,iVBORw0KGgo…\">"
  },
  "attachments": [
    { "filename": "image001.png", "status": "included", "storage": "inline", "content": "iVBORw0KGgo…" }
  ]
}

After

{
  "content": {
    "html": "<p>See below</p><img src=\"cid:image001.png@01DB2A\">"
  },
  "attachments": [
    { "filename": "image001.png", "contentId": "image001.png@01DB2A", "inline": true, "status": "included", "content": "iVBORw0KGgo…" }
  ]
}

inline is true when the HTML shows the file through a cid: reference, false for a file the sender attached. If you show message.content.html to people, replace each cid: reference with the attachment that has that contentId. With attachments switched off on an alias, images in the body no longer arrive at all.

3. spam.report is removed

The same information is in spam.symbols, already parsed. Free plans keep the { "available": false, "message": … } object in spam.

What does not change

Everything else: id, the webhook-id header, signatures, retries, message.sender, message.recipient, message.subject, message.content.text. We also add message.content.reply.markdown next to message.content.reply.text.

Payload templates and integrations

Custom payload templates keep working: no stored template names a removed field. A template that passes {{message.attachments}} or {{spam}} through whole delivers the new shape too.

Our n8n node needs no update for this change.

Questions about the change: write to support@emailconnect.eu.

securitymedium severitybreaking

API keys no longer reach dashboard-only actions

An API key, including a full-access key, could call a few endpoints the dashboard uses for account actions, among them creating and deleting API keys. A leaked key could therefore create a new key for itself, so revoking it did not stop the holder. These endpoints now answer 403 to every API key: account and sign-in settings, API key management, subscriptions, payments, payment methods and invoices. Use them from the dashboard while signed in. Everything in the API documentation keeps working. We made this change without advance notice because it is a security fix.

added

Domains warn when their MX does not point at us

Verification still checks the TXT record only, but it now also looks up the domain's MX records. If our mail server is not the domain's primary MX, the domain shows "MX elsewhere" or "No MX record", and mail for it will not reach us until the MX is fixed. When the lookup itself fails, it says the MX could not be checked. In the API, a domain now includes mxStatus (POINTS_HERE, ELSEWHERE, NONE or UNKNOWN), mxHosts and expectedMxHosts.

added

Stored attachments name your storage connection

GET /api/v1/attachments/{fileId}, GET /api/v1/emails/{messageId}/attachments and the attachments list of GET /api/v1/emails/{messageId} now include storageConnectionName - the name you gave the storage connection a file was stored through. It is null for files in EmailConnect storage, and when the connection no longer exists.

securitylow severitybreaking

Email status endpoint removed, status now needs an API key

GET /api/email/status/{messageId} answered without authentication. Anyone who knew the Message-ID of an email, which its sender always does, could read its delivery status and last delivery error. No email content was exposed. The endpoint is removed. Read the same fields from GET /api/v1/emails/{messageId} with an API key that has the logs:read scope. The old endpoint was not part of the documented API. We removed it without advance notice because it is a security fix.

changed

Account settings, and adding Google or GitHub yourself

Settings now has an Account tab with everything about signing in: email address, password, two-factor, emailed links, passkeys, sign-in methods and account deletion. Profile keeps your name, avatar and billing details. Signing in with Google or GitHub no longer attaches to an existing account with the same address; connect it under Settings, Account, Sign-in methods instead. Adding a sign-in method or a passkey needs a sign-in from the last hour.

added

See which stored attachments were downloaded

For attachments kept in storage, you can now see how often each download link was fetched and when last. In the dashboard, an email's details show its stored files. In the API, GET /api/v1/emails/{messageId} includes an attachments list, GET /api/v1/emails/{messageId}/attachments lists the files of one email, and GET /api/v1/attachments/{fileId} returns one file with its status, storage location and fetch count. A HEAD request does not count as a fetch. Attachments delivered inside the payload are not stored and do not appear.

securitylow severitybreaking

Attachment status no longer shows download statistics

GET /attachments/{fileId}/status answers without authentication, so anyone holding a download link could see how often it was fetched, when it was last fetched, when it was uploaded and why an upload failed. It now returns only the file's name, size, type, status and expiry time. The other fields moved to GET /api/v1/attachments/{fileId}, which needs an API key with the logs:read scope. We removed them without advance notice because it is a security fix.

securitylow severity

Rate limits on the API, sign-in and payments

API keys now have an hourly request limit per account: Free 100, Maker 1,000, Business 5,000, Platform 10,000. Every API response carries x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-reset; a request over the limit gets 429 with Retry-After. Sign-in requests are limited per IP address and password attempts per address, payment and subscription changes per account, and webhook tests per account. Nothing is banned: wait for the window to pass and try again. The limits are on the API and sign-in help pages.

added

API - look up one email, filter the log by time

GET /api/v1/emails/{messageId} returns the delivery state and stored payload of a single email. The log list accepts since and until, and status=REJECTED for mail blocked by a rule or spam score. Get, retry and delete all accept the msg_ id from the webhook-id header as well as the email's Message-ID.

changed

A verification record of its own for every domain

A new domain is now verified with a TXT record that carries a code unique to that domain in your account, shown in the dashboard and returned by the API as expectedTxtRecord. Domains you verified earlier keep their existing record, so there is nothing to change in DNS. A domain that stays unverified is now removed after 3 days instead of 7.

added

Send invoices to a second address

Billing & tax details has a new optional Invoice email field. Every invoice email is also sent there with the PDF attached - handy for a bookkeeper or a shared accounts mailbox. Your account email keeps receiving the invoices too.

changedbreaking

Retry answers 409 while a delivery is still running

A retry or replay sent while a delivery of the same email is still in progress now answers 409 Conflict with the message "A delivery of this message is already in progress". Before, it answered 400 with a text about the message status, which was the wrong reason. This affects POST /api/v1/logs/{messageId}/retry and the retry button in the log. Nothing else about retries changes - wait for the delivery to finish and send the retry again.

changed

A seventh delivery attempt, within a day

A failed webhook delivery is now tried up to 7 times instead of 6. The extra attempt comes about 7 hours after the sixth, which puts the last one roughly 22 hours after the email arrived - inside the 24-hour retention that Business and Platform start with, so an endpoint that is down for most of a day still gets its mail. Retries still stop when an email's retention ends - on Free and Maker, which keep email for one hour, that leaves up to 4 of the 7 attempts. Expired email is also removed sooner - the clean-up now runs every 5 minutes.

added

webhook-id on every delivery, and an id in the body

Every webhook delivery now carries the webhook-id header, signed or not, and the same value arrives as a top-level id in the JSON body. It is the same on every retry and replay, so it is the value to deduplicate on. Each attachment entry also keeps its contentId, null when the sender gave none. All additive - nothing existing changes.

fixed

More accurate delivery results

A redirect from your endpoint is now recorded as failed, not delivered — we don't follow redirects, so the email never reached your handler. The delivery log says whether a failure will be retried. Attachments beyond the 20-file cap appear as excluded entries with excludeReason too-many-attachments instead of going missing, and ordinary automated mail is no longer classified as a bounce.

added

Authorization in custom webhook headers

Custom webhook headers can now carry Authorization, for receivers that require a bearer token. All custom header values are encrypted at rest.

changed

Legacy signature headers removed

Signed deliveries no longer carry X-Webhook-Signature and X-Webhook-Timestamp. Only the Standard Webhooks headers — webhook-id, webhook-timestamp, webhook-signature — are sent. If your endpoint still verifies the legacy pair, switch it to the Standard Webhooks headers.

Read more

What changed

Two headers are gone from signed deliveries:

Header Before Now
X-Webhook-Signature sent alongside the new headers removed
X-Webhook-Timestamp sent alongside the new headers removed

webhook-id, webhook-timestamp and webhook-signature are unchanged.

Why

We adopted Standard Webhooks in March and sent both header sets during the transition. Keeping two signing schemes alive means two things to get wrong; one scheme, verified against the reference library, is the safer contract.

What you need to do

If you verify X-Webhook-Signature, that check now fails — the header is no longer there. Verify the Standard Webhooks headers instead, ideally with an off-the-shelf library.

Check that your secret starts with whsec_. Secrets issued before the migration are used as raw key bytes, which no Standard Webhooks library can verify. Regenerate the secret in the webhook settings to get a whsec_ one.

If you already verify webhook-signature, nothing changes for you.

See webhook signing for code samples.

changed

Downgrading keeps your configuration

Moving to a lower plan now switches paid features off instead of wiping them. Alias settings, rules and retention preferences stay stored, so upgrading again brings them back as you left them.

changed

The spam object reports a score, not a verdict

The webhook payload's spam object no longer carries isSpam, threshold, or action. Those three fields were always constants — isSpam was false on every email we ever delivered, including obvious spam — because we misread rspamd's header. We now report spam.score and let you judge it against your own cut-off, or express that cut-off declaratively with alias rules. If you branch on spam.isSpam, that branch has never once fired; update it to compare spam.score instead.

Read more

What changed

The spam object in the webhook payload has lost three fields:

Field Before Now
isSpam always false removed
threshold always 0 removed
action always "default" removed

spam.score, spam.symbols, spam.authentication, spam.report and spam.engine are unchanged and remain correct.

Why

We were misreading rspamd's X-Spamd-Result header. In that header, default is a hardcoded metric name rather than an action, the boolean means "did rspamd reject this at SMTP time" rather than "is this spam", and the second bracketed number is the reject threshold rather than a spam threshold.

Our mail server is configured never to reject at SMTP — we accept the mail and let the application decide. That is a deliberate choice, and it means the boolean could never be anything but false and the threshold could never be anything but 0. So all three fields were constants, on every email we have ever delivered, including mail scoring 19+ with multiple blocklist hits.

Rather than compute a verdict for you, we now report only what rspamd actually measured. A spam verdict is a policy decision that depends on your tolerance, not ours — and a boolean derived from a cut-off you chose tells you nothing that the score didn't already.

What you need to do

If you branch on spam.isSpam, that branch has never once fired. It has been a constant false for the life of the field, so any code behind it has never executed. Replace it with a comparison against spam.score using a cut-off that suits you:

// before — never true, on any email
if (payload.spam.isSpam) { … }

// after — you choose the line
if (payload.spam?.score > 8) { … }

If you'd rather not filter in your own code at all, express the cut-off declaratively with alias rules and EmailConnect will accept, block, or tag the mail before it ever reaches your endpoint.

Nothing that worked before stops working: alias rules read spam.score, which has always parsed correctly, so spam filtering is unaffected.

added

Route on +tags with recipient.tag

Plus-addressed mail now arrives with the tag pre-parsed. Send to inbox+support@yourdomain.com and the payload carries recipient.tag as "support", delivered to the webhook on your inbox@ alias. One alias, one endpoint, unlimited routing keys — no new aliases to create.

Read more

What changed

The webhook payload's recipient object has a new field: tag.

Anything after a + in the recipient's address is a tag. Mail addressed to inbox+support@yourdomain.com is delivered to the webhook configured for your inbox@yourdomain.com alias — the tag doesn't need an alias of its own — and arrives like this:

"recipient": {
  "name": null,
  "email": "inbox+support@yourdomain.com",
  "tag": "support"
}

recipient.email keeps the full address the sender actually used, tag included. The tag field is that same value, pre-parsed for you.

Why

Splitting one intake channel into several used to mean creating an alias per stream — support-billing@, support-sales@, support-shipping@ — each wired to its own webhook, or a catch-all plus your own string-splitting on the address.

Now a single inbox@ alias backs an unlimited number of routing keys, and your endpoint switches on recipient.tag instead. Nothing to register, nothing to configure: any tag a sender invents reaches your endpoint.

Details worth knowing

  • Untagged mail sets tag to null, never an empty string or a missing key. The field is always present, so you can rely on it.
  • Only the first + separates. inbox+a+b@yourdomain.com gives you the tag a+b.
  • A trailing + carries no tag. inbox+@yourdomain.com gives null — there's nothing after the delimiter.
  • Tags are free-form and unauthenticated. You don't register them anywhere, which is the point, but it means a sender can put anything there. Treat tag as untrusted input: match it against values you expect rather than acting on it blindly.

What you need to do

Nothing. tag is additive — existing payloads gain a field and no existing field changes meaning. Start reading message.recipient.tag whenever it's useful to you.

See the webhook payload reference for the full field list.

changed

Webhook replay on every plan

Replaying a delivered webhook from the logs used to need Maker or higher. It is now available on all plans, including Free, for as long as the email is within your retention window.

changed

Custom retention down to 10 minutes

The minimum for custom retention on Business+ drops from 1 hour to 10 minutes. (Corrected 13 October 2026 - this entry first said the clean-up ran every 10 minutes; it ran every 30 minutes until 12 October 2026 and runs every 5 minutes since.)

added

EU VAT handled at checkout

Enter a VAT number and we validate it against VIES. EU businesses outside the Netherlands get reverse charge and see net prices; everyone else sees the price they actually pay. Invoices carry the matching legal statement and your billing details.

added

Storage presets for EU providers

Connecting your own S3 storage is quicker. Pick Scaleway, Hetzner, Exoscale, OVHcloud, Wasabi, Backblaze or AWS and the endpoint is filled in for your region. The connection is tested before it is saved, so a typo no longer surfaces on the first attachment.

fixed

No more duplicate deliveries

An email that arrived twice in quick succession could be processed twice. A processing lock now makes sure each message reaches your webhook once.

changed

More reliable SPF results

Our mail servers now run their own DNS resolver instead of relying on public ones. That removes the occasional false "SPF fail" in spam.authentication, caused by public resolvers being rate-limited by blocklist providers.

changed

Redesigned logs view

The logs page has a new layout with a domain selector and a single refresh control. The delivery details now show the signals we detected on each email, plus a link to open the delivery in webhooktest.eu.

added

Auto-reload for credits

Business+ plans can top up credits automatically when the balance runs low. Set a monthly spending cap in the billing settings; you get a notification for every reload, and when one fails.

added

Standard Webhooks signing

Signed deliveries now follow the Standard Webhooks specification, with webhook-id, webhook-timestamp and webhook-signature headers. Verify them with any Standard Webhooks library instead of hand-rolled HMAC code. New secrets start with whsec_; the legacy X-Webhook-Signature headers are still sent alongside during the transition.

added

Help assistant in the dashboard

Press Cmd+K (or Ctrl+K) to ask a question from anywhere in the dashboard. Answers draw on the documentation and link straight to the right screen. Fully EU-hosted — Mistral running on Scaleway in France — and no conversation data is stored.

added

Delete emails on demand via the API

Business+ plans can delete a stored email the moment it has been processed. Call DELETE /api/v1/emails/{messageId} from your webhook handler and the retention window shrinks from hours to seconds, under your control.

added

Data Residency Mode for Platform

Platform plans can now switch on Data Residency Mode. Email is processed and delivered to your webhook, but the content is never persisted on our side — only routing metadata is kept. A DPA addendum covers the mode.

added

Virus scanning for Business+ plans

Attachments on Business+ plans are now scanned for viruses using ClamAV before delivery. Clean files include scan metadata in the payload. Infected files are rejected with threat details and excluded from the webhook. A top-level security summary is included in every payload.

added

Custom payload builder — now live for Business+

Choose exactly which fields your webhook receives, per alias. Strip what you don't need, keep what you do. Available now for Business+ users from the alias settings page.

added

Reply extraction

Incoming emails now include a separated reply body, stripping quoted text and signatures. No more parsing email threads yourself — we do the heavy lifting so your webhook gets just the new content.

added

Audit logging for Platform users

Platform plans now get a full audit trail — every alias change, webhook update, domain verification, and team action is logged with timestamps and actor details. Exportable for compliance.

added

Smarter payloads — classification, links, markdown, and integrity hashes

Every webhook payload now includes email classification and link extraction. Maker+ plans also get markdown conversion and SHA-256 integrity hashes. All enabled automatically — no configuration needed.

changed

Refreshed management UI for domains, aliases, and webhooks

The dashboard got a usability pass. Cleaner layouts, faster navigation between domains and aliases, and inline editing for webhook URLs. Managing 20+ aliases is now much less painful.

added

Mock options for webhook testing

When using webhooktest.eu as your endpoint, you can now configure mock responses — set status codes, delays, and response bodies to simulate real-world scenarios before going live.

added

Markdown content parsing for Maker+

Email bodies are now converted to clean Markdown server-side. Ideal for feeding into LLMs, generating ticket descriptions, or storing readable content without HTML. Included automatically in every Maker+ webhook payload.

added

HMAC webhook signing and refreshed API docs

Secure your webhooks with HMAC-SHA256 signatures to verify that requests are genuinely from EmailConnect. Available on Advanced and Enterprise plans. The interactive API documentation also received a visual refresh with improved branding.

changed

Improved processing reliability

Moved usage tracking to Redis to handle high-throughput scenarios without database contention. Inline attachments now correctly include their content in webhook payloads.

changed

Updated pricing to reflect new capabilities

Plans now better reflect what each tier includes. Free stays free with classification and link extraction. Maker adds markdown, integrity hashes, and spam filtering. Business adds custom payload builder, own S3, and retention controls.

changed

GDPR-compliant payment processing

Removed personally identifiable information from payment provider calls. Customer records now use anonymized metadata to comply with EU data protection requirements.

added

GDPR data export and phishing protection

Export your personal data directly from Settings for full GDPR compliance. Also added Rspamd phishing detection for stronger inbound email security.

added

Spam-based alias rules

Use spam scores in alias rules to automatically accept, block, or tag emails on a per-alias basis. Set your own thresholds to filter unwanted mail before it hits your webhook.

changed

Upgraded spam filtering engine

Switched from SpamAssassin to Rspamd for faster, more accurate spam detection. Webhooks now include a spam analysis with detailed authentication results.

changed

Email security hardening

Enhanced mail server security with TLS 1.2/1.3 enforcement, MTA-STS policy, Spamhaus blocklist integration, and stricter sender validation. Your emails are now better protected in transit.

added

Happy holidays from EmailConnect

Wishing you a peaceful festive season and a healthy, productive 2026. Thanks for building with us this year.

changed

Performance and reliability improvements

Under-the-hood optimizations for faster email processing and more reliable webhook delivery. Your emails now reach their destination even quicker.

added

Direct webhook.site integration

Test webhooks without leaving EmailConnect. View received payloads directly in your email logs with our new webhooktest.eu integration.

changed

Increased email volumes on all plans

Basic plan now includes 100 emails/month (up from 50). Advanced plan increased to 5,000 emails/month. More room to grow.

changed

Enhanced payload customization

New alias options give you more control over webhook payloads. Choose to receive HTML only, text only, or both. Strip what you don't need.

added

Advanced S3 configuration options

Configure your own S3-compatible storage with fine-grained file type controls. Allow only documents, block executables, or create custom filtering rules.

added

Alias rules for email filtering

New Advanced feature lets you allow or block emails based on sender address, sender domain, attachment status, or file types. Optionally notify blocked senders.

changed

Enhanced email size protection

Added proactive memory protection to prevent oversized emails from causing system issues, ensuring reliable processing for all email volumes

changed

Refreshed landing page design

Updated homepage with clearer value propositions, real-world use case examples, and improved visual hierarchy to help you understand EmailConnect faster

changed

Enhanced mobile experience

Redesigned mobile interface with improved responsive layouts, better touch targets, and optimized navigation for smaller screens

changed

Redesigned attachment processing

Completely rebuilt attachment handling system with improved reliability, better inline attachment support, and enhanced file type detection

added

Password recovery system

Implemented secure password reset functionality, allowing you to regain account access via email verification

changed

Modernized permission system

Refactored permission management to intuitive dot notation, making access control clearer and more maintainable

added

Enhanced usage tracking

Introduced comprehensive usage tracking with database persistence and Redis caching for real-time monitoring of your email processing

added

Privacy-first analytics integration

Integrated Plausible Analytics for privacy-respecting usage insights without tracking cookies or personal data collection

changed

Comprehensive documentation overhaul

Rebuilt help documentation with better organization, searchable content, and step-by-step guides for common integration scenarios

added

Dark mode theme support

Added seamless dark/light mode theme switcher with automatic system preference detection and smooth transitions between themes

changed

Faster page load performance

Implemented advanced component lazy loading with intersection observers, reducing initial page load times and improving overall site responsiveness

added

New public website launch

Launched redesigned public website built with Nuxt, featuring faster performance and split from actual application. Hosted on statichost.eu

added

Smarter Email Alias Management for n8n Workflows

Simplified domain alias creation in your n8n automation flows with intelligent update handling and streamlined webhook configuration

changed

Faster, More Reliable API Performance

Optimized backend infrastructure for improved response times and enhanced reliability when managing your domains, aliases, and webhooks

added

Extended Audit Logging and Admin Tools

Added comprehensive audit log dashboard, streamlined admin support tools, and enhanced security monitoring capabilities

added

Enhanced Security Measures

Implemented rate limiting, CSP headers, and integrated Snyk vulnerability scanning for improved platform security

fixed

Code quality and development improvements

Fixed all TypeScript compilation errors and simplified development setup. The platform now builds cleanly and the development environment is more streamlined, ensuring continued reliability and faster feature development.

fixed

Platform stability and permission fixes

Fixed various permission system inconsistencies and improved platform reliability. S3 storage permissions now properly validated, trial notifications work correctly, and the test suite is more robust for continued platform development.

added

Advanced plan trials and admin improvements

Users can now try Advanced features for 7 days! Added comprehensive trial system with admin controls, plus major admin dashboard improvements with cleaner tabbed interface and unified user management. Also added Gravatar support and fixed various attachment handling issues.

added

S3 attachment storage for Advanced users

Advanced users can now store email attachments in S3-compatible cloud storage with sync/async uploads and custom folder organization

changed

Advanced email processing architecture

Redesigned email routing with dual-path processing - basic flow for Basic users and advanced spam filtering + attachment handling for Advanced users

added

S3 attachment storage infrastructure

Built the foundation for cloud attachment storage (Advanced feature) with per file type customization and user-configurable storage rules

added

Plus aliasing

For those not wanting to use their own domain - try using a 'plus alias' under your unique system alias!

added

My son was born

Bear with me as I spend nights awake and days asleep!

changed

Changed server

Moved the infrastructure to a server with dedicated CPUs and increased memory for reliable, fast processing

added

Integration with webhooktest.eu

Simplify your testing with a direct integration into [webhooktest.eu](https://webhooktest.eu/?ref=ec)

changed

Many improvements

It's hard to keep up! Added custom data retention, custom headers, spam filtering, and more.

added

User settings for storage configuration

Added comprehensive user settings system for managing attachment processing and storage configuration

fixed

Domain verification improvements

Fixed domain verification process and improved error handling for DNS configuration

changed

Billing system enhancements

Updated billing interface with improved plan management and credit purchasing options