LinkedIn outreachTechnical article

Designing a LinkedIn outreach pipeline: a fixed capacity and an unseen limit

Outreach is a pipeline with a fixed capacity, a limit nobody publishes and very small samples. Planning it like a system makes the numbers honest. Here are the figures I plan with and the engineering behind them.

In short

  • One profile worked by hand sends about 700 connection requests a month, and everything downstream is multiplication from that ceiling.
  • LinkedIn does not publish its invitation limit, so the design rule is headroom and an even pace.
  • Keep one profile in one place. A consistent sign-in history is part of the setup.
  • A month of outreach is a small sample, and most A/B results at that size are noise.
  • Follow-ups are timers. Put them in a scheduler and not in someone's memory.

Outreach has a capacity, so plan like it

Many outreach plans start from the goal, say ten new clients, and work backwards to a message count nobody can send. A better start is the capacity of one profile. A person working a profile by hand at a safe pace sends about 700 connection requests a month. That number is a ceiling set by LinkedIn's limits and by how much a human can personalise in a working day, and it does not stretch because a target needs it to.

Everything downstream is multiplication. At the rates I plan with, half of the requests are accepted, which is 350 people you can message. Add 60 InMails and 80 Open Profile messages, which reach people without a connection, and about 490 people get a message. At a 4% meeting rate that is 20 meetings, and closing 10 to 15% of them gives two or three clients.

Figure 1One profile, one month: the funnel
From request to clientConnection requestssent by hand in a month700Accepted50% accept350People messagedaccepted, plus InMail and Open Profile490Meetings booked4% of people messaged20New clients10 to 15% of meetings2 to 3+10 points of accept rate adds 2 meetings · +1 point of meeting rate adds 5

Swipe sideways to see the whole figure

Planning numbers for one managed profile, not a promise. Every stage multiplies the one before it, so a change near the top moves everything below it by the same percentage.

Because the stages multiply, an improvement at any stage moves every stage after it by the same percentage. Raise acceptance from 50% to 60% and meetings go from 20 to 22. Raise the meeting rate from 4% to 5% and they go to about 25. The meeting rate has more room to move, and it depends on the message and on who you picked.

These are planning numbers for one managed profile, not guarantees. They come from the rates I work to, and your list, your offer and your market will move them.

A limit you cannot see

LinkedIn limits how many invitations an account can send, and it does not publish the number. The ceiling is hidden, it can change, and it is not the same for every account. That makes it an unknown rate limit, and the standard way to live with one is headroom: stay well under where you think the line is, and spread the work evenly.

Spreading matters as much as the total. The same 700 requests sent in four heavy days and the same 700 spread at 35 per working day look nothing alike to a system that counts a rolling seven days. The burst puts 700 inside one window, and the steady schedule never puts more than 175 in any window. It is the logic of a token bucket, which any API client uses: capacity refills at a steady rate and you spend from it evenly.

Figure 2The same 700 requests, two schedules
Steady: 35 each working daybusiest day 35 · busiest 7 days 175Burst: 175 a day, then nothingbusiest day 175 · busiest 7 days 700weekly cap: not published, so keep well under it (illustration)week 1week 2week 3week 4Both schedules send exactly 700 in the four weeks. Only one of them looks like a person.

Swipe sideways to see the whole figure

Bars are requests sent each day. The line is the total of the last seven days, which is the window a weekly limit looks at. LinkedIn does not publish its cap, so the shaded band is only an illustration of leaving headroom below an unknown line.

One profile, one place

Security systems commonly watch for impossible travel: a sign-in from one country followed minutes later by a sign-in from another. If an operator in a different country opens a client's profile directly, the account's history can look exactly like that.

That is the reason we buy a dedicated IP in the account owner's own country and work the profile only from there. The history then shows one consistent place, the same as if the owner had been working. It is a small piece of infrastructure, and it removes a signal that can get an account flagged.

Figure 3What the sign-in history looks like
Operator signs in from their own countryflaggedOwner's countryOperator's country30,000 km/h6,700 km/h08:0009:0010:0011:0012:00Operator works through an IP in the owner's countryconsistentOwner's countryOperator's country08:0009:0010:0011:0012:00Same three sign-ins, same times. Only the place they appear to come from changes.

