outbound

Signal-Based Outreach Engine

  • outbound
  • sales
  • linkedin
  • email

Signal-driven LinkedIn + email outbound: an AI agent finds high-intent, on-ICP leads, a staged sequence does the outreach, replies route to your CRM, and a weekly loop tunes signals, copy and structure.

6 Steps in the flow
3 Tools orchestrated
4 Human checkpoints
Weekly Run cadence
qualified calls / month Booked meetings

The objective

What this system is built to do

Turn intent signals into booked meetings: Gojiberry surfaces high-intent leads matching your ICP, a staged + email sequence does the outreach, replies route straight to your CRM, and a weekly loop feeds performance back into signals, copy and structure. Not doing: mass list-blasting or unqualified volume, every lead is signal-qualified and on-ICP before a message is sent.

Cycle & hand-offs: Weekly Performance Review runs weekly (Mon) and starts the cycle. Hand-offs: Weekly Performance Review → Copy Review: straight away; Campaign Structure Review → Campaign Setup & Launch: once the structure review proposed a change and its sign-off task is done; if it proposed none this can never happen; Copy Review → Campaign Setup & Launch: once the copy review proposed a change and its sign-off task is done; if it proposed none this can never happen; ICP & Signal Agent → Campaign Setup & Launch: straight away. Runs on its own rhythm: Campaign Structure Review (monthly); Reply Tracking & Routing (daily). Any other link waits for a person. Sign-off steps stay with a person; everything else can run on its own once armed.

How it runs

The steps your team follows

The workflow, exactly as it runs inside . It plays through step by step, or pick any node on the map.

Start
1

Campaign Setup & Launch

Daily

Purpose. Build, stage and launch the outreach sequence for sourced leads. Nothing sends until copy + targeting are signed off.

Tooling note. Creating the campaign and its sequence steps is done in the Gojiberry app (UI-only). The API drives *enrollment*: a list linked to the campaign controls membership, `create_list({ campaignId })`, `add_contacts_to_list`, `remove_contacts_from_list`.

Standard sequence ( + email).

- Step 1, LinkedIn connection request + short, signal-anchored opener (reference the trigger that sourced them).

- Step 2, LinkedIn value message (the problem you solve + one proof point).

- Step 3, Email follow-up (fresh angle, soft CTA to a short call).

- Step 4, Breakup message.

- A/B test the Step 1 opener (two variants).

Setup & staged launch.

  1. Confirm the sequence + copy are built in Gojiberry (draft). `get_campaign` to read the `steps` array.
  2. Create the enrollment list linked to the campaign, `create_list({ name, campaignId })`.
  3. Pull the on-ICP leads from the Agent, review a sample.
  4. Human approval, surface the copy + a sample of the target list for sign-off. Do not enroll or launch without approval, cold outreach to real prospects is irreversible.
  5. On approval, `add_contacts_to_list` to enroll, then start sending from Gojiberry.
  6. Post a "campaign live" note to and log the launch.

Guardrails. Keep Gojiberry's daily send caps. List stays on-ICP only, no bulk dumping.

Launch gate, run on the exact list that will enrol, not the whole CRM.

  1. *Identity*, one record per company and per person; merge duplicates before enrolling.
  2. *Owner*, every lead has one accountable owner (or a stated routing rule) so a reply has somewhere to land.
  3. *Context*, remove current customers, open deals, anyone contacted inside your cooldown window, and anyone on the suppression list.
  4. *Reachability*, emails were published or verified, never assembled from a name pattern; the sending domain passes SPF, DKIM and DMARC.
  5. *Fit*, each lead carries the signal and ICP reason it was sourced on.

A hard fail removes that lead, whatever the deadline. Fix in that order, then rebuild the list from the source filters rather than editing the export.

Sequence standards.

- Put the effort into the first touch in each channel; that is where conversations start. Every later step must bring new information or it comes out.

- Time the start to the signal: act-now signals (pricing or demo-page visits, inbound actions) inside ~24–48h; ramp signals (a new leader settling in) a couple of weeks in. Default windows, tune on your own reply data.

