Skip to content

Quickstart

Get a welcome campaign live for new signups, in the app or with the API. Each step takes a few minutes. DNS checks can take longer. If you use an agent, start with the MCP setup instead.

View as Markdown

1. Sign in and create a project

Sign in with Google or an email link. Create a project for your product and give it a name, a time zone and your postal address. Marketing email can’t go out without the address, because the law asks for it in every footer.

2. Connect your email provider

Open Settings → Senders and pick your provider: Resend, Amazon SES, Postmark, SendGrid, Mailgun, any SMTP server, or Gmail (beta). Paste its credentials and set the From name and address your contacts will see. Sendocado tests the connection before it saves it.

3. Verify your sending domain

Open Settings → Domains and add the domain of your From address. Sendocado shows the DNS records your provider needs (DKIM, SPF, MAIL FROM and DMARC). Add them at your DNS host. Sendocado checks them every 10 minutes, or press Check now.

4. Add contacts

Import a CSV in Contacts, or send contacts from your app with the API, up to 1,000 at a time. Tag new signups (for example trial) so a campaign can find them.

5. Write the campaign and go live

In Campaigns, create a campaign. Set the audience (for example “tag has trial” and “added less than 14 days ago”), write the emails and the days between them, send yourself a test, and set it live. Contacts who match join on their own.

The same with the API

Create a key in Settings → API keys. Keys start with sc_ and are shown once. Send it as a Bearer token. Every request body sends every field; use null for a value you don’t set.

Find your project id

List projects
curl "https://sendocado.com/api/v1/projects" \
  -H "Authorization: Bearer $SENDOCADO_API_KEY"

Add a contact when someone signs up

Create a contact
curl -X POST "https://sendocado.com/api/v1/projects/$PROJECT_ID/contacts" \
  -H "Authorization: Bearer $SENDOCADO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "email": "maya@example.com",
  "first_name": "Maya",
  "last_name": "Patel",
  "timezone": "Europe/London",
  "tags": ["trial"],
  "attributes": {
    "plan": "trial",
    "company": "Northwind"
  }
}'

Create a campaign

Content can be html or markdown; send one and set the other to null. The campaign starts as a draft.

Create a campaign
curl -X POST "https://sendocado.com/api/v1/projects/$PROJECT_ID/campaigns" \
  -H "Authorization: Bearer $SENDOCADO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Trial welcome",
  "timezone": "America/New_York",
  "send_window": {
    "days": [1, 2, 3, 4, 5],
    "start_hour": 9,
    "end_hour": 17
  },
  "is_stopped_on_reply": true,
  "filter_groups": [
    {
      "filters": [
        {
          "type": "tag",
          "op": "has",
          "tag": "trial"
        },
        {
          "type": "added_days_ago",
          "op": "less_than",
          "days": 14
        }
      ]
    }
  ],
  "steps": [
    {
      "delay_days": 0,
      "subject": "Welcome to Acme, {{ first_name | there }}",
      "preview_text": "The one thing to do first.",
      "html": null,
      "markdown": "Hi {{ first_name | there }},\n\nThanks for trying Acme. Start with the [two-minute setup](https://acme.example/setup).",
      "template_id": null
    },
    {
      "delay_days": 3,
      "subject": "Still there, {{ first_name | there }}?",
      "preview_text": "Most people get stuck on the same step.",
      "html": null,
      "markdown": "Most people get stuck on the same step. Here is the shortcut.",
      "template_id": null
    }
  ]
}'

Set it live

A status change is an update to the campaign. Send every field, with status set to live. If something is missing, such as a verified sender, the answer is a 422 that says what to fix.

Set the campaign live
curl -X PUT "https://sendocado.com/api/v1/campaigns/$CAMPAIGN_ID" \
  -H "Authorization: Bearer $SENDOCADO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Trial welcome",
  "status": "live",
  "timezone": "America/New_York",
  "send_window": {
    "days": [1, 2, 3, 4, 5],
    "start_hour": 9,
    "end_hour": 17
  },
  "is_stopped_on_reply": true,
  "filter_groups": [
    {
      "filters": [
        {
          "type": "tag",
          "op": "has",
          "tag": "trial"
        },
        {
          "type": "added_days_ago",
          "op": "less_than",
          "days": 14
        }
      ]
    }
  ]
}'

Next

  • Connect an agent and ask it to do all of the above.
  • Read how campaigns branch, wait and pick who gets what.
  • Browse the API reference for broadcasts, transactional email, webhooks and stats.