rtrvr.ai
Browser ExtensionStart in Chrome, on the page you're on.CloudA thousand browsers, on your schedule.RoverThe AI customer engineer for your product.Data & EvalsExpert trajectories for AI labs.
ACCESSAPI + MCPCLI & SDKTemplatesIntegrationsWhatsApp
Use cases
Vibe ScrapingLead EnrichmentWeb MonitoringForm FillingJob ApplicationsSocial MediaAI Web ContextAgentic CheckoutAll use cases
Pricing
BlogLaunches, benchmarks, deep divesDocsExtension, Cloud, API, MCP, CLICase StudiesReal teams, real runsVideosNew runs every weekChangelogWhat just shippedNewslettersProduct releases and real runs
Docs
Log inBook DemoAdd to Chrome
Log in
Menu
Add to ChromeBook a demo
ProductsBrowser ExtensionCloudRoverData & EvalsExploreUse casesPricingResourcesDocs

Opening template…

rtrvr.ai

Make every site
work for you.

Launches first, roadmap early, and the occasional trick we only share by email.

Products

Browser ExtensionCloudRoverData & Evals

Use cases

Vibe ScrapingLead EnrichmentForm FillingWeb MonitoringSocial MediaJob ApplicationsData MigrationAI Web ContextAgentic Checkout

Resources

DocsBlogData for AI LabsCase StudiesVideosNewslettersChangelogPricingAppSumoDemoAffiliate

Company

TeamContactGCP PartnerWhat We BelieveSecurityPrivacyTerms

Developers

APIMCPCLI & SDKTemplatesIntegrationsWhatsApp

Compare

ApifyBardeenBrowserbaseBrowser UseClayClaudeCometFirecrawl
Products
Browser ExtensionCloudRoverData & Evals
Use cases
Vibe ScrapingLead EnrichmentForm FillingWeb MonitoringSocial MediaJob ApplicationsData MigrationAI Web ContextAgentic Checkout
Resources
DocsBlogData for AI LabsCase StudiesVideosNewslettersChangelogPricingAppSumoDemoAffiliate
Company
TeamContactGCP PartnerWhat We BelieveSecurityPrivacyTerms
Developers
APIMCPCLI & SDKTemplatesIntegrationsWhatsApp
Compare
ApifyBardeenBrowserbaseBrowser UseClayClaudeCometFirecrawl
BACKED BYNVIDIA InceptionGoogle Cloud for StartupsBright DataNEC XSalesforce LaunchpadElevenLabs GrantsGMI CloudComposioSmallest.ai Grants
DISCOVERYllms.txtllms-full.txtagents.mdDocumentation indexSitemapOpenAPIAI Catalog
© 2026 rtrvr.ai
DiscordYouTubeInstagramTikTokLinkedInXGitHub
support@rtrvr.ai
Back to templates

RUN FROM A SPREADSHEET TEMPLATE

Send Instagram messages from a spreadsheet

Use a Google Sheet to send a tailored Instagram message to each account.

RUNS INYour signed-in browser
SETUPOne target or a Google Sheet
WHAT YOU GET03 PARTS
  1. 01One message per Sheet row
  2. 02Account context used
  3. 03Send status for each row
EXAMPLE INPUTDM 30 influencers about collab

SET UP YOUR RUN

Add the details. Check the result. Run it.

No code needed.
01

Choose your starting list

Run once for one target, or repeat it for every row in a Google Sheet.

Google Sheet

Choose the Sheet with one target per row.

EXPECTED COLUMNSprofile_url, name (optional), message_text (optional), context (optional)

No sheet selected. Choose one from Google Drive.

Sign in to choose a Sheet

Your run stays disabled until the Sheet is connected.

02

Tell rtrvr what to use

Required details are marked. The example text shows the expected format.

Used when the message_text cell is empty. rtrvr drafts from the row and account.

03

Choose where it runs

Cloud uses a fresh managed browser. The extension uses the sites you are already signed into.

Your browser is required. This template needs a site where you are signed in.

Choose a browser

Pick a browser where the rtrvr extension is online.

Get the extension
Finish setup in your browser
  1. Install the extension
  2. Sign in to rtrvr
  3. Come back and choose the browser
ONE MORE STEP

Add the required details to continue.

WHAT HAPPENS NEXT

From setup to finished result.

  1. 01

    rtrvr opens the right sites. It uses Cloud or the signed-in browser you chose.

  2. 02

    The browser does the job. You can follow the run and step in if a site asks for help.

  3. 03

    You get the result. The output above is the shape to expect.

ADVANCEDRequest JSONOptional

Exact request sent to the run panel.