- Weekdays only, inside the recipient's working hours. No links or attachments in the first email; every merge field has a fallback.

- Set the stop rules before the first send: default pause at a 2% hard-bounce rate or any spam complaint, alerting the campaign owner.

2

Campaign Structure Review

Daily

Purpose. Review the *shape* of the sequence, not the words, step count, channel mix, timing, caps. (Copy lives in *Copy Review*.)

Trigger: monthly. Fed by *Weekly Performance Review*.

  1. Read the sequence via Gojiberry `get_campaign` (`steps`): step types (invitation / message / email / visitProfile), order, `delayAfterLastStep`, `launchHour`, `activeDays`, send caps, `isManual`.
  2. Map the funnel drop-off by step from `campaignStatus` (found → contacted → accepted → replied → interested) to see where prospects fall out.
  3. Recommend structural changes: add/remove/reorder steps, adjust inter-step delays, rebalance LinkedIn vs email, change daily caps or launch window, connection-first vs email-first.
  4. Human approval before changing a live campaign's structure.

Output: structure recommendations + a change log. Feeds *Campaign Setup & Launch*.

How to read it honestly.

- *Credit the first answered step.* A reply marks the whole thread as answered, so counting answered states per step over-credits later steps. Sort each replier's events by time and credit only the first step they answered.

- *Split by connection state.* Compare reply rates for accepted connections against people who never connected; if the gap is large, connection-first beats email volume.

- *Check skips.* Read the share of steps skipped (invites not sent, DMs skipped for non-connections), a long sequence often collapses into one cold email for most leads.

- *Check timing.* Share of sends landing at weekends or outside working hours.

- Recommend one structural change per cycle, with the result that would prove it right.

3

Copy Review

Weekly

Purpose. Review the *words* of the outreach and improve them, openers, subject lines, message bodies, A/B variants. (Structure lives in *Campaign Structure Review*.)

Trigger: weekly (Thu). Fed by *Weekly Performance Review*.

  1. Pull per-step and per-A/B-variant engagement from Gojiberry: `list_campaigns` → `get_campaign` (`steps`) → `list_contacts({ listId })`, reading `campaignStatus`. For each step/variant compute: invitation acceptance, email open rate, message/email reply rate.
  2. Rank openers, subject lines and messages best→worst. Flag any variant materially below the campaign benchmark (e.g. open below 60%, reply below target).
  3. Draft improved copy for the weak variants, keep the winning angle, rewrite the loser. Maintain a running copy-test log (what was tested, what won).
  4. Human approval before pushing any copy change to a live campaign.

Output: revised copy for the campaign + an updated copy-test log. Feeds *Campaign Setup & Launch*.

The reply gate, score every first touch before it ships.

A touch needs at least two of these, a first touch three:

- *Bring something*, a concrete asset made for this account (a teardown, a list, a worked example), named in the ask.

- *Observe, don't pitch*, open on a cost or blind spot they may not have priced, as an observation or genuine question.

- *One fresh, specific line*, something dated within the last three months that only a person who looked could write.

- *Easy to forward*, makes sense to a colleague with no context; one small ask.

Then check: delete the opener, does it still work? (Then it was decoration.) Could it go to another company unchanged? Is there one ask? Is the proof a number or a name? Score pull 0–10 on its own; below 7 goes back for a rewrite, naming the missing move.

Size the ask to the relationship. Cold → permission to send the asset. Connected or recent history → the asset plus a soft "worth a look?". Already replied → only now ask for the meeting.

Signal-anchored openers. The first line should only make sense because the trigger happened. Use public facts only and never reveal how the lead was found.

Never: a statistic as the opener, a direct competitor of the recipient as proof, "just following up" or "circling back", or reopening a quiet thread with nothing new. Log the winning move on every positive reply.

4

ICP & Signal Agent

Weekly

Purpose. Maintain the Gojiberry lead-finding *Agent* that sources prospects matching your ICP and intent signals. In Gojiberry, Agents find leads; Campaigns do the outreach.

Define your ICP (set on the Agent, or via `update_agent`):

- Job titles: `{{target job titles}}`

- Industries: `{{target industries}}`

