ENFR
Events, triggers and conversion journeys

An event arrives, the rest follows

A prospect shows up, opens, clicks, fills in a form, places an order. Each of these facts is a dated event attached to a contact, which the platform can read, wait for, count and turn into a message. It is the raw material of nurturing, of journeys, of campaigns and of service messages.

Native and business events

Two origins, one log: what the platform observes, and what your tools tell it.

  • Native events come from the platform itself: delivery, open, click, soft or hard bounce, complaint, unsubscribe, list subscription, granted consent act, entry into a segment, end of a journey.
  • Business events come from your tools — “order placed”, “appointment booked”, “quote requested” — with their payload: a free object, bounded in size, kept as is and readable afterwards.
  • One call lists the event types a space has actually received, with their count and their last occurrence: you know what is available before writing a condition or a template.
  • Every posted event carries an idempotency key: a replay does not count it twice, and a network glitch does not create a duplicate.
  • Opens and clicks only exist for contacts whose measurement consent is valid. The deliverability pixel, which is exempt, emits no event: it only writes a date.
  • A payload never carries sensitive data or an address: it is stored as is and exposed when a message is rendered.
The six places an event is read
  • In a segment: “did” or “did not do” such an event, optionally within the last N days.
  • In a trigger, with a condition on the payload and on the record.
  • In a condition or a wait, in the middle of a journey.
  • In a template, through the latest event of each type — the amount of the last order, the date of the next appointment.
  • In the contact’s score, when the space’s rules award points for it.
  • In the event log, read by call with filters and a cursor, or pushed to a signed webhook.

Contacts, segments and scoring

A record, its attributes, its consent acts, its memberships — and a score that says where the prospect stands.

  • A contact carries typed attributes, an optional external identifier, its subscriptions and its register of consent acts, one per purpose. A refusal is kept as proof, never applied the other way round.
  • A list is an explicit membership: you enter it, you leave it, and the subscription carries its date and its source.
  • A dynamic segment is a definition, not a snapshot: attributes, memberships, consents, business events, engagement, score. It is recomputed on demand, with a preview of how many people are targeted before anything is sent.
  • A contact’s score is computed from rules that belong to the space: points for a subscription, a granted consent, a delivery, a consented open or click; points removed for a bounce, an unsubscribe, a complaint. A daily decay stops a prospect from staying warm for no reason.
  • The bounded score is read in a segment, in a journey condition and in a list filter — and every change is logged with its reason.
  • A suppression list per space holds the addresses that must never be written to again: it outlives the record it came from.
What scoring never takes into account

The deliverability pixel, exempt from consent, produces no point: the only thing it can feed is a last-open date. A contact who has not consented to measurement therefore has neither open points nor click points; their score rests on their explicit acts — subscription, consents — and on technical delivery signals.

The score is a contact datum like any other: it is returned in the right-of-access export and destroyed with the record when it is anonymised.

What is excluded from every audience by default
  • A contact who unsubscribed, objected, or withdrew consent for the purpose concerned.
  • An anonymised contact: the record remains, empty, and can belong to no segment.
  • An address on the suppression list, after a hard bounce or a complaint.
  • A contact without valid consent for the purpose a sensitive-attribute segment derives from.

Triggers

A short rule, readable at a glance: when this event arrives, if this condition holds, do that.

  • A trigger names an event — business or native — and an action: send a service message, or enroll the contact in an active sequence.
  • An optional condition reads the event payload and the record: an amount, a country, an attribute, a score. It is validated at creation; a condition that later becomes invalid never breaks the call that produced the event.
  • An optional delay, from zero to thirty days, separates the event from the action — time enough to let the order settle.
  • An explicit de-duplication rule: every time, once per contact ever, or at most once per period.
  • Pausing a trigger stops it immediately, including for executions already queued.
  • Every decision is written to the contact’s log: fired, skipped — with the reason, condition or de-duplication —, executed with the reference of the message or the enrollment, or failed with its code.
  • A trigger bypasses nothing: suppression list, consent per purpose, quotas, sending windows and warm-up apply as everywhere else.

