Skip to content
Ken

Triggers and signal automation

Turn a campaign into an always-on pipeline that fires one personalized email per lead the moment a buying signal matches - instead of blasting a static list.

11 min read · Updated Jun 29, 2026

Overview

Signals let you attach live behavioral triggers to a campaign so leads are pulled in automatically when they show intent. Instead of loading a list and sending to everyone on day one, you define the behavior you care about and the campaign stays open, accepting new leads one at a time until you pause it.

The four live signals available today are:

  • Link Clicked - fires when a contact clicks a link a given number of times within a time window
  • Click Dormancy - fires when a previously engaged contact has gone quiet
  • Reply Received - fires on a classified reply: Interested, Not Interested, or Out of Office
  • Custom Signal - fires when a lead you upload through the API is verified and ready for outreach

A row of preview cards shows upcoming signals sourced from the Ken Search index - job changes, fundraising rounds, hiring surges, and more. These are not configurable yet; clicking one opens an interest form.

Where to find it: Open any campaign, go to the Actions tab, and select Signals from the Data Sources section in the left sidebar. The URL pattern is /campaigns/<id>?tab=actions&action=signals.

Before you start

  • You need an active campaign. Signals can be configured on any campaign but the campaign converts to Trigger mode permanently on the first save. This conversion cannot be undone.
  • The Custom Signal (API upload) requires an active API key. See API keys.
  • Bot opens and clicks are automatically filtered and will never fire a trigger. "Email Opened" is not available as a trigger signal - open tracking is unreliable and has been excluded from the product.

How to configure signals

Step 1: Open the Signals panel

  1. Open a campaign.
  2. Click the Actions tab.
  3. In the left sidebar under "Data Sources", click Signals.

If no signals have been configured yet, you will see an intro screen with a "Turn On Signals" button and a note that the campaign will become always-on.

Step 2: Add a signal

  1. Click Turn On Signals (first time) or Add Signal (if signals already exist).
  2. The catalog grid opens. Live signals show immediately; preview signals show a coming-soon badge.
  3. Click a live signal card to add it as a draft. The catalog closes and the new signal card appears in the overview.

Step 3: Configure the rule

Click the signal card to expand it. You will see three sections:

Rule - the condition that must be true for the signal to fire. Each signal type has its own fields:

  • Link Clicked: minimum click count, time window (minutes/hours/days), optional URL filter
  • Click Dormancy: days since last click, optional URL filter
  • Reply Received: reply type (Interested / Not Interested / Out of Office); Not Interested adds a re-engagement delay in days; Out of Office uses the prospect's parsed return date plus a configurable offset
  • Custom Signal: no additional rule fields - the signal fires when the uploaded lead's email is verified

Audience - which campaigns to watch for contacts. Currently only "All campaigns" is available; a campaign picker is listed but disabled in this release.

Guardrails - four fields that control safety and frequency:

| Field | Default | What it does | |-------|---------|--------------| | Cooldown per contact (days) | 7 | Minimum days before the same contact can re-fire this signal | | Max signal age (hours) | 24 | Signals older than this are discarded rather than sent | | Priority | Medium | When a contact trips multiple triggers at once, highest priority wins | | Stop their current sequence | On | Removes the contact from any active sequence in the source campaign before adding them to this one |

Step 4: Save

Click Save changes at the bottom of the expanded card. The first save on any campaign:

  1. Converts the campaign to Trigger mode (one-way - no rollback in v1)
  2. Creates the trigger definition

A "Signal saved." toast confirms success. The card collapses and shows a plain-English summary of the rule (for example: "Clicks a link containing 'pricing' 3+ times within 2 hours").

Step 5: Monitor

The Signals overview shows four summary counters for the past 7 days:

  • Fired this week - how many times any signal matched
  • Leads added - how many contacts reached EmailBison
  • Suppressed - how many firings were blocked before sending
  • Daily cap - the campaign's current maximum sends per day

Each card also shows a toggle to pause or resume that individual signal without removing it.

How to upload leads via the API

The Custom Signal is powered by the v2 API lead upload endpoint. Use this to push CRM signups, demo requests, or any external list into a trigger campaign.

Endpoint: POST /v2/campaigns/{id}/leads

Authentication: API key (ClientApiKey policy). See API keys.

Requirements:

  • The target campaign must be in Trigger mode with an active Custom Signal configured
  • Each row must include first_name, last_name, and either company_domain or company_name
  • Batch size: 1 to 1000 rows per call

Per-row result: the response reports each row as accepted, duplicate, or rejected with a reason.

Important: uploading a lead does not send anything. The lead is placed in a hidden staging area and goes through Ken's normal email enrichment and verification pipeline. The signal fires only after a deliverable address (Safe or Verified) is confirmed. If enrichment cannot verify an address, no email is ever sent.

How it works

When you save a signal, Ken converts the campaign to Trigger mode and stores a trigger definition. From that point on, the pipeline runs automatically.

Signal intake. Live engagement signals (clicks, classified replies) are mapped from Ken's email event processor as they arrive. API uploads land in a hidden staging campaign and are checked every minute - a signal is only published once enrichment confirms a deliverable email.

Evaluation. Each incoming signal is matched against your active definitions. A per-contact cooldown lock and a database-level dedup key ensure the same contact cannot trip the same signal twice within the cooldown window, even if two events arrive at the same moment.

