All changes Changelog

June 2026

Everything Lettr shipped in June 2026: 6 new features, 7 improvements and 15 bugfixes.

Pick a badge to see only the entries carrying it.

New features

PlatformTransactionalCampaigns UI/UX

Modes: Transactional And Marketing Are Separate Now

The sidebar opens with a mode switcher, and everything below it narrows to the one you picked.

Lettr does transactional email and marketing email, and until now both sets of navigation lived in one sidebar. Everyone saw twice the menu they needed and quietly filtered out the half that was not theirs. Nobody ever raised it as a problem, which is the difficult kind: a complaint you can act on, whereas people silently using less of your product is something you have to go looking for.

Shared links were the genuinely tricky part, because a campaign URL says nothing about which mode the person opening it was last in. Mode is inferred from the URL first and only then from what you last chose, so a pasted link lands correctly regardless, and the choice sticks between sessions afterwards. Switching mode switches context on the page you are standing on rather than throwing you to the start.

Analytics and Events now sit under Metrics together, an arrangement nothing was stopping us from choosing the first time. The layout was rebuilt against the designs while this was open, including a real mobile drawer — the previous mobile experience was the desktop sidebar, narrower.

Platform UI/UX

A Dashboard That Knows Which Mode You Are In

The dashboard stopped showing one set of numbers to everyone; the mode now decides which cards render and what they count.

In transactional mode the usage card meters emails against your email limit and the analytics table breaks down by tag. In marketing mode it meters contacts against your contact limit, the traffic chart becomes bars on each campaign's send date, delivery performance gains click and unsubscribe rates, and the table becomes one row per campaign.

Transactional figures are computed by subtracting campaign volume from the totals rather than by filtering on a campaign id, specifically so that sends carrying no tag still get counted. An explicit Untagged row surfaces those instead of letting them vanish into a rounding difference.

Reading the dashboard
Platform AI

Meet Adamko

An assistant in a drawer in the app that can read your account and act inside it, rather than a documentation search with a chat box on the front.

Asked which of your domains are ready to send, he lists them with the same readiness badge the Domains page shows. Asked why a sending domain is not verifying, he checks the live DNS himself and compares it against what the provider reports, then names the actual mistake — the record pasted at the wrong host, two SPF records, a CNAME flattened or proxied by Cloudflare, DMARC on the wrong host, a typo in the target. He is not permitted to call a record correct without a tool result in the same turn, and must quote every host and value verbatim rather than paraphrase one.

Where the right answer is a page in the app, he opens it instead of describing how to get there, and can run a pointer tour over the real interface — creating a domain or an API key, building a list or a segment, adding a webhook, or walking you to the event trail for a particular recipient.

Onboarding runs through him now. Ask him to set everything up, give him your website, and he reads it, shows you what he found, lets you choose which transactional emails you want, creates them, issues an API key and registers a sending domain — ending in a DNS walkthrough, since verification still waits on your registrar and on propagation. A guided setup that ends there is a fair improvement on what we had before, which was a checklist sitting next to a link to the docs.

Every tool he holds runs the same permission checks as the equivalent screen, so he cannot do through chat what your role forbids in the app. Every call is written to an audit log with its arguments redacted. An API key he creates travels only inside its own card and never through the model or the chat history. He is also banned from using emoji.

He is in beta and is being turned on team by team.

Meet Adamko
Platform UI/UX

A Notification Centre

A bell in the topbar collects the things that finish while you are somewhere else.

A campaign finishing its send arrives with its recipient count and a link to it; an export becoming ready arrives with a download link. Announcements from us land in the same place rather than in your inbox.

Notifications
Campaigns UI/UX

Marketing Emails As A Card Grid

Marketing emails render as folders and thumbnails, with a toggle back to the table if you prefer it.

Folders became mode-aware with it, and the columns that only mean something for transactional email — slug, sent, opened, open rate — are hidden on the marketing side. The transactional list is unchanged.

Transactional UI/UX

A Redesigned Transactional Email Page

Settings on the left, a preview canvas on the right with desktop and mobile tabs and a language selector.

Name and subject save as you type. Version status moved into the header bar and turns green when a version is live, and version history opens as a drawer over the page rather than taking you somewhere else.

Improvements

AudienceCampaigns

Audience And Campaigns Are On For Every Team

The marketing half of the product is no longer enabled team by team — it is simply there.

TransactionalCampaigns UI/UX

Copy An Email Between Transactional And Marketing

A row action copies an email across to the other side, so a design built for one half of the product does not have to be rebuilt for the other.

TransactionalCampaigns UI/UX

The Editor Warns You Before Your Session Costs You Work

The email editor now notices an expired session and offers to sign you back in, rather than letting you find out when a save fails.

