Branding and the app's own email

How an app's email looks, how its sign-in and invitation mail is sent, and what happens when its mail server is unavailable.

Every email an app sends wears the app's branding: the messages your handlers send with sdk.sendEmail, and the messages the app sends its own users (sign-in links and codes, password resets, invitations). Nothing of Authoric's (name, mark, colors, "replies are not monitored") appears in an app's email.

Set the branding

Open the app and go to App settings › Branding. Every field is optional; whatever you leave blank falls back to neutral defaults, never to Authoric's.

SectionFields
BrandingDisplay name (the header, the footer, and the sender's display name), Logo, Logo for dark mode, Icon
ColorsPrimary (buttons and links), accent (a bar across the top of the message), background (the page behind it), each for light and dark mode. Button and header text are chosen for contrast, and a low-contrast choice is flagged.
FooterCompany, postal address, support email, website, social links
Email defaultsReply-to, and a footer note ("You receive this because you have an account with Acme.")

The Preview renders a sample message, in light and dark mode, as you edit. Send a test to sends it to an address you give, through the app's default email connection.

Images come from a public storage

An email loads its images from the internet, so a logo must be publicly readable. Pick an image from one of the app's public storages, or paste an https URL. A file in a private storage cannot be shown in an email; if you have no public storage, create one (a storage named Branding is a good habit) and upload the logo there.

The branding stores which file you picked, not a copy, so replacing that file updates every email sent after it.

The app's own email

When one of the app's users asks for a sign-in link, a sign-in code or a password reset, or is invited to one of the app's organizations, the app sends that email:

  • in the app's branding, with nothing of Authoric's look;
  • from the app's default email connection, when it has one that works, so it comes from your domain and is recorded in the app's email log. The link or code is logged as •••.

When the app has no sender of its own

A sign-in must never depend on a mail server being up. So if the app has no default connection, or its connection is untested, or its server refuses the message, the platform's own sender delivers it instead, still in the app's branding. Such a message comes from the platform's sending address rather than your domain, and is not in the app's email log.

That fallback is only for the app's own auth email. A handler's sdk.sendEmail never falls back: an app with no grant gets EMAIL_NOT_GRANTED, and a refused message gets EMAIL_SEND_FAILED.

Read the branding from a handler

sdk.app.branding() returns the branding with every image as a public URL, for a handler that renders something of its own in the app's look: a PDF invoice, an HTML page. Email sent with sdk.sendEmail already wears it. It needs sdk:app_read, which every author holds.

const brand = await sdk.app.branding();
// {
//   displayName, logoUrl, logoDarkUrl, iconUrl,
//   colors: { light: { primary, accent, background }, dark: { primary, accent, background } },
//   footer: { company, address, supportEmail, website, social: [{ label, url }] },
//   email: { replyTo, footerNote },
// }

Every field may be null.

Next

On this page