User guide
Email Management
Looking for what it does rather than how to use it? Read the Email Management overview .
Last verified against the codebase: 2026-07-28. See “How this document is verified” at the end.
What it is
Email Management covers everything Solidlio does with mail: the 50 templates it sends from, the brand and legal identity those templates wear, the consent and suppression records that decide who may be written to, the delivery results that come back, and the inbound paths that turn a customer’s email into a ticket or a supplier’s email into a vendor invoice.
It spans two services.
Concepts
| Concept | What it is |
|---|---|
| Template | A Handlebars subject + HTML body, keyed by name. 50 ship in code; an organization can override any of them by name. |
| Brand | The logo, colour and display name an email wears. Resolved through a platform → MSP → organization cascade. |
| Sender identity | The legal entity named in the CAN-SPAM/CASL footer: registered name, postal address, and one contact point. Never gated by plan. |
| Consent record | A CASL record that an address agreed to receive a category of mail, with the source, IP, user agent and proof link that were captured at the time. |
| Suppression | An address the platform will not deliver to. Carries a reason, and — for preferences — the organization it belongs to. |
| Email message | One row per email sent or received, with body, recipients, delivery status and attachments. What a ticket’s email thread is rendered from. |
| AP mailbox | A shared inbox polled for supplier invoices. One per organization. Unrelated to inbound ticket mail. |
| Domain gate | An outbound allowlist. In environments where it is on, mail to a non-allowed domain is redirected to a development mailbox instead of the recipient. |
Two different inboxes. “Inbound addresses” (Queues screen) create tickets. “AP mailboxes” (Email → Inbound Mailboxes) create supplier invoices. They share nothing but the word mailbox.
Roles and permissions
platform administrator > MSP administrator > MSP technician > organization administrator > power user > CUSTOMER`
| Action | Floor |
|---|---|
| Read the template catalogue | any authenticated user |
| Create / edit / delete / toggle a template | organization administrator |
| Preview or render a template | organization administrator |
| Read email messages, stats, threads | any authenticated user |
| Delete an email message | organization administrator |
| Read or write email settings for an org | organization administrator |
| Send a branded test for an org | organization administrator |
| Read consent records / suppression list | organization administrator |
| Record or revoke consent | organization administrator |
| Add to / remove from the suppression list | organization administrator |
| Lift a hard-bounce or spam-complaint block | platform administrator |
| Manage AP mailboxes (all operations) | organization administrator |
| Send an arbitrary email, ticket or invoice | MSP technician, or an internal service key |
| Send the platform diagnostic test | platform administrator |
| Unsubscribe from a link in an email | nobody — the signature token in the link is the authorization |
Every read and write is additionally constrained to the caller’s account. A customer-portal user is constrained to their single organization.
MSP technician ranks above organization administrator, so the MSP technician floor on the send routes admits MSP staff and platform admins only — deliberately, since those routes accept a caller-supplied recipient and would otherwise be a phishing primitive on the tenant’s verified sender identity.
Where each screen lives
| Screen | Path |
|---|---|
| Email delivery & compliance | Settings → Email & Compliance (/org/settings/email, /msp/settings/email) |
| Inbound AP mailboxes | /org/settings/email/mailboxes, /msp/settings/email/mailboxes |
| Templates | Settings → Templates (/org/settings/templates) |
| Sender identity | /org/settings/sender-identity, /msp/settings/sender-identity |
| Email-to-ticket addresses | Settings → Queues (/org/settings/queues, /msp/settings/queues) |
| Microsoft 365 mailboxes | /org/integrations/m365, /msp/integrations/m365/mailboxes |
| A ticket’s email thread | Tickets → (any ticket) → Email tab |
Walkthrough — an email becomes a ticket and gets answered
- Solidlio de-duplicates it on the
Message-IDheader, so a webhook retry or a double-forward does not create the ticket twice. - Routing rules decide the queue. Rules match on
sender,senderDomain,subjectorbodyusingEQUALS,CONTAINS,STARTS_WITH,ENDS_WITH,REGEX,IN_LISTorNOT_EQUALS. They are evaluated highest-priority first and the first match wins; if none match, the address’s default queue is used. An invalid regular expression is logged and does not match, so a broken rule cannot silently swallow mail. - A ticket is created with source
EMAIL, and the queue’s members are notified. If the sender is a known member of the organization they become the requester; otherwise the ticket is attributed to an existing member. - Open the ticket and go to the Email tab. The full conversation is there — inbound left, outbound right, with attachments.
- Press “Reply by email”. The reply goes out through a Microsoft 365 shared mailbox registered on the account. If none is connected, the tab says so and links to the screen that adds one rather than offering a Send that would fail.
- The customer replies. It threads back onto the same ticket by the
[TKT-…]token in the subject, or — if that has been lost — by theIn-Reply-Toheader, and lands as a new public comment. A ticket sitting inWAITING_CUSTOMERreopens toOPENautomatically.
Walkthrough — making your emails look and read as yours
- Go to Settings → Sender Identity and fill in your legal name, postal address, and at least one contact point (website, email or phone).
- Set your brand on the branding screen. Your logo and display name must be set on the same tier — a logo with no display name is dropped, because a logo cannot render beside another company’s name.
- Go to Settings → Email & Compliance → Delivery and send yourself a test. It renders with your brand, your footer and a working unsubscribe link — exactly what a recipient receives.
- If the logo is missing, check the compliance panel on the same screen. A tier with an incomplete sender identity is excluded from the brand cascade entirely: you may only wear a brand you can be legally identified behind.
One entity, throughout. The company in the From name, the subject and the header is the same company named in the footer. If your identity is incomplete, Solidlio’s own brand and footer are used rather than mixing the two.
Walkthrough — connecting a supplier-invoice mailbox
- Go to Settings → Email & Compliance, then Inbound Mailboxes, and press Connect a mailbox.
- Choose the provider. Microsoft 365 needs the directory (tenant) ID, application (client) ID and a client secret. IMAP needs host, port, username and password. Credentials are encrypted at rest with AES-256 and are never displayed again.
- Set the polling interval (1–1440 minutes; default 5) and the folders that processed and failed messages are moved to.
- Optionally restrict which sender domains are accepted, and which are blocked.
- Press Save, then Manage → Test connection. This performs a real provider handshake and ingests nothing.
- Press Poll now to run the pipeline once immediately. Otherwise the mailbox is polled automatically on its interval; the schedule is re-read once a minute, so a change takes effect without a restart.
One mailbox per organization. Deleting a mailbox disables it and keeps its history.
Templates
50 templates ship with the product — 8 ticket, 11 invoice, 13 authentication, 15 notification and 3 marketing. Every one of them has a category, and the category decides whether the compliance footer is attached: AUTH templates never carry an unsubscribe link, because a password reset must not be unsubscribable.
On Settings → Templates each row is marked Default or Customised.
- Default — the shipped version. Press Customise to create your own copy under the same name; from then on your version is used for that organization.
- Customised — your own version. Edit changes it; Revert to default deletes your copy and the shipped version takes over again.
The Insert variable buttons offer only variables the sending routes actually supply, grouped by source. A variable a template does not receive renders empty, so inventing one produces a hole in the message that nothing reports.
Preview renders the supplied subject and body with sample data, your brand and the compliance footer — the same pipeline a real send uses.
Templates can also carry SMS or PUSH as their channel. Filter with the channel tabs.
Consent, unsubscribe and suppression
Settings → Email & Compliance has a tab for each.
Consent (CASL)
Marketing mail needs a consent record. Transactional mail — tickets, invoices, authentication — does not. Implied consent expires two years after the business relationship began and is then suppressed automatically; express consent does not expire. The Consent tab warns when implied consents are within 30 days of expiry.
A withdrawn privacy consent (/user/privacy) also blocks marketing mail, even if a CASL record still exists. The subject’s most recent choice wins.
Unsubscribe
Every email that carries the compliance footer carries a one-click unsubscribe link. The link is signed for that recipient and that organization, so it cannot be used to unsubscribe anybody else, and it needs no login. Following it suppresses the address for the organization that sent the mail — not for every company using Solidlio.
Suppression
| Reason | Who it blocks | Can you lift it? |
|---|---|---|
UNSUBSCRIBED | the organization that sent | yes, from the Suppression tab |
MANUAL | the organization that added | yes |
CASL_EXPIRED | the organization | yes |
HARD_BOUNCE | everyone | no — contact Solidlio support |
SPAM_COMPLAINT | everyone | no — contact Solidlio support |
The last two describe the address, not your relationship with it: the mailbox does not exist, or the recipient reported the mail as abuse. Removing one is how a sending domain earns a reputation problem, so it is not offered.
Delivery tracking
processed sets the message to PENDING, delivered to DELIVERED, bounce to BOUNCED, dropped and spamreport to FAILED. A hard bounce adds the address to the suppression list globally; a spam complaint does the same and deactivates the address’s consent records.
The Delivery tab shows totals, the delivery and bounce rates, and the send queue’s depth. The Message log tab lists every message with its recipients, subject and status, searchable by subject, sender or body.
In production an unverifiable callback is rejected with 401, and a deployment with no verification key configured refuses the callback with 503 rather than accepting unauthenticated events.
The outbound domain gate
The redirected copy gets a subject prefix (default [DEV]) and a footer listing who it would have gone to. Recipients on allowed domains still receive their own clean copy.
The gate bounds where mail may go. It does not bound who may cause mail to be sent — that is what the role floors on the send routes are for.
Every setting
Organization email settings
| Setting | What it does | If unset |
|---|---|---|
fromName | Display name on outbound mail | the platform’s name |
fromEmail | Reply-to address | the platform’s no-reply |
physicalAddress | Postal address in the CAN-SPAM/CASL footer | the platform’s address |
caslCompliant | CASL enforcement mode | on |
defaultConsentType | EXPRESS, IMPLIED or TRANSACTIONAL | EXPRESS |
includeUnsubscribeLink | Whether the footer carries the link | on |
signature / signatureHtml | Stored signature text | none |
legalName, addressLine1, addressLine2, city, province, postalCode, country, website, email, phone | The organization’s own legal identity | the organization’s display name and no address — branding is then suppressed |
fromName and physicalAddress must be set together. Setting one without the other would print your street address under Solidlio’s name, or the reverse, in a field the law requires to be accurate — so the API refuses it.
AP mailbox settings
| Setting | What it does | Default |
|---|---|---|
emailAddress | The mailbox to poll | — |
mailboxType | MICROSOFT_365, GMAIL or IMAP | — |
pollingInterval | Minutes between polls, 1–1440 | 5 |
processedFolder | Where handled mail is moved | Processed |
errorFolder | Where failed mail is moved | Errors |
allowedSenderDomains | Only accept mail from these domains | any |
blockedSenderDomains | Never accept mail from these domains | none |
autoExtract | Run invoice extraction automatically | per schema |
requiresReview | Hold extracted invoices for review | per schema |
defaultVendorId | Vendor to attribute unmatched invoices to | none |
isEnabled | Whether the mailbox is polled | on |
Plan tiers
The emailIntegration entitlement is a ladder: false < BASIC < FULL. It gates the AP mailbox provider, not a count, because a mailbox is one per organization.
| Capability | Free | Starter / Essentials | Growth / Professional | Scale / Business | Enterprise |
|---|---|---|---|---|---|
| Send, templates, delivery tracking | ● | ● | ● | ● | ● |
| CASL consent + suppression management | ● | ● | ● | ● | ● |
| CAN-SPAM/CASL footer and unsubscribe | ● | ● | ● | ● | ● |
| Email-to-ticket inbound addresses | ● | ● | ● | ● | ● |
| Microsoft 365 AP mailbox | — | — | ● | ● | ● |
| Google Workspace / IMAP AP mailbox | — | — | — | ● | ● |
| Logo and display name on your emails | — | — | — | ● | ● |
| Brand colour on your emails | — | — | — | — | ● |
| No “powered by” attribution | — | — | — | — | ● |
The compliance footer is never gated. Every organization on every plan gets a legally-complete sender identification; the plan decides whose visual brand the email wears, not whether it can be identified.
The gate blocks new configuration only. If a plan is downgraded, an existing mailbox keeps working and its credentials remain editable; only changing it to a provider the new plan does not include is refused.
Troubleshooting
| What you see | What it means |
|---|---|
Email suppressed: User unsubscribed | The recipient unsubscribed from your organization. Visible on the Suppression tab; you can remove it. |
Email suppressed: Email address invalid | Hard bounce. The mailbox does not exist. Only Solidlio support can lift this. |
Email suppressed: Marked as spam | The recipient reported the mail as abuse. Only Solidlio support can lift this. |
No valid consent for this email category (CASL) | Marketing mail with no consent record for that address and category. |
Implied consent has expired (CASL) | Two years elapsed. The address was suppressed at the same moment. |
Marketing consent was withdrawn by the recipient (privacy consent revoked) | The subject revoked consent on the privacy screen. That decision outranks any older CASL record. |
This address is suppressed because it hard-bounced or reported a spam complaint. | You tried to remove an address-level block. Contact support. |
organizationId is outside your account | The organization named in the request belongs to another account. |
Insufficient role | The role floor above rejected the call. |
fromName is required when setting a custom physicalAddress | The sender identity is name + address together. Supply both or neither. |
Email we send on your behalf must name a legal entity, a postal address and one contact point. Missing: … | Your identity override is incomplete. The named fields are the ones to fill in. |
A template with name "…" already exists | You already have an override for that template. Edit it instead. |
System templates cannot be modified | You tried to edit a shipped template directly. Press Customise to make your own copy. |
Mailbox configuration already exists for this organization | One AP mailbox per organization. Edit the existing one. |
Microsoft 365 provider requires tenantId, clientId, and clientSecret | All three are needed before the mailbox can be saved. |
IMAP provider requires host, port, username, and password | Same, for IMAP. |
Email integration (inbound mailbox) isn't included in your current plan. | Your plan’s emailIntegration is false. The response carries an upgrade offer. |
Connecting a GMAIL mailbox isn't included in your current plan. | Google Workspace and IMAP need FULL; your plan is at BASIC. |
Mailbox configuration is not active | You pressed Poll now on a disabled mailbox. Enable it first. |
This unsubscribe link is invalid or has been tampered with. | The signature token does not match the address and organization in the link. |
| Your logo does not appear on emails, but does in the portal | Either your tier’s sender identity is incomplete, or the tier that supplies the logo supplies no display name. Both are logged by the service. |
| A customer’s reply opened a new ticket | The [TKT-…] subject token was lost and the reply carried no In-Reply-To header naming a message we sent. |
Limits and known behaviour
- One AP mailbox per organization. Enforced by a unique constraint.
- The From address is always the platform’s. Per-tenant sending domains require DNS authentication and are not implemented. Tenants supply the From name, the brand, the footer and the reply-to; the envelope sender stays on Solidlio’s verified domain.
- Suppression is keyed on the address alone. There is one row per address platform-wide. Its
organizationIddecides its reach for preference reasons, but two organizations cannot hold two different preference rows for the same address at once — the later write wins. - Google Workspace is not an inbound ticket provider. It appears on the Queues screen as a “coming soon” tile. Gmail is supported for AP mailboxes.
- Attachments on inbound ticket mail are parsed but not stored. AP mailbox attachments are stored.
- A shipped template you have not customised has no database row. It cannot be selected as a queue’s AI auto-reply template until you customise it.
- Open and click events are logged, not stored. They do not appear in the message log or the statistics.