> ## Documentation Index
> Fetch the complete documentation index at: https://docs.hiveku.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Send Your First Email Marketing Campaign

> End-to-end walkthrough from CSV import to scheduled send

This guide takes you from "I have a list of subscribers in a spreadsheet" to "the campaign is scheduled and a test send hit my inbox" — usually about 25 minutes for a first run.

We're talking about Email Marketing here — broadcast newsletters and announcements to your owned audience. If you're after app-triggered transactional emails (password resets, receipts), see [Hiveku Email](/email/overview) instead. For 1-on-1 sales prospecting, see [Cold Email](/how-tos/cold-email).

## Before you start

<Info>
  You need a verified sending domain. Email Marketing won't let you schedule a send from an unverified domain. If you haven't done this yet, follow [Email > Domains](/email/domains) first — it usually takes 10-15 minutes plus DNS propagation.
</Info>

You'll also need:

* A list of subscribers as a CSV (must have an `email` column; `first_name`, `last_name`, and any tags are optional but useful for personalization).
* A subject line and a rough idea of what you want the email to say. The AI Email Coach can draft both if you'd rather start from a brief.

## The flow

<Steps>
  <Step title="Import contacts via CSV">
    Go to `/dashboard/marketing/email/audiences` and click **New audience > Import from CSV**.

    Drop in your `.csv`. Required column: `email`. Optional columns are mapped to contact properties — `first_name`, `last_name`, and any tags column become available as personalization variables.

    Hiveku validates each row. The import log shows the first 10 rejected rows with a reason, so you can fix and re-upload if needed.

    <Tip>
      If your list is over 6 months old, run an external email-verification pass before importing. A single bad CSV is the most common cause of a deliverability spike on a first send.
    </Tip>
  </Step>

  <Step title="Create the audience">
    During the import wizard, you can save the imported contacts as a static audience in one click. Give it a clear name like `Newsletter — April 2026 import` so it's findable later.

    If you'd rather have a dynamic audience that picks up future subscribers automatically, finish the import as a static list, then create a dynamic audience filtered on `tag CONTAINS newsletter` (or whatever tag your CSV applied). See [Build a Dynamic Audience](/how-tos/build-dynamic-audience).
  </Step>

  <Step title="Pick or create a template">
    Go to `/dashboard/marketing/email/templates`. You can:

    * Pick a starter template from the gallery and customize it.
    * Duplicate an existing template and tweak.
    * Click **New template** to start from raw HTML.
    * Ask the coach: *"draft a newsletter template using our brand colors and three story slots."*

    Whichever you pick, click **Quality check** before saving and address any blockers (missing alt text, missing unsubscribe link, broken links).
  </Step>

  <Step title="Compose the campaign">
    Go to `/dashboard/marketing/email/campaigns` and click **New campaign**.

    * **Internal name** — for your reference only. Recipients never see this.
    * **Template** — pick the one you just made.
    * **Audience** — select your imported audience. The picker shows the live count.
    * **Subject** — keep under 60 characters for mobile. The coach lints as you type.
    * **Preheader** — the inbox snippet next to the subject. Up to 150 characters.

    <Tip>
      Use the preheader to extend the subject, not repeat it. If your subject is *"What's new in April"*, your preheader can be *"Three product updates and a shoutout to our top integrators."*
    </Tip>
  </Step>

  <Step title="Test send to yourself">
    Click **Test send** and pick your own email as the recipient. The test send renders against a sample contact (you pick which one), so personalization is exercised end-to-end.

    Check three things in your inbox:

    * Subject and preheader render the way you expect.
    * Personalization variables resolved (no `{{first_name}}` showing through).
    * Links work — click each one.

    If anything looks wrong, fix it and re-test. Test sends don't count against your audience metrics.
  </Step>

  <Step title="Schedule or send">
    You're ready to ship. Two options:

    * **Send now** — fires immediately.
    * **Schedule** — pick a date and time. The coach suggests an optimal window based on past open rates for the audience.

    On click, Hiveku materializes the recipient list, snapshots audience membership, and (for scheduled sends) holds until the send time.

    <Warning>
      Once a send starts, you can cancel further dispatch but you can't recall what's already gone. Big sends fan out in seconds — only schedule when you're confident.
    </Warning>
  </Step>
</Steps>

## Verification

After the send completes, the campaign report at `/dashboard/marketing/email/campaigns/{id}` shows:

* **Sent** count — should match your audience size minus suppressions.
* **Delivered** rate — typically 95%+ on a clean list.
* **Opens and clicks** start streaming in within minutes.
* **Bounces and complaints** post over the next 24-48 hours.

Watch the deliverability dashboard for an hour or two after a first send. If bounce rate climbs above 2% or you see any complaints, treat that as a signal to slow down before your next send.

## Troubleshooting

<AccordionGroup>
  <Accordion title="Schedule button is disabled">
    Three usual causes:

    * Sending domain not verified — see [Email > Domains](/email/domains).
    * Audience preview returned zero sendable contacts.
    * Account-level deliverability issue — check the [Deliverability dashboard](/email-marketing/deliverability).

    The coach surfaces the specific blocker inline.
  </Accordion>

  <Accordion title="Test send arrived but real campaign didn't">
    Most often, the recipient is already on your suppression list. Check `/dashboard/marketing/email/deliverability` and the per-recipient log on the campaign report.
  </Accordion>

  <Accordion title="Personalization variables show as raw text">
    The variable name is misspelled or the contact is missing the property. Use `{{contact.first_name | default: "there"}}` so blank values fall back gracefully.
  </Accordion>

  <Accordion title="Open rate looks low">
    On a first send to a fresh import, open rate is usually 20-40% for engaged lists, 10-20% for older ones. Lower than 10% with no bounces usually means inboxing — landed in spam folders. See [Diagnose Email Deliverability](/how-tos/diagnose-deliverability).
  </Accordion>
</AccordionGroup>

## What's next

<CardGroup cols={2}>
  <Card title="Build a dynamic audience" icon="filter" href="/how-tos/build-dynamic-audience">
    Move from one-time CSVs to live, rule-based segments.
  </Card>

  <Card title="Set up a drip sequence" icon="diagram-project" href="/how-tos/setup-drip-sequence">
    Turn your one-off welcome into an automated nurture flow.
  </Card>

  <Card title="A/B test subject lines" icon="flask" href="/how-tos/ab-test-subject-lines">
    Build subject-line intuition with real data.
  </Card>

  <Card title="Diagnose deliverability" icon="stethoscope" href="/how-tos/diagnose-deliverability">
    Stay ahead of bounce and complaint spikes.
  </Card>
</CardGroup>