Nurturing sequences and journeys

A journey is a graph: triggers, steps, and conversion goals that end it the moment they are reached.

You enter a journey through a list subscription, through segment membership, through an API call or through a business event — and one journey can carry several of these entries at once. Each enrollment then follows its own path, at its own pace.

A conversion goal is what the journey exists for: as soon as the awaited event arrives — “order placed”, “appointment booked”, a click on an offer, entry into a customer segment — the enrollment stops, even in the middle of a wait. You do not chase someone who has just bought, and the conversion is counted separately.

One rule runs through the whole grammar: three outcomes, never two. A step that depends on an open or a click distinguishes “did it”, “did not do it in time” and “cannot be measured”. A contact that cannot be measured — because they did not consent to measurement — is never counted as not having opened, and takes their branch without waiting.

The grammar of steps
  • Send a template, with its verified sending domain and its unsubscribe link — and, if asked for, a bounded resend when no open arrives.
  • Wait, relative (three days, business days if needed), dated (the 15th at 9 am), computed from a date on the record (thirty days after the last order) or until a sending window.
  • Wait for an event — an open, a click on a precise link, a delivery, a business event, a subscription, a consent — bounded by a maximum delay, with its fallback exit.
  • Condition on attributes, memberships, consents, score, the latest event of each type, or what happened inside this journey: opened the message of step 1, clicked that link.
  • Switch with several outputs, weighted random split, parallel branches with a join, and A/B test with per-variant measurement.
  • Record update — set an attribute, enter or leave a list, never touch consent —, webhook call, explicit exit.
  • Conversion goals: as soon as a goal is reached, the enrollment stops, wherever it stands, and the exit carries the reason.
What guarantees a message is not sent twice

A step produces at most one send for a given enrollment: deduplication is carried by the execution queue, not by a process’s memory. A restart, a replay or a duplicate notification does not produce a second message. A resend asked for explicitly carries its own key, numbered and capped.

Nothing related to sending happens within an HTTP request: it all goes through the queue. A simulation, by contrast, walks the whole journey without sending anything, showing the paths taken and the dates reached.

Campaigns

A single send to a list or a segment, prepared, previewed, then executed.

  • A campaign targets a list or a segment, with an audience preview — how many people are retained, and which are excluded, with the reason.
  • It runs immediately or at a chosen date, within the space’s sending windows and quotas.
  • The content is a marketing template: unsubscribe link mandatory, sending domain verified.
  • Measurement follows the same rules as everywhere else: rates are reported against the consenting population.
  • A campaign does not alter running journeys: a contact may receive one while enrolled, subject to the space’s pressure rules.

Service messages

A single message, sent to a person because they have just done something.

  • A receipt, a confirmation, an appointment reminder, a password reset: contractual legal basis, distinct from prospecting.
  • Never measured: no performance pixel, no link rewriting, no engagement event — and the option is forced, not left to the caller’s choice.
  • Triggered by an API call or by an event trigger, with an idempotency key so that a replay does not duplicate the message.
  • The content reads the payload of the event that caused it: the order number, the amount, the date of the appointment.
  • Separated from prospecting sends in statistics as in exports: the two regimes are never added up.

Measurement and conversion

Rates that say what they measure, the reference population shown next to them, and conversions counted separately.

  • Goals reached are counted per journey: how many enrollments left because the conversion happened, and which step they had got to.
  • Open and click rates are computed on the consenting population, never on the number of sends: the denominator is published with the result.
  • Statistics per journey and per step, per campaign, per A/B variant, per sending domain.
  • Statistics and event-log exports, on demand or scheduled, as CSV or JSON, with no personal data.
  • Counters served to platform operation roles fall under a display threshold: below twenty people the number is masked, and so are the rates that could be derived from it.
  • Aggregates outlive the anonymisation of a contact: they only ever carried identifiers and numbers.