# Send email from my domain

URL: /start/guides/send-email-from-my-domain · Id: `guide:send-email-from-my-domain`

> Say "send receipts from leaseline.app" and get SPF, DKIM and DMARC set and checked, so receipts and updates land in the inbox, not spam.

Send receipts and updates from your own [Domain](/business/nouns/domain), set up so they land in the inbox. Every bounce is tracked, and that address is never mailed again.

Needs: [Buy a domain](/products/site/domains/buy-a-domain)

**Before it runs**

- You leave the chat: Never: it all happens in the chat.
- First question at Live: “Receipts only, or outreach too?”
- What it costs: Nothing.
- To undo it: Remove the records; mail then sends from the platform address.

## What you get
- 3 SPF, DKIM and DMARC records, checked before the first send (DNSRecord)
- 2 streams, so receipts never share a reputation with outreach (Mailbox)
- 1 list of bounced and complaining addresses, never mailed again (Suppression)
- 1 reply address that lands in your support inbox (Mailbox)
- 1 delivery status on every Message (Message)

## Your agent does
**For agents**

- Guide: `guide:send-email-from-my-domain`, status `live`. Page: [/start/guides/send-email-from-my-domain.md](/start/guides/send-email-from-my-domain.md).
- Approval: none. Run it when the founder asks.
- Leaves the chat: never.
- Needs first: [Buy a domain](/products/site/domains/buy-a-domain).
- Run: call the steps in order, each through the API, SDK, CLI or MCP tab below; a later step passes the `$id` an earlier one returns. Each value marked example is the sample business’s: pass the founder’s own.

| Step | Verb | Inputs (type, required, this guide’s value) | Returns |
| --- | --- | --- | --- |
| 1 | [`Domain.authenticate`](/business/nouns/domain/authenticate) (`verb:Domain.authenticate`) | `domain` Domain (an id), required: example `"domain_leaseline_app"`; `dmarc` string: example `"quarantine"` | `domain` Domain |

Returns: the last call answers with `domain` and its `action`, whose `status` is `done`, `pending` (waiting on an Approval or a Worker), `failed`, `canceled` or `refused`:

```json
{
  "api": "https://api.sb/leaseline.app",
  "domain": {
    "$id": "https://api.sb/leaseline.app/domains/domain_leaseline_app",
    "$type": "Domain"
  },
  "action": {
    "$id": "https://api.sb/leaseline.app/actions/action_1",
    "operation": "Domain.authenticate",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/leaseline.app/actions/action_1"
  }
}
```

Next: offer “Send receipts from billing@leaseline.app”, or “Show me every bounce this week”.

Calls: `Domain.authenticate`

Ask:

```text
Send email from our domain.
Why did this email bounce?
Make our receipts land in the inbox.
```

API:

```bash
# Domain.authenticate
curl -X POST https://api.sb/leaseline.app/domains/domain_leaseline_app/authenticate \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"dmarc":"quarantine"}'
```

SDK:

```ts
import { $ } from 'startup-builder'

await $.Domain.authenticate({ domain: 'domain_leaseline_app', dmarc: 'quarantine' })
```

CLI:

```bash
npx startup-builder do Domain.authenticate --json '{"domain":"domain_leaseline_app","dmarc":"quarantine"}'
```

MCP:

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Domain.authenticate({ domain: 'domain_leaseline_app', dmarc: 'quarantine' })"
  }
}
```

The same sentence does more as the business grows:

| State | Calls | Asks first |
| --- | --- | --- |
| [Idea](/business/lifecycle/states/idea) | [`Domain.authenticate`](/business/nouns/domain/authenticate) |  |
| [Live](/business/lifecycle/states/live) | [`Domain.authenticate`](/business/nouns/domain/authenticate), [`Mailbox.warm`](/business/nouns/mailbox/warm) | Receipts only, or outreach too? |

## Change it
- Send receipts from billing@leaseline.app.
- Show me every bounce this week.
- Set DMARC to reject.

## Under the hood
- Systems: [Mailboxes](/systems/mailboxes), [Notices](/systems/notices)
- Nouns: [Domain](/business/nouns/domain), [DNS Record](/business/nouns/dns-record), [Mailbox](/business/nouns/mailbox), [Message](/business/nouns/message), [Suppression](/business/nouns/suppression)
- Events: [`Domain.authenticated`](/business/events/Domain.authenticated)

[`Domain.authenticate`](/business/nouns/domain/authenticate) writes the three records and checks them before the first send. Receipts and outreach send from separate streams, so a cold email never hurts a receipt.