Changelog

Rimani aggiornato con i nostri ultimi miglioramenti.

Warnings That Tell You Where To Read The Rule

v0.5.5

A warning that names a rule and stops there leaves you to guess the rule. This release is mostly about closing that gap, in the editor and in the emails themselves.

Variables in templates and campaigns:

  • A misspelled variable gets a suggestion. Write {{unsubscribe}} and the editor now points at {{unsubscribe_url}}. It also catches {{firstname}} for {{firstName}}, and stays quiet when nothing close exists, because a wrong suggestion is worse than none.
  • Every variable warning links the documentation. The four names a campaign fills in, and the reason a template cannot be checked the same way, are now written on one page and linked from the warning that mentions them.
  • The editor stops asking for values the system provides. email, firstName, lastName and unsubscribe_url are filled in on a test send, and a template using only those used to be reported as incomplete. It was the warning that was wrong, not the template.
  • A test send can no longer make the preview lie. The unsubscribe address is the one the server builds, and a field left blank is not sent as an empty value.
  • The warnings box folds to one line. It keeps the count, reopens with a click, and nothing is ever hidden: folding is not suppressing.

Emails:

  • A workspace can set light, dark or automatic. Until now the document background was never configurable, so the branded header and the footer stayed grey whatever the content did. The setting is on the workspace brand endpoint today, and a control in the dashboard is next.
  • Both footers follow that choice. They were built as HTML with the colours written by hand, outside the renderer, which is why no theme reached them.
  • The branded footer reads "Sent with Tratto". It used to be a logo, and on a dark background the image carried a black bar around it.
  • Icons for markdown templates, served from our own assets, each with a colour for light backgrounds and one for dark. The list is closed: names already published never change.

Campaign numbers:

  • A test send no longer counts as a delivery. A campaign could report more emails delivered than it had recipients, because test sends carried the campaign id and were counted with the real ones. Campaigns sent before this release still show the old totals until we recompute them.

Deliverability and accounts:

  • The suggested DMARC record uses your own domain. The address in rua= was ours, so the reports went to a mailbox you cannot read.
  • Password resets and workspace invitations arrive in the recipient's language.

Dashboard:

  • API key permissions have their own page. They used to open in a panel inside the table row, which left eighteen checkboxes in the space of one line. A revoked key now has a page too, read only.
  • The key list behaves like every other list. Column headers, and the whole row takes you to the key, as in contacts and flows.
  • One window component behind seven dialogs. Same behaviour everywhere: closing, focus, keyboard. The one that shows a new key still asks for a deliberate close, because it shows the key once and never again.

Pages That Admit When Something Broke

v0.5.4

A page that cannot load its data used to sit there showing a grey skeleton, or worse, state something it had never read. Now it says what happened.

Everywhere in the dashboard:

  • An error is shown as an error. When a request fails, the page says so instead of waiting forever on a placeholder. This covers contacts, emails, campaigns, templates, audiences, API keys, settings and the workspace panel.
  • Billing no longer guesses your plan. If the plan cannot be read, the page says so. Before, it fell back to Free and printed that, which was an answer nobody had asked for and nobody had checked.
  • Webhook deliveries tell "none yet" apart from "could not load". Those two look identical and mean opposite things.
  • The top bar survives a bad request. It reads the workspace name, and when that call failed it used to take the whole interface down with it.

Language:

  • The sign in, sign up and password pages follow your language. They were written in Italian only. Anyone using Tratto in English met them in a language they had not chosen, and it happened at the worst moment, while creating an account.
  • A beta invite written in English now lands on an English page. The invitation has carried the right language since 0.4.9, but the page it opened ignored it.

Workspace:

  • Deleting a workspace asks in a window, and the warning says what actually happens. It used to promise that all data would be permanently erased. That was not true: the workspace is marked as deleted and your session ends, and the data stays with us. Permanent deletion is being built, and until it exists the text will keep saying so.
  • A name with unusual characters no longer freezes the page. Workspace, audience and template names are shown as written, whatever they contain.

Privacy:

  • One time links no longer appear in our analytics or error reports. Invitation and password reset links carry a single use credential, and it stayed in the address those tools received. Now the value is removed before anything leaves the browser.

A Contact Tells You What Happened

v0.5.0

Opening a contact used to tell you their name and their tags. Now it tells you what happened with that person.