- Company size: `{{company sizes, e.g. 11–50, 51–200}}`

- Locations: `{{target locations}}`

- Exclude: agencies / service providers (`excludeServiceProviders: true`); named competitors + existing customers via `ignoredCompanies`

- Keep `minLeadScore` at a floor that protects list quality

Signals (configured in the Gojiberry UI). Keyword engagement, competitor engagement, brand awareness (profile visitors / post engagers), buying events / recent job changes. Pick the signals that map to how your buyers show intent.

Cadence, fortnightly, or whenever the weekly review flags a weak signal.

  1. `get_agent`, read current ICP + config.
  2. `get_agent_logs`, which signals produced leads, volumes, failed runs.
  3. `get_intent_type_counts`, intent distribution across sourced contacts.
  4. Refine with `update_agent` (titles / industries / sizes / locations / mandatoryKeywords / ignoredCompanies / minLeadScore). Human approval before materially broadening the ICP or disabling the service-provider / score filters.
  5. Log what changed and why.

Output: a tuned Agent feeding a clean, on-ICP lead list into *Campaign Setup & Launch*.

Read each signal before it becomes a lead.

- *What changed, and why now?* One line on what the trigger means for this account, plus how strong and how certain it is.

- *Decay profile.* Act-now (short, sharp intent) or ramp (a window opening over weeks)? Stamp a reach-out-by date and a cold-after date; an expired act-now signal is just a cold lead again. Never invent urgency the trigger doesn't support.

- *Verify at the source.* Hiring, funding and leadership claims count only when confirmed at the company's own site, or at a listing matched on company name and domain. Research summaries alone are never enough. If it doesn't verify, drop it entirely; don't soften it into the copy.

- *Prune by output.* Signals that produce no on-ICP leads over a full cycle are candidates to cut. Treat a run that didn't execute differently from a run that found nothing.

5

Reply Tracking & Routing

Daily

Purpose. Catch every reply, alert the team, and log it to your CRM, daily. Drafts replies; never auto-sends.

CRM home: a dedicated outbound deals pipeline, kept separate from your main sales pipeline. Suggested stage mapping:

- New lead sourced → *New Lead*

- Sequence sent → *Contacted*

- Positive reply → *Positive Reply*

- Call agreed → *Meeting Booked* → *Qualified Opportunity*

- Not interested / unsubscribe → *Closed Lost*

  1. Gojiberry `list_unibox_threads`, threads updated since the last run (`dateFrom`), all seats. Prioritise `interested: true` and unseen.
  2. For each, `get_unibox_thread_messages` to read the latest exchange.
  3. Classify: positive, neutral (later / referral), negative (not interested / unsubscribe), auto (OOO / bounce).
  4. Positive → post to your outbound channel (name, company, sourcing signal, reply snippet, LinkedIn link); create/update the CRM contact + a deal at *Positive Reply* (move to *Meeting Booked* when a call is agreed) + attach a note with the thread; set the Gojiberry contact `fit: "qualified"`, `state: "answered"` if a call is agreed. Draft a suggested reply in the Slack alert.
  5. Negative / unsubscribe → deal to *Closed Lost*; Gojiberry contact `state: "excluded"`.
  6. Neutral → CRM note; if "later", `state: "paused"`.
  7. escalate anything ambiguous or needing a human reply. Never `send_unibox_linkedin_message` without sign-off, draft only.

Output: a routed, CRM-logged reply queue with Slack alerts and drafted responses.

_Runs `assist` until the Gojiberry key is set and one clean run has happened, then graduate to `auto`._

Classification rules.

- *Machine mail is its own outcome.* Out-of-office: keep the lead in the sequence, move the next touch to one working day after a stated return date (never a guessed one), and record nothing, not a reply, not a stage change. Delivery deferrals: no action. Hard bounces: suppress permanently before the next send.

- *"Not interested" is an objection, not an unsubscribe.* Only an explicit stop request stops contact.

- *A "wrong person" reply is a referral.* Thank them, ask for the right name, and route it the same day.

- *A buying question is a buy signal.* Answer in one line and ask for the meeting in the same message.

- *"Let's talk" means send the booking link plus what you'll bring.* Never "which day works?".

