/dashboard/marketing/email/audiences.
Dynamic vs static
- Dynamic
- Static
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.
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.
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.
Compose the filter
Stack conditions. Each row is a single predicate; group rows with AND or OR. Example:
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.
Building a static audience
Two ways:- CSV upload — drag a
.csvwith at least anemailcolumn. Optional columns (first_name,last_name, tags) are imported as contact properties so personalization works downstream. - 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.
Importing from your CRM
If you’re using Hiveku CRM, contacts are already available — no import needed. For external systems:- HubSpot — see Connect HubSpot. Imported contacts gain a
source: hubspottag. - Mailchimp — see Connect Mailchimp. Audiences come over as static lists; you can rebuild as dynamic afterward.
- GoHighLevel — see Connect GHL.
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.
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.
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.
Troubleshooting
My dynamic audience is bigger than I expected
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.
Preview shows zero matches
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.CSV import skipped half my rows
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.Can I re-target non-openers from an old campaign?
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.
Related
Build a dynamic audience
Step-by-step walkthrough with examples.
Campaigns
Use an audience in a one-off broadcast.