Contacts:

  • A history, not just a form. The contact page now shows when someone was added, when they unsubscribed, and when they opted out of tracking, in the order it happened. Those dates were always there. Nothing was showing them.
  • One identity, one status. The email address is the heading, once, because it is the one field every contact has. The subscription status sits next to the control that changes it, so there is no guessing which of the two is in charge.
  • The page stops asking you to retry what cannot work. When a recipient has opted out of tracking, or when a bounce has suppressed an address, those controls are now locked and say who made that choice. Before, changing them failed with a message inviting you to try again, which was never going to help.
  • No more dead ends on audiences. A contact who belongs to no audience now tells you why and where to go, instead of stating the fact and stopping there.
  • Long audience lists are complete. The audience picker was quietly showing only the first fifty.
  • Copy the address, not just the id. There is now a copy control on the email address, which is the thing you actually paste into a support thread or a search. The one on the contact id stays.

Dashboard:

  • You are told when a new version is out. Leave the dashboard open long enough and it will quietly say a newer version is available, with a control to load it. It never reloads on its own: a half-written campaign is not something to lose to a background refresh.

Workspace:

  • The Team page is only there for workspaces that can use it. During the private beta, inviting people is limited to one workspace, so everyone else was looking at a form that could only fail. It comes back when invitations open to everyone.
  • A teammate is no longer offered controls over their own membership. In a workspace with more than one person, a member could see a role selector and a remove button on their own row.

Sending Guarantees and Template Publishing

v0.4.8

Automated flows now send under the same rules as campaigns, and publishing a template finally means something.

Sending:

  • One-click unsubscribe on flow emails. Emails sent by a flow now carry the same unsubscribe header and footer link as campaigns. Before this release a contact who received a flow email had no way to opt out from the message itself.
  • Flows honour the tracking opt-out. A contact who opted out of tracking is no longer tracked by flow emails. Campaigns already respected the setting; flows wrote the email without it.
  • Reply-to on flow sending steps. A sending step can set its own reply address, so replies to an automated email reach the right mailbox.

Templates:

  • Publishing is now a gate. A draft template cannot be selected for a campaign or a flow step, and sending with one returns a clear error that names the template and tells you to publish it. Test sends still work on drafts, so you can check a template before publishing it.
  • Drafts are visible, not selectable. Template pickers group published templates and drafts separately, and mark Markdown templates, so you can see what exists without picking something that will not send.
  • Workspace logo inside the header. The brand logo is rendered inside the email header instead of above it, which is how every mail client expected it.

Security:

  • A domain belongs to one workspace. Verifying a domain that another workspace already owns is refused. Previously two workspaces could both claim the same sending domain.
  • Two style injection channels closed. Brand colours and template content could both carry CSS into the rendered email. Both are now sanitised before rendering.
  • Rate limits count rejected requests. Requests refused for a bad API key were not counted against the limit, so an attacker could try keys without ever being throttled. Every request now counts.
  • Public forms no longer reveal who is registered. The waitlist and founding forms return the same response whether or not the address is already known, and they cannot be called by bypassing the edge.
  • Dependency updates, including two critical framework advisories.

Dashboard:

  • Invite errors are readable. A refused invitation now explains why in your language instead of showing a raw error code, and the button stops retrying a request that cannot succeed.
  • The flow editor reports failures. Saving, activating or deactivating a flow now surfaces the error when it fails, instead of leaving the editor looking unchanged.

Documentation:

  • An independent fact check corrected several code samples on docs.tratto.email, including a webhook signature example that would have rejected every legitimate delivery.

Full reference for template publishing: Templates.

Markdown Templates & Workspace Brand

v0.4.0

The first release notes of the Tratto private beta.

Write your emails in Markdown. Templates and campaigns can now be written in Markdown and rendered into responsive, email-safe HTML, with your workspace brand applied.

New Features:

  • Markdown templates — write templates in Markdown with a live preview next to the source. The preview uses the same renderer as the save, so what you see is what gets sent.
  • Markdown in campaigns — edit a campaign's Markdown directly inside the campaign, without going back to the template first.
  • Template grid — browse your templates as a grid of previews, each one drawn from the template's actual HTML.
  • Brand panel — set your workspace logo and brand colours in Settings → Workspace. They are applied to your Markdown emails.
  • Assisted template generation — describe the email you need and get a Markdown draft in the editor, shown next to your text, never in place of it. 50 generations per workspace per month.
  • Content checks — the template and campaign editors warn about placeholder links, images without alt text and a missing brand header when your workspace has a logo. In campaigns they also flag unknown or misspelled variables and a missing unsubscribe link. Warnings never block saving or sending.

Improvements:

  • Variables in the subject line — {{variables}} in the subject are now substituted exactly like in the body. A variable with no value renders as empty text, never as a literal placeholder.
  • Free plan — now includes 2 verified custom domains (up from 1) and 3,000 emails per month.
  • Security — hardened the invite and password-reset emails.

New to Markdown templates? Read the Markdown templates guide.