- Every classified reply gets a CRM note and a dated next touch with its reason, so no warm thread is orphaned.

- Auto-replies and bounces never count towards reply or positive-reply metrics.

6

Weekly Performance Review

Weekly

Purpose. The weekly read on performance + signals, and the hub that dispatches improvements back into the system (closes the loop).

Trigger: weekly, Mon 09:00.

1. Funnel + performance. Pull the Gojiberry funnel for active campaigns, found → contacted → accepted → replied → interested, plus emails sent, open rate, bounce rate, unsubscribes. Record the metric values (Leads sourced, Contacted, Acceptance rate, Reply rate, Open rate, Bounce rate, Unsubscribes, Emails sent, Positive replies).

2. Signals. Per Agent: `get_agent_logs` (last 7 days) + `get_intent_type_counts`, which signals produced leads (`nbResultsLastLaunch`), volume trend, failed runs, intent mix.

3. Dispatch, close the loop. Route each finding to the process that owns the fix:

- Weak / quiet signals (low `nbResultsLastLaunch`, dead keywords or competitors) → ICP & Signal Agent to retune targeting + signals.

- Copy underperformance (low open or reply by step / A-B variant) → Copy Review.

- Funnel drop-off / structural issues (low acceptance, channel mix, timing, caps) → Campaign Structure Review.

4. Report out. Record a report on this system (funnel table, signal table, dispatched actions, week-over-week) and post a short digest.

Output: weekly report + Slack digest + logged metric values, with explicit hand-offs to signal tuning, copy and structure.

Diagnose in layers, stop at the first break.

  1. *Delivery*, bounces, complaints, placement. If this is broken, change nothing else this week.
  2. *Engagement*, acceptance and opens (opens are diagnostic only; tracking is unreliable).
  3. *Replies*, by first answered step. Healthy opens with near-zero replies point to the offer or copy; weak opens and weak replies mean fixing delivery and subject first.
  4. *Reply quality*, split positive, referral, not-now and negative before judging anything. Lots of replies but mostly negative is a segment problem.

Replies but no meetings? Check reply speed and the ask before touching copy; interest fades within hours.

Rules. Quote the sample size with every rate. Leave out auto-replies. Read acceptance per sending account (one account dropping is an account problem; all dropping together is targeting or copy). Prescribe one change per week, with the result that would confirm it.

1 / 6

Setup

The stack

The tools this system drives, and the context you bring once. Connect your own accounts, or swap in your team's equivalent.

Tools to connect

Gojiberry Powers Campaign Setup & Launch
LinkedInfrom $99 / mo Powers Campaign Setup & Launch Or HeyReach, Expandi
SlackFree – $7 / mo Powers Campaign Setup & Launch Or Discord, MS Teams

Context to bring

Your documents 4 files
  • ICP definition Titles, industries, company size, locations, exclusions
  • Signals that show intent Which buying events, competitors and keywords matter for you
  • Offer and proof points What you give a cold prospect, and the results you can name
  • Suppression list Customers, open deals, competitors and anyone who opted out

Proven in market

Run by 117 teams, verified on real accounts

Signal-Based Outreach Engine is built and verified by Growth Division, the GTM team behind 130+ companies.

Built & verified by Growth Division

Get started

How to run this system

Live in an afternoon. Clone it, connect your tools, set your inputs, and turn it on.

  1. 1

    Add to

    Clone the Signal-Based Outreach Engine into your workspace, wired end to end.

  2. 2

    Connect your tools

    Gojiberry, LinkedIn, Slack.

  3. 3

    Set your inputs

    Your ICP, targets and brand rules, once.

  4. 4

    Turn it on

    It runs weekly on autopilot, checking in with you only where it matters.

~45 min / week your time on autopilot · vs 8–10 hrs / week by hand
qualified calls / month Booked meetings, produced for you
All growth systems

Next launch: Week of 3 Nov 2026 · 1 slot left

Run the Signal-Based Outreach Engine in your workspace.

In 30 minutes we find where your go-to-market is leaking and map the first system we’d launch. You leave with a plan whether or not you work with us.