Email for agencies and freelancers building for clients

Updated

Agency work is repeatable: the same email patterns, built again for each client. The thing to get right is separation, so that one client's keys, domain and reputation never touch another's.

One workspace per client

A workspace holds everything a sender needs: verified domains and senders, API keys, templates, contacts, webhooks, logs and the billing plan. Giving each client their own gives you:

  • Separate reputation. Each client authenticates their own domain, so one client's complaints do not follow another.
  • Separate keys. Revoke one client's key without touching the rest. Use a different key per environment as well.
  • Clean handover. When the engagement ends, the client takes the workspace, or you remove your team.
  • Separate billing. The plan and its limits are per workspace.

Roles for your team

| Role | Typical use | |---|---| | Owner | The client, or the agency principal | | Admin | Lead developer who manages keys and domains | | Manager | Account manager running campaigns | | Editor | Designer or copywriter editing templates and campaigns | | Viewer | Client stakeholder who only needs reports |

Add and change members from the workspace's team settings. Remove agency staff when they leave a project.

A repeatable setup checklist

  1. Create the client's workspace and add your team with the right roles.
  2. Verify the client's domain (or a sending subdomain) and publish SPF, DKIM and DMARC. Check each record with the free checkers.
  3. Register the sender addresses the application will use.
  4. Create a key with only the transactional:send scope, an expiry and an IP restriction, and hand it to the client's secret store.
  5. Build templates once and reuse the markup across clients by duplicating a template into each workspace.
  6. Register a webhook for bounced and complained so the client's app suppresses bad addresses.
  7. Document which emails exist, who triggers them and who owns them.

Reusing code between clients

Keep the sending code in a single small module and inject the key and sender from configuration, so the same code runs for every client:

import { Inboxili } from "@inboxili/node";

export function createClientMailer({ apiKey, fromEmail, fromName }) {
  const inboxili = new Inboxili({ apiKey });
  return {
    send: ({ to, subject, htmlBody, textBody, templateData }) =>
      inboxili.emails.send({ to, fromEmail, fromName, subject, htmlBody, textBody, templateData }),
  };
}

// Per client, loaded from that client's secrets, never shared between clients:
// const mailer = createClientMailer({ apiKey: secrets.apiKey, fromEmail: "hello@clientdomain.com", fromName: "Client Co" });

What Inboxili does not offer agencies yet

  • No white-label dashboard or custom branding for the client portal
  • No cross-client reporting
  • No per-client sub-accounts that bill through your account
  • No attachments, CC, BCC or reply-to on API sends

If those are requirements, plan around them: for example keep your own reporting by collecting webhook events per client.

Frequently asked questions

Is there a white-label or multi-client dashboard?
Not today. Inboxili is organised by workspace, and each workspace has its own domains, keys, contacts and plan. There is no agency console that sits above many clients.
Can my team access a client's workspace?
Yes. Add team members to the workspace and give them a role: owner, admin, manager, editor or viewer.

Set up a client workspace

Create a workspace, verify a domain, and make your first API call.

Related