REQUEST.JSON
{
  "source": "retrieve",
  "template": {
    "id": "bulk_instagram_dm",
    "slug": "bulk-instagram-dm",
    "name": "Bulk Instagram DM Sender",
    "categoryId": "SOCIAL_SCALE"
  },
  "inputs": {
    "sheetUrl": "",
    "messageGoal": "collaboration",
    "messageTemplate": "",
    "__inputSource": "sheet"
  },
  "agentHint": "You are sending bulk Instagram DMs. Adapt completely to the actual UI you encounter.\n\n**TASK CONFIGURATION:**\n- Sheet URL: \n- Message Goal: collaboration\n- Message Template: \n\n---\n\n## STEP 1: LOAD SHEET DATA\n\n1. Navigate to \n2. Read all rows\n3. **Expected columns:**\n   - profile_url (REQUIRED)\n   - name (optional - helps personalization)\n   - message_text (optional - overrides generation)\n   - context (optional - extra personalization)\n4. Validate: Skip rows without profile_url\n5. Count total valid rows for progress tracking\n\n---\n\n## STEP 2: PROCESS EACH ROW\n\nFor each valid row:\n\n### A. NAVIGATE TO PROFILE\n1. Go to the Instagram profile_url from this row\n2. Wait for profile to fully load\n3. **Check profile status:**\n   - Profile exists? If not, log \"Profile not found\" and continue\n   - Private account? Note this affects DM delivery\n   - Account type (personal, creator, business)\n\n### B. ANALYZE THEIR PROFILE (for personalization)\n**Gather context for message generation:**\n- Username and display name\n- Bio content and niche\n- Follower count (relevance indicator)\n- Recent post themes (if visible)\n- Account type and aesthetic\n\n### C. ACCESS DM FUNCTIONALITY\n1. Look for message/DM action on their profile\n2. **Possible states:**\n   - DM button visible: Proceed\n   - No DM option: Account may have DMs restricted\n   - \"Message\" in dropdown/menu: Find and access it\n3. If DMs not accessible, log \"DMs restricted\" and continue to next\n\n### D. PREPARE MESSAGE\n\n**IF message_text column has content for this row:**\nUse it exactly as provided.\n\n**VALIDATION:**\n- Instagram DMs have ~1,000 character limit per message\n- If over limit: Log \"Message exceeds 1,000 chars ()\" and skip\n- Check for spam trigger words\n\n**ELSE generate message:**\n- Goal: collaboration\n- Template/angle: \"\"\n- Row context: [use context column if present]\n- Profile personalization: [use analyzed profile data]\n\n**Generation rules:**\n- Reference something SPECIFIC from their profile/content\n- Keep it casual (Instagram tone is informal)\n- 3-5 sentences maximum\n- Include context naturally\n- Match their aesthetic energy\n- NEVER be overtly promotional in first message\n\n### E. SEND MESSAGE\n1. Open DM composer\n2. Enter the message\n3. Check for any validation warnings\n4. Send the message\n5. Wait for confirmation (message appears in thread)\n6. **Check delivery status:**\n   - Sent successfully\n   - In \"requests\" folder (not following)\n   - Failed/blocked\n\n### F. LOG RESULT\nRecord for this row:\n- Profile URL and username\n- Message sent or generated\n- Character count\n- Delivery status\n- Any errors encountered\n\n### G. RATE LIMITING - CRITICAL\n- Wait 45-90 seconds between DMs (vary timing)\n- Instagram has strict DM limits\n- **If you see \"Action Blocked\" or similar warning:**\n  - STOP immediately\n  - Report partial results\n  - Note the warning message\n\n---\n\n## STEP 3: GENERATE COMPLETION REPORT\n\n```json\n{\n  \"totalRows\": <number>,\n  \"processed\": <number>,\n  \"sent\": <number>,\n  \"inRequests\": <number>,\n  \"skippedRestricted\": <number>,\n  \"skippedOverLimit\": <number>,\n  \"failed\": <number>,\n  \"stoppedEarly\": false,\n  \"stopReason\": \"\",\n  \"results\": [\n    {\n      \"rowIndex\": <number>,\n      \"profileUrl\": \"\",\n      \"recipientUsername\": \"\",\n      \"followerCount\": <number>,\n      \"accountType\": \"personal|creator|business\",\n      \"dmAccessible\": true|false,\n      \"messageSource\": \"sheet|generated\",\n      \"messagePreview\": \"<first 100 chars>\",\n      \"characterCount\": <number>,\n      \"withinLimit\": true|false,\n      \"deliveryStatus\": \"sent|in_requests|restricted|failed\",\n      \"error\": \"\"\n    }\n  ],\n  \"warnings\": []\n}\n```\n\n---\n\n## ADAPTIVE UI HANDLING\n\n**DO NOT assume specific button locations or text.**\n- DM button may be icon, text, or in menu\n- Message composer varies by account type\n- Delivery confirmation appears differently\n- Handle any prompts or modals that appear\n\n## INSTAGRAM-SPECIFIC CONSIDERATIONS\n\n- Messages to non-followers go to \"Requests\"\n- Creator/Business accounts may have different DM flows\n- Some accounts have DM filtering enabled\n- Too many DMs too fast = action block (can last hours to days)\n- Being promotional = lower response rates",
  "userInput": "You are sending bulk Instagram DMs. Adapt completely to the actual UI you encounter.\n\n**TASK CONFIGURATION:**\n- Sheet URL: \n- Message Goal: collaboration\n- Message Template: \n\n---\n\n## STEP 1: LOAD SHEET DATA\n\n1. Navigate to \n2. Read all rows\n3. **Expected columns:**\n   - profile_url (REQUIRED)\n   - name (optional - helps personalization)\n   - message_text (optional - overrides generation)\n   - context (optional - extra personalization)\n4. Validate: Skip rows without profile_url\n5. Count total valid rows for progress tracking\n\n---\n\n## STEP 2: PROCESS EACH ROW\n\nFor each valid row:\n\n### A. NAVIGATE TO PROFILE\n1. Go to the Instagram profile_url from this row\n2. Wait for profile to fully load\n3. **Check profile status:**\n   - Profile exists? If not, log \"Profile not found\" and continue\n   - Private account? Note this affects DM delivery\n   - Account type (personal, creator, business)\n\n### B. ANALYZE THEIR PROFILE (for personalization)\n**Gather context for message generation:**\n- Username and display name\n- Bio content and niche\n- Follower count (relevance indicator)\n- Recent post themes (if visible)\n- Account type and aesthetic\n\n### C. ACCESS DM FUNCTIONALITY\n1. Look for message/DM action on their profile\n2. **Possible states:**\n   - DM button visible: Proceed\n   - No DM option: Account may have DMs restricted\n   - \"Message\" in dropdown/menu: Find and access it\n3. If DMs not accessible, log \"DMs restricted\" and continue to next\n\n### D. PREPARE MESSAGE\n\n**IF message_text column has content for this row:**\nUse it exactly as provided.\n\n**VALIDATION:**\n- Instagram DMs have ~1,000 character limit per message\n- If over limit: Log \"Message exceeds 1,000 chars ()\" and skip\n- Check for spam trigger words\n\n**ELSE generate message:**\n- Goal: collaboration\n- Template/angle: \"\"\n- Row context: [use context column if present]\n- Profile personalization: [use analyzed profile data]\n\n**Generation rules:**\n- Reference something SPECIFIC from their profile/content\n- Keep it casual (Instagram tone is informal)\n- 3-5 sentences maximum\n- Include context naturally\n- Match their aesthetic energy\n- NEVER be overtly promotional in first message\n\n### E. SEND MESSAGE\n1. Open DM composer\n2. Enter the message\n3. Check for any validation warnings\n4. Send the message\n5. Wait for confirmation (message appears in thread)\n6. **Check delivery status:**\n   - Sent successfully\n   - In \"requests\" folder (not following)\n   - Failed/blocked\n\n### F. LOG RESULT\nRecord for this row:\n- Profile URL and username\n- Message sent or generated\n- Character count\n- Delivery status\n- Any errors encountered\n\n### G. RATE LIMITING - CRITICAL\n- Wait 45-90 seconds between DMs (vary timing)\n- Instagram has strict DM limits\n- **If you see \"Action Blocked\" or similar warning:**\n  - STOP immediately\n  - Report partial results\n  - Note the warning message\n\n---\n\n## STEP 3: GENERATE COMPLETION REPORT\n\n```json\n{\n  \"totalRows\": <number>,\n  \"processed\": <number>,\n  \"sent\": <number>,\n  \"inRequests\": <number>,\n  \"skippedRestricted\": <number>,\n  \"skippedOverLimit\": <number>,\n  \"failed\": <number>,\n  \"stoppedEarly\": false,\n  \"stopReason\": \"\",\n  \"results\": [\n    {\n      \"rowIndex\": <number>,\n      \"profileUrl\": \"\",\n      \"recipientUsername\": \"\",\n      \"followerCount\": <number>,\n      \"accountType\": \"personal|creator|business\",\n      \"dmAccessible\": true|false,\n      \"messageSource\": \"sheet|generated\",\n      \"messagePreview\": \"<first 100 chars>\",\n      \"characterCount\": <number>,\n      \"withinLimit\": true|false,\n      \"deliveryStatus\": \"sent|in_requests|restricted|failed\",\n      \"error\": \"\"\n    }\n  ],\n  \"warnings\": []\n}\n```\n\n---\n\n## ADAPTIVE UI HANDLING\n\n**DO NOT assume specific button locations or text.**\n- DM button may be icon, text, or in menu\n- Message composer varies by account type\n- Delivery confirmation appears differently\n- Handle any prompts or modals that appear\n\n## INSTAGRAM-SPECIFIC CONSIDERATIONS\n\n- Messages to non-followers go to \"Requests\"\n- Creator/Business accounts may have different DM flows\n- Some accounts have DM filtering enabled\n- Too many DMs too fast = action block (can last hours to days)\n- Being promotional = lower response rates",
  "urls": [],
  "meta": {
    "createdAt": "",
    "userAgent": ""
  },
  "execution": {
    "mode": "device",
    "deviceIds": []
  }
}

MORE STARTING POINTS

Other templates for run from a spreadsheet.

See all templates
RUN FROM A SPREADSHEETSend LinkedIn messages from a spreadsheet

Use a Google Sheet to send a tailored LinkedIn message to each profile.

RUN FROM A SPREADSHEETSend X messages from a spreadsheet

Use a Google Sheet to send a tailored X message to each account.

RUN FROM A SPREADSHEETSend LinkedIn requests from a spreadsheet

Use a Google Sheet to send a LinkedIn request and note to each profile.