> ## 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.

# Audiences

> Static lists and dynamic segments that re-materialize on every send

An audience is the recipient list for any campaign or sequence. Hiveku supports two kinds — **dynamic** (a saved filter that re-evaluates each time it's used) and **static** (a fixed roster you control by hand) — and you can mix and match them across your sends.

Find audiences at `/dashboard/marketing/email/audiences`.

## Dynamic vs static

<Tabs>
  <Tab title="Dynamic">
    A dynamic audience is a saved filter. Membership is computed at the moment you preview, schedule, or send a campaign. If a contact's tags change tomorrow, the audience reflects that — no manual maintenance.

    Use dynamic when:

    * Membership is rule-based ("all paid users", "anyone tagged `newsletter`").
    * You want to re-use the audience across many campaigns.
    * You're running drip sequences that should keep enrolling new matches over time.
  </Tab>

  <Tab title="Static">
    A static audience is a fixed list of contact IDs you control explicitly. It doesn't change unless you edit it.

    Use static when:

    * You imported a one-time list (event attendees, beta users).
    * You're sending an exclusive announcement to a hand-picked group.
    * You need a frozen roster you can audit later.
  </Tab>
</Tabs>

<Info>
  Whichever you pick, the actual recipient list is **snapshotted** when a campaign is scheduled or sent. Even on a dynamic audience, the contacts that received the message are recorded against the campaign — so the report is reproducible even if the underlying filter shifts later.
</Info>

## Building a dynamic audience

Dynamic audiences are built with a filter editor that AND/ORs across these dimensions:

* **Lifecycle stage** — `lead`, `prospect`, `customer`, `churned`.
* **Source** — where the contact came from (`web-signup`, `csv-import`, `crm-sync`, etc.).
* **Tags** — any tags you've set in the CRM (`newsletter`, `paid-tier`, `early-access`).
* **Date fields** — `created_at`, `last_opened_at`, `last_clicked_at`, custom date properties.
* **Behaviors** — opened the last N campaigns, clicked any link in the last 30 days, never opened, unsubscribed (excluded by default).
* **Custom properties** — anything you've defined on the contact schema.

<Steps>
  <Step title="Click New audience">
    From `/dashboard/marketing/email/audiences`, click **New audience** and pick **Dynamic**.
  </Step>

  <Step title="Compose the filter">
    Stack conditions. Each row is a single predicate; group rows with AND or OR. Example:

    ```
    Lifecycle stage IS customer
    AND Tag CONTAINS newsletter
    AND Last opened at WITHIN last 60 days
    ```
  </Step>

  <Step title="Preview membership">
    Click **Preview** to see the estimated count and a sample of 25 matching contacts. The preview also flags how many would be excluded for unsubscribes, hard bounces, or missing email addresses.
  </Step>

  <Step title="Name and save">
    Give the audience a clear name (`Paid newsletter — engaged 60d`) and save. It's now selectable from any campaign or sequence picker.
  </Step>
</Steps>

<Tip>
  The AI Email Coach can build dynamic filters from a sentence. Try: *"audience of paid users in California who opened the last newsletter."*
</Tip>

## Building a static audience

Two ways:

1. **CSV upload** — drag a `.csv` with at least an `email` column. Optional columns (`first_name`, `last_name`, tags) are imported as contact properties so personalization works downstream.
2. **From a filter, then frozen** — start with a dynamic preview, then click **Convert to static**. Useful when you want a one-time launch list that won't shift.

Static audiences can be edited later — add or remove contacts directly, or upload a new CSV that merges in.

## Importing from your CRM

If you're using Hiveku CRM, contacts are already available — no import needed. For external systems:

* **HubSpot** — see [Connect HubSpot](/how-tos/connect-hubspot). Imported contacts gain a `source: hubspot` tag.
* **Mailchimp** — see [Connect Mailchimp](/how-tos/connect-mailchimp). Audiences come over as static lists; you can rebuild as dynamic afterward.
* **GoHighLevel** — see [Connect GHL](/how-tos/connect-ghl).

After import, the contacts live in the Hiveku CRM and are available to every email audience filter.

## Estimated size and quality flags

Before you save, the preview shows:

* **Total matching** — how many contacts hit the filter.
* **Sendable** — total minus suppressions, hard bounces, and missing addresses.
* **Recently mailed** — count of contacts who got a campaign in the last 7 days (helps spot fatigue).
* **Engagement bucket** — share of recipients who've opened in the last 30/60/90 days.

If sendable drops to under 50% of total matching, the editor flags it — usually a sign the segment is full of stale or invalid addresses and needs cleanup before you send.

## Audience snapshots

Every send records a **membership snapshot**: the exact list of contact IDs that were targeted at send time. This matters because:

* **Reports stay accurate.** If a contact unsubscribes the day after, your campaign report still shows they were sent to.
* **Re-sends are reproducible.** "Re-send to non-openers" works against the original list, not whatever the filter resolves today.
* **Compliance is auditable.** You can prove who was on the list when you sent, which matters for unsubscribe disputes.

Snapshots are stored in `marketing_audience_membership` keyed by `(audience_id, campaign_id, contact_id)`.

## Archiving

When an audience is no longer used, click **Archive**. Archived audiences:

* Are hidden from campaign and sequence pickers.
* Stop being recomputed (saves DB load on big dynamic filters).
* Stay readable in reports — historical campaigns still show the audience name.

You can unarchive anytime.

## Troubleshooting

<AccordionGroup>
  <Accordion title="My dynamic audience is bigger than I expected">
    Check whether you accidentally OR'd conditions instead of AND'ing them. Also, the default behavior **excludes** unsubscribes and hard bounces — if you toggled that off, you'll see a much larger number.
  </Accordion>

  <Accordion title="Preview shows zero matches">
    Most common cause: a tag spelling mismatch (`Newsletter` vs `newsletter`). Tags are case-sensitive in filter rows. Open a known-good contact and copy the tag value verbatim.
  </Accordion>

  <Accordion title="CSV import skipped half my rows">
    The importer drops rows missing a valid `email` column or with an obviously malformed address. Check the import log — Hiveku surfaces the first 10 rejected rows with reasons.
  </Accordion>

  <Accordion title="Can I re-target non-openers from an old campaign?">
    Yes. From the campaign report, click **Re-send to non-openers** — it materializes a static audience of recipients who didn't open within 72 hours, which you can then use in a follow-up.
  </Accordion>
</AccordionGroup>

## Related

<CardGroup cols={2}>
  <Card title="Build a dynamic audience" icon="filter" href="/how-tos/build-dynamic-audience">
    Step-by-step walkthrough with examples.
  </Card>

  <Card title="Campaigns" icon="paper-plane" href="/email-marketing/campaigns">
    Use an audience in a one-off broadcast.
  </Card>
</CardGroup>
