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.
Additional information
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.
Frequently asked questions
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
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.