Has-not filter trigger vs event trigger: enroll on absence vs enroll on occurrence

Has-not filter vs event trigger: definitions, table, decision tree, FAQ, Leadara mapping.

Niloofar Karimi

Product positioning, messaging, and content for product growth—aligned with product and sales.

September 23, 2026 · 6 min read

Also available in فارسی

تریگر فیلتر «انجام نداده» در برابر تریگر ایونت: ورود روی نبودن در برابر رخداد

A filter-based has-not trigger can enroll when an action is missing (no form, no page view); an event trigger only fires when something happens—so has-not belongs on filters or later if/then branches, not on event enrollment.

What is the difference between a has-not filter trigger and an event trigger?

Teams keep writing “enroll people who have not submitted the form” on an event trigger, then wonder why the canvas rejects it. An event is a positive occurrence on a stream. Absence is not an event; it is a query over history.

A has-not filter trigger asks the profile/history store whether an action is missing in window X and can enroll on that predicate (in filter-based models). An event trigger only listens for fires: Form Submitted, Page Viewed, SMS Opened. What never arrived never moves the stream.

Programmer language: has-not = predicate on missing history; event trigger = subscribe to a stream. Do not ask a stream consumer “did this never happen?” unless you also run a batch job. That is the same spirit as event-centric vs contact-centric automation.

How each works

Has-not filter trigger

Example: contacts with no demo_booked in 30 days and lifecycle = lead. A filter can enroll them because the query is about absence. Good for dormant nurtures and unfinished work. Limitation: some products allow has-not only mid-path, not as enrollment.

Event trigger

Example: enter on Cart Abandoned. Only a fire starts the path. You cannot express “people who never abandoned a cart” as that same event trigger — they are exactly the people who sent no signal.

For negatives, build a filter/segment, or enter on a positive event and branch later with a has-not condition.

Comparison table

DimensionHas-not filterEvent trigger
QuestionIs this action missing?Did this action just happen?
Data sourceHistory / profile / segmentEvent stream
Evaluation timeStatus queryFire moment
Best forDormant / unfinished workReal-time reaction
Common failurePutting has-not on event enrollmentExpecting negative events to fire

Decision tree

  1. React to “just did it”? → event trigger.
  2. Reach “still has not done it”? → has-not filter/segment (or scheduled job).
  3. After a positive event, change path based on another missing action? → event entry + mid-path has-not.
  4. Unsure product support? → read docs, then build an equivalent segment.
  5. Expensive SMS? → pair has-not with caps and quiet hours; dormant audiences churn into spam complaints fast.

Examples

Ecommerce: “did not open welcome email #1” is usually a mid-flow message filter, not an event trigger named “did not open.” Non-opens rarely fire reliable events.

SaaS: saw pricing, never booked demo → segment with page view AND has-not demo in 14 days; filter enrollment.

Food app: address_saved but no first_order → enter on address_saved then wait/filter, or a daily has-not segment. There is no stream event called “did not order.”

Leadara mapping

  • Events: positive, real-time reactions.
  • Segments: natural home for has-not combinations.
  • Journeys: event entry + mid-path absence checks.
  • Email/SMS: keep “still hasn’t” messages short and valuable or you slide into calendar spam — see automation vs scheduling.

If the path must adapt mid-flight, also skim adaptive vs rule-based journeys — but fix enrollment first.

Common mistakes

  • Event trigger with “has not submitted form.”
  • Treating non-open as a first-class event.
  • Eternal has-not with no time window (half the database).
  • Daily SMS to everyone who “still hasn’t purchased” without frequency caps.

One-line takeaway

Has-not queries absence in history; events listen for occurrence on a stream. Put negatives on filters, not on event fire.

Next step

Open one flow titled around “hasn’t done X.” Write: enrollment from stream or from query? If you cannot answer in ten seconds, redesign the trigger.

FAQ

Can events ever capture negatives?

Indirectly: positive entry, then mid-path has-not. Absence itself is not an event.

“Never” or “in a window”?

Prefer a window. Eternal never is noisy.

Is a nightly has-not segment enough?

For daily nurture yes; for sub-minute reaction use event entry + mid conditions.

Trigger filter vs mid-path profile filter?

Enrollment vs continue/skip. Has-not can appear in both with different ops meaning.

Why do AIs suggest has-not event triggers?

Product language collides. Always ask: stream or query?

Win-back pattern?

Has-not purchase in N days via segment/filter or scheduled campaign — not a “did not buy” event.

Is SMS non-delivery an event?

Usually not a reliable negative engagement event; model with time rules and segments.

Step-by-step scenario

Goal: SMS people with no app_open in 7 days after signup.

  1. Enter on Signed Up.
  2. Wait 7 days.
  3. Mid condition: has-not app_open → reminder SMS; else advanced tips.
  4. Parallel daily segment for profiles that never entered onboarding.
  5. Caps + quiet hours.

Stream and query each do their job.

A hybrid pattern that works

Strong teams do not make has-not the enrollment hero; they layer it:

  1. Enter on a clear positive event.
  2. Wait with a business SLA.
  3. Mid-path has-not branch.
  4. A separate daily segment for people who never hit layer 1 (data holes / alternate paths).

Debuggable, and kinder to SMS budgets than an eternal “never purchased since forever” segment.

Copy for “still hasn’t”

Accusatory tone drives unsubscribes. Remove the blocker, remind the value, one CTA. SMS: one line. Email: one screen. If three has-not touches failed, fix the product — automation is not a patch for broken onboarding.

Validate has-not before scale

Build a 20-person golden set: 10 who did the action, 10 who did not. Evaluate the segment/condition. One false membership is enough to stop the launch.

Why is this mistake so common?

Products reuse the word “trigger” for both stream enrollment and filter enrollment. Internal tickets copy the label. Suddenly “has-not trigger” means a segment query in one tool and an impossible event in another.

Write one plain sentence first: “enter when X happens” versus “enter when X is missing from history.” Sentence one → event. Sentence two → filter. That ten-second habit saves hours of debug.

Data quality for has-not

Has-not is only as good as ingestion. If app_open is lossy, “hasn’t opened” is full of false positives. Before bulk SMS:

  • Spot-check event coverage on a random sample.
  • Align event names across app and web.
  • Account for identity merge delay on anonymous → known users.

Without those guards, has-not means “missing data,” not “uninterested user.”

Keep reading