Swipe sideways to see the whole figure

An illustration with made-up times and two unnamed countries about 10,000 km apart. Impossible travel is a common signal in account security: a sign-in from one place followed by another too soon for anyone to have travelled between them. A passenger jet flies at about 900 km/h.

Access is agreed with the owner before we start, they can revoke it at any time, and they can see every message sent from the profile.

Small samples and the A/B test that proves nothing

A message template is a hypothesis, and a month of outreach is a small experiment. Say template A is accepted 45% of the time and B 55%. With 20 sends each, a test will pick the wrong winner about one time in four. The noise in a measured rate is roughly the square root of p times (1 minus p), divided by n. At 50% and 20 sends that is 11 percentage points, as big as the gap you are trying to see.

Figure 4Two templates, a small test
Sends so far: 50 of 50 per templateTemplate Atruly accepted 45%48%Template Btruly accepted 55%52%0%25%50%75%100%the dashed line is the true rateB looks better, but the ranges overlap.Chance a test this size picks the wrong winner: 16%Separating a 10 point gap reliably takes about 390 sends per template.

Swipe sideways to see the whole figure

Template B is really ten points better. Press Run again to draw a new sample. Each bar is the range the true rate could plausibly be in, given the sends so far. With few sends the ranges are wide and overlap, and the leader is often the wrong one.

To separate a ten point difference with 80% power you need about 390 sends per version. Two versions is 780 sends, which is more than one profile sends in a month, so a single profile cannot finish even one honest test of that size in the time.

So test fewer things and test bigger differences. Compare two clearly different openings and not two phrasings of the same one. Treat a small-sample result as a hint about what to try next, and say so when you report it. Several profiles pool their samples, which is one of the real reasons to run more than one.

Follow-ups are a scheduler

A lead who says to try again in two months is a timer. Without a system the timer lives in someone's head and never fires. A delayed queue fixes it: when the lead is marked, write the due date, and each morning read everything that is due today. The operator's list is the result.

-- run each morning
SELECT lead_id, note
FROM follow_ups
WHERE due_on <= CURRENT_DATE
  AND done_at IS NULL
ORDER BY due_on, priority;
Figure 5A follow-up is a timer
Calendar, day 68MTWTFSSOPERATOR'S LIST FOR DAY 68ELead E: asked to check back in two monthsReminders waiting 0Reminders that fired 10 of 10A dot with a letter is waiting. A small green dot has fired.

Swipe sideways to see the whole figure

Each dot on the calendar is a reminder written the day the lead was marked, in the cell of the day it falls due. When the day arrives, the lead shows up on the list. This is a delayed queue: a due date, and a query for what is due today.

It is also how the Lead Tracker works for the profiles we run: mark a lead to resurface in two weeks or two months, and it lands on the operator's list that morning.

What I would measure

  • Acceptance rate by template and by segment, with the number of sends next to every rate.
  • Replies and meetings per 100 messages sent, so months of different size can be compared.
  • Days from acceptance to first message, because a long gap lowers replies.
  • Follow-ups due against follow-ups done each week.
  • Restriction or warning events, which should be zero and are worth an alert.

Sources

  1. Managed LinkedIn outreach: the planning numbers used in this article
  2. Evan Miller, Sample size calculator for A/B tests

The animated figures are simplified illustrations that use the numbers stated in the text. Where a figure is modelled on a real incident, the sources above are the full accounts.

The service behind this articleManaged LinkedIn outreach
Aslam Sarfraz profile photo

Aslam Sarfraz

AI, DevOps and full-stack engineer

More articles

AI systems · 10 min read

How AI backends handle millions of requests without falling over

A chat answer keeps a GPU, a block of memory and a connection busy for many seconds. What that does to a backend, how serving systems cope, and what a startup should copy.

Full-stack engineering · 8 min read

Why startup backends break at the first big traffic spike

Ticketmaster took 3.5 billion requests in one sale and Segment merged more than 140 services into one. The failures behind spikes are rarely exotic, and each one has arithmetic you can do before launch.

DevOps and reliability · 8 min read

How one config change takes down production, and how to contain yours

CrowdStrike, Google Cloud, AWS and Cloudflare each had a major outage between July 2024 and November 2025, and none began with an attack. What happened, what it teaches and what to put in place.