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

# Build a Dynamic Audience

> Filter contacts by behavior, attributes, and tags so your audience stays fresh without manual maintenance

A dynamic audience is a saved filter that re-evaluates every time you use it. Define it once, and every campaign or sequence that references it picks up the right people automatically — newly tagged, newly engaged, freshly imported.

If you'd rather work with a fixed roster, see the static audience pattern in [Audiences](/email-marketing/audiences#building-a-static-audience).

## When to use dynamic vs static

Use **dynamic** when:

* Membership is rule-based ("paid users", "tag = newsletter").
* The list grows or shrinks naturally over time.
* You want a sequence to keep enrolling new matches.

Use **static** when:

* You imported a one-time list (event RSVPs, beta cohort).
* You need a frozen list for compliance or audit.
* You're sending to a hand-picked group that doesn't share a clean rule.

## Examples

Three filters that cover most real use cases:

<Tabs>
  <Tab title="Engaged customers">
    *"All customers who opened the last 3 emails"*

    ```
    Lifecycle stage IS customer
    AND Opened in last 3 campaigns IS true
    ```

    Use this for product updates and high-trust offers — you know they're paying attention.
  </Tab>

  <Tab title="Fresh leads">
    *"Leads created in the past 14 days who haven't been emailed yet"*

    ```
    Lifecycle stage IS lead
    AND Created at WITHIN last 14 days
    AND Last campaign sent at IS empty
    ```

    Pair with a welcome sequence trigger — if your welcome flow doesn't already auto-enroll, this audience makes sure no new lead falls through the cracks.
  </Tab>

  <Tab title="Active subscribers">
    *"Tag = newsletter-subscriber AND status = active"*

    ```
    Tag CONTAINS newsletter-subscriber
    AND Lifecycle stage IS NOT churned
    AND Unsubscribed IS false
    ```

    The classic "who gets the newsletter" filter.
  </Tab>
</Tabs>

## The flow

<Steps>
  <Step title="Open the audience editor">
    Go to `/dashboard/marketing/email/audiences` and click **New audience > Dynamic**.
  </Step>

  <Step title="Compose the filter">
    Each row is one predicate. Pick a field, an operator, and a value:

    * **Field** — `lifecycle stage`, `tag`, `last opened at`, custom property, etc.
    * **Operator** — `IS`, `IS NOT`, `CONTAINS`, `WITHIN`, `IS EMPTY`.
    * **Value** — text, date, or boolean depending on the field.

    Stack rows with **AND** or **OR**. Group rows with parentheses for compound logic — the editor exposes a grouping toggle to the right of each row.
  </Step>

  <Step title="Preview membership">
    Click **Preview**. You'll see:

    * **Total matching** — how many contacts hit the filter.
    * **Sendable** — total minus suppressions, hard bounces, and missing addresses.
    * **A 25-row sample** — verify the filter is doing what you think.

    <Tip>
      Always check the sample. A single mis-spelled tag value (`Newsletter` vs `newsletter`) silently produces the wrong list — the preview catches it.
    </Tip>
  </Step>

  <Step title="Name and save">
    Use a descriptive name that conveys both the segment and the filter: `Customers — engaged 60d` or `Leads — created 14d, not yet mailed`. Save.

    The audience is now selectable from any campaign or sequence picker.
  </Step>
</Steps>

## AI-assisted audience building

The Email Coach can write the filter from a sentence. From any email page sidebar, try:

* *Build an audience of paid users in California who opened the last newsletter.*
* *I need people who clicked any link in the last 30 days but haven't bought yet.*
* *Audience of contacts tagged `webinar-attendee` who are still leads.*

The coach drafts the filter, runs the preview for you, and saves with a name you approve. If it's not quite right, you can edit any row inline.

## Re-evaluation timing

Dynamic audiences re-evaluate at three moments:

1. **In the editor** — when you click **Preview** or save.
2. **At schedule time** — the picker shows the current count.
3. **At send time** — the actual recipient list is materialized from the live filter.

This means a campaign you scheduled three days ago will pick up contacts who became eligible since. If you want a frozen list ("send to exactly these 1,200 people, not anyone added later"), convert to static before scheduling — there's a **Convert to static** button in the editor.

## Membership snapshots

Even on a dynamic audience, the actual contacts that received a campaign are recorded in `marketing_audience_membership`. So:

* Reports stay accurate even if the filter shifts later.
* "Re-send to non-openers" works against the original list.
* Compliance audits can prove who was sent to.

## Refining over time

A common pattern: your dynamic filter starts loose ("all customers"), then tightens as you learn ("all customers who opened in the last 60 days"). To refine without breaking history:

1. Duplicate the audience in the editor.
2. Tighten the filter on the duplicate.
3. Verify with a preview.
4. Switch your sequences and campaign templates to reference the new audience.
5. Archive the old one.

History on the original campaigns is preserved.

## Troubleshooting

<AccordionGroup>
  <Accordion title="Preview shows zero matches">
    Most common cause: tag spelling. Tags are case-sensitive — `Newsletter` and `newsletter` are different. Open a known-good contact, copy the tag value verbatim into your filter.

    Second most common: AND'd a `Last opened at WITHIN 30 days` filter on a brand-new list where nobody has opened anything yet.
  </Accordion>

  <Accordion title="Audience is much bigger than expected">
    Three things to check:

    * You OR'd two conditions instead of AND'ing them.
    * The default unsubscribe exclusion is off.
    * A `Tag CONTAINS newsletter` is matching all variants of the tag (`newsletter-monthly`, `newsletter-weekly`). Use exact match (`Tag IS`).
  </Accordion>

  <Accordion title="Same contact appears in two audiences I expected to be exclusive">
    Audiences aren't mutually exclusive by default — overlapping filters can put the same contact in both. Either tighten one filter to explicitly exclude the other's tag, or use the **Subtract another audience** option in the editor.
  </Accordion>

  <Accordion title="Membership keeps changing between preview and send">
    By design — that's what "dynamic" means. If you need a stable list, convert to static before scheduling.
  </Accordion>
</AccordionGroup>

## Related

<CardGroup cols={2}>
  <Card title="Audiences reference" icon="users" href="/email-marketing/audiences">
    Full reference for static and dynamic audiences.
  </Card>

  <Card title="Send your first campaign" icon="rocket" href="/how-tos/send-first-email-campaign">
    Use your new audience in a broadcast.
  </Card>
</CardGroup>
