Email Footer & Branding

When Tratto appends a footer to your emails (the "Sent using Tratto" badge, mandatory on some plans and opt-in on the others) and how to set your brand colours and logo through the API.

Tratto can append a small footer to the HTML version of the emails you send. There are two variants:

  • Branded footer — a "Sent using Tratto" badge, plus an unsubscribe link when the send is tied to a contact.
  • Plain unsubscribe footer — just the unsubscribe link, no badge.

Which one an email gets depends on your plan and on a single workspace setting.

Some plans require the branded footer — today that is only Free. On those plans, every HTML email carries the branded "Sent using Tratto" footer — campaigns, transactional sends, and template test sends alike. It cannot be turned off.

  • Campaigns and transactional emails linked to a contact: branded footer with an unsubscribe link.
  • Transactional emails not linked to a contact, and template test sends: branded footer without an unsubscribe link.

Other plans

On every other plan (today Starter, Growth and Scale) the badge is off by default:

  • Campaigns: a plain unsubscribe footer (marketing email must always offer an opt-out).
  • Transactional emails and test sends: no footer at all — your HTML is delivered as-is.

Keeping the badge (opt-in)

A workspace on a plan without a mandatory footer can choose to keep the branded footer with the keepTrattoBranding workspace setting. When it is on, every HTML send gets the branded footer, exactly as on a plan that requires it:

branded footer  =  the plan requires it     (today: Free — not configurable)
                or keepTrattoBranding is true

You can change the setting in two ways:

  • Dashboard — the branding toggle in Settings → Workspace.
  • API — PATCH /v1/workspace:
curl -X PATCH https://api.tratto.email/v1/workspace \
  -H "Authorization: Bearer tratto_live_..." \
  -H "Content-Type: application/json" \
  -d '{"keepTrattoBranding": true}'

The field is returned by GET /v1/workspace and documented in the API Reference.

Good to know:

  • keepTrattoBranding is accepted on any plan. On a plan that requires the footer it has no effect — the footer is there anyway.
  • The setting persists across plan changes: moving to a plan that requires the footer and back again does not reset your choice.
  • SDK support: the Node.js SDK (@tratto/email) accepts keepTrattoBranding in workspace.update() from 1.1.0 on. The Python SDK (tratto-email) has no dedicated parameter or type for it, but workspace.update() sends the dict you pass as the request body, so the camelCase field works: client.workspace.update({'keepTrattoBranding': True}).

Behavior at a glance

PlankeepTrattoBrandingCampaignTransactional linked to a contactTransactional / test send, no contact
Footer required (today Free)any value (ignored)Branded + unsubscribeBranded + unsubscribeBranded, no unsubscribe link
Other plans (today Starter, Growth, Scale)trueBranded + unsubscribeBranded + unsubscribeBranded, no unsubscribe link
Other plansfalse / not set (default)Plain unsubscribeNo footerNo footer

Independently of the footer, every campaign and flow email carries RFC 8058 one-click unsubscribe headers, and the footer link opens the recipient's preference page: see Privacy & Compliance.

The workspace brand (a theme, three colours and a logo) is applied when Markdown templates render; that page explains where each colour lands in the email. This section is the API for setting it. You can also set it in Settings → Workspace in the dashboard.

Every route below requires workspace:write. With a dashboard session, only the workspace owner can use them. GET /v1/workspace returns the current values in its brand object.

Theme and colours

Send a brand object to PATCH /v1/workspace:

curl -X PATCH https://api.tratto.email/v1/workspace \
  -H "Authorization: Bearer tratto_live_..." \
  -H "Content-Type: application/json" \
  -d '{"brand": {"theme": "light", "primaryColor": "#C8382A", "accentColor": null}}'
FieldValueUsed for
themelight, dark or autoThe default palette. auto follows the reader's light or dark setting. A template that sets its own theme still wins
primaryColor#RRGGBBLinks and the background of primary buttons
secondaryColor#RRGGBBBorder and label of secondary buttons
accentColor#RRGGBBDividers and horizontal rules

The update is partial: a key you leave out keeps its stored value, a key set to null is cleared. Colours must be six hex digits, such as #C8382A: a three-digit #C83 or a name like red answers 422 VALIDATION_ERROR.

The response is the whole workspace, with the updated brand. Its contrastWarnings array flags colours that may be hard to read (primary_low_contrast, secondary_low_contrast, button_label_low_contrast, each with its contrast ratio). They are advice only: the colour is saved and applied anyway.

The logo cannot be set here. logoUrl, logoWidth and logoHeight are owned by the server. If you send them inside brand they are silently dropped and the stored logo does not change. This is what stops anyone from pointing the emails Tratto sends at an image hosted somewhere else: the only way to set a logo is to upload the file.

PUT /v1/workspace/brand/logo takes the image file itself as the request body, not JSON and not a form:

curl -X PUT https://api.tratto.email/v1/workspace/brand/logo \
  -H "Authorization: Bearer tratto_live_..." \
  -H "Content-Type: image/png" \
  --data-binary @logo.png
RuleIf broken
Content-Type is image/png or image/jpeg415 UNSUPPORTED_MEDIA_TYPE, before the file is read. This is the answer for image/svg+xml, image/webp and image/gif
The file really is a PNG or a JPEG. The format is read from the file's bytes, not from the header422 VALIDATION_ERROR
At most 150 KB (153,600 bytes)413 PAYLOAD_TOO_LARGE
At most 600 px on the long side422 VALIDATION_ERROR
Still at least 8 px on both sides once fitted into the email422 VALIDATION_ERROR

SVG, WebP and GIF are refused because Gmail and Outlook strip them or render them badly. The email fits the logo inside a 160 × 64 px box, keeping its proportions and never enlarging it; a very elongated image can end up a sliver, which is the last rule above.

Response:

{
  "data": {
    "theme": null,
    "primaryColor": null,
    "secondaryColor": null,
    "accentColor": null,
    "logoUrl": "https://assets.tratto.email/l/<sha256>.png",
    "logoWidth": 320,
    "logoHeight": 128,
    "logoBytes": 24576,
    "logoDisplayWidth": 160,
    "logoDisplayHeight": 64,
    "logoWarnings": [],
    "contrastWarnings": []
  }
}

logoDisplayWidth and logoDisplayHeight are the size the logo is drawn at in the email. logoWarnings is advice, never a refusal:

CodeWhen
logo_low_resolutionThe image is narrower than twice its display width, so it looks soft on high-density screens
logo_too_smallIt is drawn less than 24 px tall
logo_heavyThe file is over 60 KB (61,440 bytes); every recipient downloads it on every open

Each warning carries actual and recommended: pixels for the two size codes, bytes for logo_heavy.

The stored file is named after its content and never changes. Uploading a new logo gives a new logoUrl, and the old one keeps working, so emails already delivered keep showing the logo they were sent with.

curl -X DELETE https://api.tratto.email/v1/workspace/brand/logo \
  -H "Authorization: Bearer tratto_live_..."

Returns 200 with the brand object, logo fields set to null. Emails sent from then on have no logo. The stored file is not deleted, because emails already delivered still point to it.

Next Steps


Edit this page on GitHub

Last updated on