Documentation

Last updated September 2, 2026

Everything you need to go from a new account to a delivered campaign. Most of this can also be done by asking the assistant, which is usually faster.

1Verify a sending domain

Nothing sends until you have a verified domain. Go to Domains, enter a domain you own, and add the records shown — three CNAMEs for DKIM, one TXT for SPF, one TXT for DMARC — at your DNS provider. Then press Check DNS.

Propagation is usually a few minutes and occasionally an hour. If a record does not appear, the most common cause is your provider appending the domain automatically: entering abc._domainkey.example.com becomes abc._domainkey.example.com.example.com. Enter only the part before your domain in that case.

We require DMARC as well as SPF and DKIM. Gmail and Yahoo have required all three from bulk senders since February 2024, and a domain missing DMARC will see mail go to spam regardless of what platform sends it.

2Add your sender details

In Settings → Sending, enter your business or personal name and a real postal address. US federal law requires a valid physical address in every commercial email, and we inject it into the footer of every message automatically. Sending is blocked until this exists.

3Create an audience

An audience is a list plus a record of how the people on it opted in. You choose the consent source when you create it and that choice is stored with the list.

To add contacts, paste a CSV with an email column, or just a list of addresses one per line. We deduplicate, drop invalid addresses, and skip anyone already on your suppression list.

4Send a campaign

Write the email in the composer or ask the assistant to draft it. Save it, and the draft page shows the preflight result: how many people it will reach, how many are excluded, and anything blocking the send.

Preflight blocks a send when:

  • The account has no postal address or business name on file.
  • The sending domain is unverified or missing DMARC.
  • The from address is not on the verified domain.
  • The audience has no consent record.
  • Every recipient is suppressed.
  • The send would exceed your daily or monthly quota.
  • Your complaint rate is at or above 0.3%, or your bounce rate at or above 5%.

There is no override. The same checks run whether the send comes from the dashboard, the assistant, or the API.

5What we add to every message

  • Your business name and postal address in the footer.
  • A visible unsubscribe link, on marketing mail.
  • List-Unsubscribe and List-Unsubscribe-Post headers implementing RFC 8058 one-click unsubscribe.
  • A plain text alternative, generated from your HTML if you did not supply one.

If you include {{unsubscribe_url}} anywhere in your HTML, we substitute the real link there instead of appending our own.

6Sending over the API

Create a key in Settings → API keys. It is shown once. Authenticate with a bearer token.

POST https://www.sendkernel.com/api/v1/emails
Authorization: Bearer cdt_your_key
Content-Type: application/json

{
  "from": "Acme <hello@yourdomain.com>",
  "to": ["customer@example.com"],
  "subject": "Your receipt",
  "html": "<p>Thanks for your order.</p>"
}

Returns 202 with the message id and counts. Errors return a JSON body with a code and a human-readable message — domain_not_found, send_blocked, or invalid_request with per-field details.

7Suppression

Anyone who unsubscribes, hard bounces, or reports your mail as spam is added to your account-level suppression list immediately and excluded from every future send. This cannot be undone from the dashboard, and that is deliberate: re-mailing someone who reported you is the fastest way to lose an account.

Unsubscribing removes the person across your whole workspace, not just the list that mailed them. Duplicate copies of the same address on other audiences are unsubscribed at the same time.

8What the assistant can and cannot do

It can read your workspace, create audiences, import contacts, register domains, check DNS, and draft or revise emails. It runs preflight and shows you a confirmation card, but the send itself requires your click.

It has no tools at all for billing, plans, payment methods, invoices, team membership, or API keys. Ask it about any of those and it will give you a button to the relevant page. See the privacy policy for what data reaches the model, and Settings for the switch that turns it off entirely.

9Self-hosting

The application needs Postgres, and optionally AWS SES credentials, an OpenRouter key, and Stripe keys. Without AWS it runs in dry-run mode: sends are recorded and rendered but nothing is dispatched, which makes the whole compliance path testable locally. Without OpenRouter the assistant is disabled and everything else works. Copy .env.example to .env.local, run npm run db:push, then npm run dev.