mailtanimailtani

Getting Started with Correios

Correios is a marketing email platform built for developers and growth teams. You connect your app to Correios via API, fire events when things happen (user registers, trial expires, user goes inactive), and Correios handles the email logic — sending, sequencing, branching, and tracking.

How It Connects to Your App

Your app and Correios communicate in two directions:

Your app → Correios

  • Sync contacts (with custom field values) via POST /contacts
  • Fire events via POST /events to trigger flows

Correios → Your app (optional)

  • Webhooks when emails are opened, clicked, bounced, or contacts unsubscribe

You don't have to manage email scheduling, retries, or unsubscribe logic. That's all handled by Correios.

Three Campaign Types

Broadcasts

A one-time email sent to a segment of contacts. Use for:

  • Announcements, changelogs, newsletters
  • Promotions or limited-time offers
  • One-off communications to all users (or a filtered subset)

Broadcasts are scheduled and sent once. They don't react to contact behaviour.

Sequences

A linear drip sequence — a series of emails sent on a fixed schedule after a contact is enrolled. Use for:

  • Onboarding education (email per day for a week)
  • Product training courses
  • Nurture campaigns with no branching needed

Sequences are simpler than flows — no conditions, no branching. Every contact gets the same emails in the same order.

Flows

Visual, event-triggered automations with branching logic. Use for:

  • Reacting to lifecycle events (trial expiring, user went inactive)
  • Conditional logic (send different emails to users who uploaded vs. didn't upload)
  • Chaining actions: send email → wait → check condition → branch

Flows are triggered by events fired from your app. They're the most powerful campaign type.

Rule of thumb: If you need branching or timing tied to a contact's behaviour, use a flow. If you're sending the same series to everyone, use a sequence. If it's a one-time send, use a broadcast.

Quick Start

Step 1 — Add a Sending Domain

Go to Settings > Sending Domains and add your domain (e.g. yourdomain.com). Follow the DNS verification steps. You'll need to add DKIM and SPF records — Correios shows you exactly what to add.

See the Provider Setup guide for step-by-step instructions for common DNS providers.

Step 2 — Add a Sending Email

After your domain is verified, go to Settings > Sending Emails and add the email address you want to send from (e.g. [email protected]). This address is used in all campaign sends.

Step 3 — Create Custom Fields

Custom fields let you store per-contact data and use it in email templates as {{custom.fieldName}}.

Go to Settings > Custom Fields and create the fields your app will sync. For example:

  • plan (text) — the user's subscription plan
  • trialEndsAt (date) — when the trial expires
  • hasUploadedVideo (boolean) — whether the user has uploaded anything

Step 4 — Sync Your First Contact

Call POST /api/v1/contacts with the contact's email and any custom field values:

curl -X POST https://mailtani.com/api/v1/contacts \
  -H "Authorization: Bearer mk_your_api_key_here" \
  -H "X-Project-Id: your_project_id" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "firstName": "Jane",
    "custom_values": {
      "plan": "free",
      "trialEndsAt": "2026-03-23",
      "hasUploadedVideo": "false"
    }
  }'

The contact appears in your Contacts list immediately.

Step 5 — Fire Your First Event

Fire a lifecycle event to test that your connection is working:

curl -X POST https://mailtani.com/api/v1/events \
  -H "Authorization: Bearer mk_your_api_key_here" \
  -H "X-Project-Id: your_project_id" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "event_name": "user.registered",
    "properties": {
      "dashboardUrl": "https://yourapp.com/dashboard"
    }
  }'

If you have a flow with a user.registered trigger active, Jane will be enrolled automatically.

What's Next