Sessions also last three days instead of two hours, so being signed out mid-edit is far less likely in the first place. The editor picked up Lettr's own palette in the same pass.

Campaigns UI/UX

The Campaign Stepper Tells The Truth About Completeness

A step you have passed but left with unresolved issues now shows a warning rather than a green tick.

Platform API

Every API Response Carries A Correlation Id

X-Correlation-Id comes back on every response, and requests that end in an unhandled error are logged rather than vanishing.

The API log view gained account and correlation filters, so a failing request can be traced from your side to ours with one identifier.

Logs
Platform DeliverabilitySecurity

New Sending Domains Are Screened For Impersonation

A domain registered to imitate a well-known brand — a swapped digit, a lookalike spelling — is caught when it is added.

A high-confidence lookalike is created blocked, with a banner saying so; a borderline one goes to review. The check fails open, so an error on our side never stops a legitimate domain being created.

Platform Deliverability

Clearer Answers When A Domain Cannot Be Added

A domain already registered with our email provider by an account outside Lettr now says so, and tells you to contact support, instead of failing generically.

Cancelling out of the one-click Cloudflare setup also stops looking like success — each domain page now shows that you cancelled rather than quietly celebrating.

Domain Connect

Bugfixes

  • Platform Security

    Fixed a team being able to send from another team's verified sending domain. The domain was resolved through an index with no tenant scope, so isolation had been resting on the provider's own accounts alone. The domain is now checked against the calling team, and refused with the same message as an unknown domain so a probe cannot tell the two apart.

  • Campaigns Security

    Fixed the campaign preview endpoint returning any team's campaign HTML to any authenticated caller — it was reachable with no authorisation check at all. It now authorises against the campaign's own team.

  • Platform Security

    Fixed a request logger that had been registered across the whole application rather than on the surface it was written for, so it captured far more than it should have. It is now scoped correctly, redacts authorization, cookie and API-key headers, and no longer records request bodies. The API request log was cut back to an allowlist at the same time, so recipient addresses, content, attachments, substitution data, metadata and headers never reach it.

  • TransactionalCampaigns Security

    Fixed any signed-in user being able to create, edit or delete the curated premade blocks that are served into every team's editor. Those actions now require an administrator.

  • Platform Billing

    Fixed concurrent sends overshooting a plan's daily and monthly limits. The quota was read, then the send went out, then the counter moved — so several requests arriving together all read the same number and all went. Quota is now reserved before the send and reconciled afterwards. It errs toward an occasional over-reject rather than an over-send, and still lets sends through if the counter store is unreachable.

  • Platform UI/UX

    Fixed our own password-reset, email-verification and team-invitation links arriving broken. Click tracking rewrites every URL in a message, which mangled the signature on a signed link. Those links are now assembled inside the template so only the static part is ever wrapped, and where a signed URL cannot be split — export and archive downloads — click tracking is turned off for that send instead.

  • Platform UI/UX

    Fixed a password reset failing when the address in the link arrived percent-encoded, so it never matched the token. The same change makes a failed sign-in actually show its error, and carries the address you typed across to the reset form.

  • Transactional API

    Fixed a valid email being rejected before it ever reached us when its HTML contained a URL with an IP address in it — a link to http://192.168.1.50/status in a monitoring alert, for instance. A protective rule was reading that as an attempt to make the server fetch something. Sending is exempt from that rule now; the paths that genuinely do fetch HTML keep it.

  • Transactional WebhooksPerformance

    Fixed bursts of delivery events being rate-limited at the edge and answered with 429s. The provider's server-to-server callbacks arrive from a small shared pool of addresses and were being counted against a per-address limit meant for browsers.

  • Transactional UI/UX

    Fixed the Events and message-detail pages failing outright on events that arrive without a transmission id or without recipient fields, which were treated as always present.

  • Platform Deliverability

    Fixed a Cloudflare-proxied tracking domain being treated as verified. A hostname behind the proxy answers with an address record rather than the CNAME that is actually required, and the check accepted it. It is now its own state, with an instruction to set the record to DNS-only, and no longer earns a verification grace period.

  • Platform Docs

    Fixed the four short dashboard URLs our documentation links to — /domains, /logs, /templates and /suppressions — returning 404. They now redirect to the real pages, and do so from outside the sign-in gate, so a signed-out visitor lands on the login screen rather than a dead page.

  • Audience UI/UX

    Fixed being unable to create a list from inside the CSV import flow.

  • Transactional UI/UX

    Fixed the emails list being unable to scroll, clipped by its container, and the sidebar showing a scrollbar it did not need.

  • Platform UI/UX

    Fixed successful statuses in the API log and webhook lists rendering in the wrong colour, and a sidebar section highlighting alongside the more specific page inside it.