Weekday LinkedIn invites with a personalized icebreaker
Every weekday at 9am, send each pending contact in your Google Sheet a personalized LinkedIn invite and log the outcome back to the row.
Build a code workflow that works through my LinkedIn outbound queue in Google Sheets every weekday at 9am ET and sends each pending contact a personalized connection invitation.
Trigger: cron, weekdays (Mon-Fri) at 9:00 America/New_York.
Inputs I supply at run configuration: the Google Sheets spreadsheet ID and the queue tab name (default "Queue"). Assume row 1 is headers with columns: LinkedIn URL, Name, Reason, Status, Sent At, Icebreaker Sent, Error.
Step 1: Use Google Sheets Get Values on the queue tab to read all rows. Filter in code to rows where Status is empty or exactly "Pending" and the LinkedIn URL column is non-empty. Cap the batch at 20 rows per run so we stay well below LinkedIn's daily invite ceiling.
Step 2: For each pending row, extract the LinkedIn public handle from the profile URL (e.g. https://www.linkedin.com/in/satyanadella/ becomes satyanadella). Call Unipile Retrieve User Profile with that handle to pull the recipient's first name, title (headline job), current company, and full headline.
Step 3: Feed the recipient's name, title, company, headline, and the row's Reason column into a built-in AI generation step. Ask it to write a two-sentence icebreaker under 300 characters (LinkedIn's connection-note limit), warm and specific to the Reason, no emojis, no exclamation marks, no em dashes. Trim to 297 characters if longer, appending an ellipsis.
Step 4: Call Unipile Send Invitation with the profile identifier returned by Retrieve User Profile and the generated note as the message body.
Step 5: Use Google Sheets Update Values to write back to the same row: Status = "Invited", Sent At = current ISO timestamp in America/New_York, Icebreaker Sent = the exact note that was sent, Error = blank. On any error from Unipile, instead set Status = "Failed: <short reason>" and put the full error message in the Error column, then continue with the next row (never abort the whole run).
Between invites, sleep 3-5 seconds so the pacing looks human. At the end of the run, log a summary line to the workflow output with counts for sent, failed, and skipped.
Both integrations are already public: Google Sheets (Get Values, Update Values) and Unipile (Retrieve User Profile, Send Invitation). Use those exact operations.
What does this prompt do?
- Reads the queue tab in your Google Sheet and picks up rows still waiting to be contacted.
- Looks up each person on LinkedIn to grab their title, headline, and company so the note lands with context.
- Writes a warm two-sentence icebreaker that fits inside LinkedIn's invite note limit.
- Sends the connection invitation and logs the outcome, timestamp, and exact note back to the same row.
What do I need to use this?
- A Google account with edit access to your outreach spreadsheet.
- A Unipile account with your LinkedIn profile connected.
- A queue tab in your sheet with columns for LinkedIn URL, name, reason for reaching out, and status.
How can I customize it?
- Change the schedule to twice a day, only certain weekdays, or a different time zone.
- Raise or lower the per-run cap (default 20) to match your LinkedIn invite ceiling and warm-up plan.
- Rewrite the icebreaker style to match your voice, or pull in extra sheet columns like industry or shared connection.
- Point it at a different tab, or filter on a different status value than Pending.
FAQs
How does the workflow know which rows to contact?
Won't LinkedIn flag me for sending too many invites?
Can I write my own icebreaker style?
What happens if an invite fails?
Do I need a paid LinkedIn plan?
Related templates
Every weekday at 10am, an AI voice agent phones your most overdue Xero accounts, logs what each customer promised, and reports back to finance in Slack.
See every Google Maps listing you manage on one screen, ranked worst first, with an audit button that writes the fix list for you.
Your team picks a template, finds the customer, checks they are safe to email, then sends it, with every send logged where the whole team can see it.
Every night at 2am, pull the contacts on your open and won deals and block them from your cold outreach before the next send goes out.
Build every text campaign in one screen: check who is actually reachable, see a realistic send plan, then watch delivery land row by row.
See every LinkedIn ad account's spend against the budget you committed to, catch overspend early, and rebalance without rebuilding a spreadsheet.
Turn your outreach spreadsheet into a warm invite machine.
Connect Google Sheets and Unipile once, and every weekday morning your queue turns into personalized LinkedIn invites, logged straight back to the row.