LinkedIn + Airtop: safe invites, logged in Sheets
You open LinkedIn to do “quick outreach,” and suddenly it’s an hour later. Half that time is wasted checking if you’re already connected, re-opening profiles, and second-guessing whether you already sent an invite last week.
This hits growth marketers first. But agency owners running lead gen for clients and founders doing their own prospecting feel the same drag. LinkedIn invites automation fixes the repeat work and keeps your outreach steady without relying on memory.
This workflow uses Airtop to open a profile, detect connection status, send a safe invite (with or without a note), and then logs what happened in Google Sheets so you can scale with confidence.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: LinkedIn + Airtop: safe invites, logged in Sheets
flowchart LR
subgraph sg0["On form submission Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/form.svg' width='40' height='40' /></div><br/>On form submission"]
n1@{ icon: "mdi:play-circle", form: "rounded", label: "When Executed by Another Wor..", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch1", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Unify Params", pos: "b", h: 48 }
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtop.svg' width='40' height='40' /></div><br/>Click on connect"]
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtop.svg' width='40' height='40' /></div><br/>Send connection w/out message"]
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtop.svg' width='40' height='40' /></div><br/>Click add a note"]
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtop.svg' width='40' height='40' /></div><br/>Type the message"]
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtop.svg' width='40' height='40' /></div><br/>Send connection w/ message"]
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtop.svg' width='40' height='40' /></div><br/>Create a Session"]
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtop.svg' width='40' height='40' /></div><br/>Create a window"]
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtop.svg' width='40' height='40' /></div><br/>Click More button"]
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Is a connection?", pos: "b", h: 48 }
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtop.svg' width='40' height='40' /></div><br/>Terminate session"]
n14["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtop.svg' width='40' height='40' /></div><br/>Terminate session1"]
n15["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtop.svg' width='40' height='40' /></div><br/>Check connection status"]
n16["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtop.svg' width='40' height='40' /></div><br/>Airtop"]
n16 --> n14
n2 --> n5
n2 --> n6
n3 --> n9
n10 --> n11
n6 --> n7
n4 --> n2
n9 --> n10
n12 --> n4
n12 --> n13
n7 --> n8
n11 --> n15
n0 --> n3
n15 --> n12
n8 --> n16
n5 --> n16
n1 --> n3
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0,n1 trigger
class n2,n12 decision
classDef customIcon fill:none,stroke:none
class n0,n4,n5,n6,n7,n8,n9,n10,n11,n13,n14,n15,n16 customIcon
The Problem: LinkedIn Outreach Breaks at Scale
Sending connection requests sounds simple until you’re doing it every day. You bounce between tabs, open profiles one-by-one, click “Connect,” then realize the button isn’t there because you’re already connected or you have a pending invite. Now you’ve lost momentum, and your “quick task” turns into context switching. Worse, when you don’t track outcomes, you end up sending duplicates, missing follow-ups, or bothering people who already saw your request. It’s not hard work. It’s draining work.
The friction compounds. Here’s where it breaks down most often:
- You waste about 5 minutes per prospect just confirming you can actually send an invite.
- Pending invites quietly pile up, and you keep revisiting the same profiles because there’s no record.
- Personalized notes get skipped because typing them repeatedly slows you down.
- Your reporting is fuzzy, so you can’t tell if your list quality or your messaging is the real issue.
The Solution: Airtop Sends Invites Only When It’s Safe
This workflow automates the annoying part of LinkedIn outreach: checking status, sending the request the right way, and keeping a clean record. It starts when you submit a LinkedIn profile URL (either from a simple form trigger or another upstream workflow). n8n normalizes the inputs, then Airtop launches a browser session using your authenticated Airtop Profile (so it behaves like “you,” already logged into LinkedIn). Airtop opens the target profile, inspects what actions are available, and decides what to do next. If you’re already connected or the invite is pending, it stops without sending anything. If “Connect” is available, it sends the invite, optionally adds your note, captures a snapshot for proof, and closes the session cleanly.
The flow begins with your linked_url plus an Airtop Profile name. Airtop checks the profile’s current state, then routes to either “end session” or “send invite.” Finally, you push the outcome to Google Sheets so you can track attempts, skip duplicates, and keep outreach consistent.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you send 20 connection requests a day. Manually, it’s usually about 5 minutes per profile once you include opening the page, checking status, and typing a note, which is roughly 100 minutes daily. With this workflow, submitting a batch of 20 URLs can take about 10 minutes, then Airtop runs the checks and sends invites in the background. You still review your message template, but you’re no longer babysitting every click. That’s about an hour back each day you do outreach.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Airtop to run an authenticated LinkedIn browser session
- Google Sheets to log invites and outcomes centrally
- Airtop API Key (get it from your Airtop dashboard)
Skill level: Intermediate. You’ll connect credentials, map a few fields, and test with your own LinkedIn account safely.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A form submission or upstream workflow triggers the run. You pass in the LinkedIn profile URL, the Airtop Profile name (already logged into LinkedIn), and an optional message.
The workflow standardizes your input. n8n normalizes fields so downstream steps don’t break when a URL is formatted slightly differently or when the message is blank.
Airtop opens the profile and checks what’s possible. It navigates to the “More” menu, inspects the profile status, then uses a switch to decide if it should end the session or proceed to “Connect.” If a note is included, it opens the note field and types it before sending.
The run wraps up with evidence and clean shutdown. Airtop captures a snapshot of the window, then closes the session so you don’t get stuck with hanging browser processes. From there, it’s easy to log the result in Google Sheets for tracking and dedupe.
You can easily modify the message logic to enforce templates or personalization rules based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Trigger Type
Set up how the workflow starts—either from another workflow or via a public form.
- Open Upstream Workflow Trigger and confirm it accepts inputs named airtop_profile, linked_url, and message.
- Open Form Intake Trigger and set Form Title to
LinkedIn connection requests. - In Form Intake Trigger, add fields for LinkedIn URL (required), Airtop Profile (connected to Linkedin) (required), and Message (textarea).
- Keep the Form Description set to the provided HTML content (this is shown to users).
linked_url, while Normalize Inputs looks for linkedin_url or LinkedIn URL. Ensure your upstream workflow sends linkedin_url or update Normalize Inputs accordingly.
Step 2: Normalize Input Fields
Standardize incoming data so downstream Airtop nodes can reference consistent fields.
- Open Normalize Inputs and add three assignments.
- Set linkedin_url to
{{ $json.linkedin_url || $json['LinkedIn URL']}}. - Set airtop_profile to
{{ $json.airtop_profile || $json['Airtop Profile (connected to Linkedin)']}}. - Set message to
{{ $json.message || $json['Message']}}.
Step 3: Connect Airtop and Open the LinkedIn Profile
Start an Airtop session and load the target LinkedIn profile in a live window.
- Open Start Airtop Session and set Profile Name to
{{ $json.airtop_profile }}. - Enable Save Profile On Termination in Start Airtop Session.
- Open Open Profile Window and set URL to
{{ $('Normalize Inputs').item.json.linkedin_url }}. - Set Resource to
windowand turn on Get Live View in Open Profile Window.
Step 4: Inspect Connection Status and Route the Flow
Check whether the profile is connectable and route based on the AI extraction result.
- In Press More Menu, confirm Element Description is
More button. - In Inspect Profile Status, keep the Prompt as provided to output
Connect,Pending, or1st degree. - In Connection Status Check, verify the first rule checks
{{ $json.data.modelResponse }}containsConnect, and the second rule checks notContainsConnect. - Confirm the execution flow: Inspect Profile Status → Connection Status Check → Press Connect Button if connectable; otherwise → End Airtop Session.
Step 5: Configure Invite Actions and Session Cleanup
Send a connection request with or without a note, then capture evidence and close the session.
- In Press Connect Button, keep Element Description set to
Connectand use{{ $json.windowId }}and{{ $json.sessionId }}. - In Message Presence Router, confirm the routing rules check
{{ $('Normalize Inputs').item.json.message }}for empty vs. not empty. - If empty, Message Presence Router routes to Send Invite No Note with Element Description
Send without a note. - If not empty, route to Open Note Field → Enter Note Text (set Text to
{{ $('Normalize Inputs').item.json.message }}) → Send Invite With Note (set Element Description toSend). - After either send path, confirm Capture Window Snapshot → Finalize Session Close to close the Airtop session.
Connect or Send without a note, update the Element Description in the relevant Airtop nodes.
Step 6: Test and Activate Your Workflow
Run a full test to verify Airtop navigation, routing, and session termination.
- Click Execute Workflow and submit the Form Intake Trigger with a real LinkedIn profile URL and Airtop profile name.
- Confirm the workflow opens the profile, detects the connection status, and either sends an invite or terminates the session via End Airtop Session.
- Verify a screenshot is produced by Capture Window Snapshot and the session closes in Finalize Session Close.
- When satisfied, toggle the workflow Active to enable production use.
Common Gotchas
- Airtop credentials can expire or need specific permissions. If things break, check your Airtop API key status in the Airtop dashboard first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 30 minutes if your Airtop Profile is already authenticated.
No. You’ll mostly connect accounts and map fields. The logic is already built into the workflow branches.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Airtop API usage costs based on your run volume.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and it’s one of the best tweaks to make. You can enforce a template by adjusting the “Normalize Inputs” step to build your message automatically, then always routing through the “Open Note Field” and “Enter Note Text” actions. Some teams insert the first name and company from their spreadsheet, while others rotate two or three note variations to avoid sounding repetitive. If you want a strict “no message unless qualified” rule, you can keep the existing message router and only allow notes for certain rows.
Usually it’s an expired Airtop API key or the wrong Airtop Profile name. Double-check that the profile is still authenticated to LinkedIn inside Airtop, then confirm the API key in n8n matches the one in your Airtop dashboard. If it fails only on some profiles, LinkedIn may be showing a slightly different UI state, so the “Inspect Profile Status” check needs a small adjustment.
It can handle plenty, but your practical limit is LinkedIn’s own invite limits and how fast you want to run Airtop sessions.
Often, yes, because Zapier and Make can’t reliably “look at the page” to decide if Connect is available, and that’s the whole point of doing this safely. Airtop plus n8n gives you the branching you need (already connected, pending invite, connect with note, connect without note) without turning it into a fragile chain of hacks. Self-hosting also matters if you run outreach daily and don’t want to count every task. That said, if your process is only “log a URL, send a Slack alert,” Zapier or Make is fine. Talk to an automation expert if you want help picking the right stack.
Once this is running, outreach stops feeling like tab-juggling. The workflow handles the repetitive checks and clicks so you can focus on the list, the offer, and the follow-up.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.