Arbitration. Before any email is sent, a four-stage check runs:

  1. Is the contact on the blocklist or missing a verified email? - blocked
  2. Has this contact sent an Interested reply in the last 30 days (across any campaign)? - blocked
  3. Has this email received a trigger send in the last 7 days? - blocked
  4. Is this contact already active in another trigger campaign? - blocked

If a contact trips multiple triggers in the same processing batch, the highest-priority definition wins and the rest are suppressed. This means a prospect who fires three signals at once still receives at most one email.

Firing. Surviving firings run through the full AI personalization pipeline and push a single lead to EmailBison. Each step is persisted so retries are safe - the model is never called twice for the same firing and the daily capacity budget is refunded if a push fails.

Capacity. Trigger sends count against the campaign's daily cap. If the cap is reached, the firing waits 15 minutes and retries rather than being dropped. It still expires if it ages past the Max signal age guardrail while waiting.

Reply-type timing. Reply Received is outcome-aware, not just "a reply happened":

  • Interested: fires immediately
  • Not Interested: scheduled for a configurable number of days in the future
  • Out of Office: scheduled to the contact's parsed return date plus an offset (default 1 day); falls back to 7 days if no return date is found; clamped to a maximum of 365 days from the reply

Compliance. Bounces, unsubscribes, and spam complaints are categorically excluded from triggering outreach at the evaluation layer, regardless of what any signal definition says. This is enforced in code, not in configuration.

Troubleshooting & debugging

Symptom: "Failed to save signal." toast appears immediately after Save changes

  • Likely cause: the browser tab is stale after a frontend deploy. The app should detect this and offer a reload prompt. If it does not, reload the page manually and try again.

Symptom: Signal shows as saved but "Leads added" counter stays at zero

  • Check "Suppressed" counter first. If it is rising, signals are firing but being blocked by arbitration. Possible causes: the contact has an active Interested reply from another campaign (30-day window), the contact already exists in another trigger campaign, or the global frequency cap (7 days by default) is blocking re-sends.
  • If both "Fired this week" and "Suppressed" are zero, the signal condition may not be matching. Verify the rule parameters - for Link Clicked, confirm the click count threshold and URL filter are not more restrictive than the actual link behavior.
  • For Custom Signal: confirm enrichment has completed for the uploaded leads. Leads uploaded without a verified email will not fire until verification succeeds. If the issue persists after several hours, contact support - the enrichment pipeline may need investigation.

Symptom: Reply Received signal is not firing on replies

  • Confirm the reply classification. Bounces, unsubscribes, and spam complaints are always excluded, even if the rule appears to match. "Not Interested" replies only fire if a delay is configured or the contact is not otherwise suppressed.
  • "Email Opened" is not available as a signal and cannot be configured. Open tracking is excluded from the product.
  • Reply classification is asynchronous. A reply that initially lands as Unclassified and is later reclassified to Interested will fire the trigger at reclassification time - this is expected behavior.

Symptom: API upload returns 400

  • The campaign may not have an active Custom Signal configured, or the campaign is not in Trigger mode. Check the Signals panel and confirm a Custom Signal is saved and active.
  • Verify the required fields are present in every row: first_name, last_name, and either company_domain or company_name.
  • Scalar values only - objects and arrays in any field will reject the row.

Symptom: Campaign mode shows "Trigger" but signals were never intentionally configured

  • This is the expected one-way conversion. Once a signal is saved on a campaign, it becomes a Trigger campaign permanently. Batch mode cannot be restored in v1.

Symptom: A contact is uploaded via API but never receives an email

  • The lead is in the enrichment pipeline. Check whether the email address provided was valid (must have exactly one @, no spaces). Addresses provided with personal-email domains may be stored as Invalid if the campaign disallows personal emails.
  • If enrichment cannot find or verify an address, the signal never fires and no email is sent.

Symptom: "Daily cap" stat shows a dash

  • The daily cap is fetched from the backend once the campaign is in Trigger mode and has at least one saved signal. A dash indicates the fetch has not returned yet or the value is not set. Check campaign settings for a Max emails per day limit.

FAQ

Can I add signals to a campaign that already has contacts?

Yes. Existing contacts and data sources are not affected. Signals only pull in new contacts as signals fire going forward. Your current audience list stays as a one-time batch.

What happens if I remove a signal?

Pending firings that have already been created continue to process. No new firings are created after the signal is removed. The campaign remains in Trigger mode.

Can the same contact be sent to by two different trigger campaigns?

No. Once a contact has an exported firing in one trigger campaign, any other trigger campaign firing for the same email is suppressed as part of the arbitration check. This is a global, cross-campaign rule.

Does "Stop their current sequence" remove the contact from all campaigns?

It removes the contact from the active sequence in the campaign that produced the signal (the source campaign), not from all campaigns. The contact is then added to the trigger campaign.

Why is there no "Email Opened" signal?

Open tracking is unreliable - email clients prefetch pixels (Apple Mail Privacy Protection, Outlook SafeLinks) producing false opens. Ken has excluded it from the signal catalog entirely to prevent low-quality triggers.

Can I test signals without sending to real prospects?

Signal injection against test campaigns is available via the internal API for engineering and support use. End users should use the Max signal age guardrail and a staging campaign to test trigger logic before pointing it at a live audience.

Related articles

Related articles

Still need help?

Can't find what you're looking for? Our team is one message away. We usually reply within a business day.

Contact us