Bluesky + Google Sheets: welcome DMs, tracked
You gain a few new Bluesky followers, you mean to send a quick welcome DM… and then the day happens. Later you can’t remember who you messaged, who you missed, or if you accidentally double-sent.
This hits marketers who are trying to build relationships early. A solo founder feels it too, because every DM is “sales” in disguise. And community folks end up stuck in the same loop. This Bluesky DM tracking automation keeps you consistent without turning your mornings into admin work.
You’ll see how the workflow checks for new followers hourly, sends a welcome message to only the new ones, and logs each send so you always know what happened.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Bluesky + Google Sheets: welcome DMs, tracked
flowchart LR
subgraph sg0["Each 60 minutes 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/httprequest.dark.svg' width='40' height='40' /></div><br/>Create Session"]
n1["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>List followers"]
n2@{ icon: "mdi:cog", form: "rounded", label: "Convert to File", pos: "b", h: 48 }
n3@{ icon: "mdi:cog", form: "rounded", label: "Extract from File", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n6@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>Find new followers"]
n8@{ icon: "mdi:cog", form: "rounded", label: "Read followers from file", pos: "b", h: 48 }
n9@{ icon: "mdi:cog", form: "rounded", label: "Save followers to file", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Define welcome message", pos: "b", h: 48 }
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Send message"]
n12["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>Get conversation ID"]
n13@{ icon: "mdi:play-circle", form: "rounded", label: "Each 60 minutes", pos: "b", h: 48 }
n14@{ icon: "mdi:cog", form: "rounded", label: "No Operation, do nothing", pos: "b", h: 48 }
n6 --> n2
n4 --> n5
n11 --> n5
n0 --> n1
n1 --> n8
n1 --> n6
n2 --> n9
n13 --> n0
n5 --> n10
n3 --> n7
n7 --> n4
n12 --> n11
n10 --> n12
n9 --> n14
n8 --> 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 n13 trigger
class n0,n1,n11,n12 api
class n7 code
classDef customIcon fill:none,stroke:none
class n0,n1,n7,n11,n12 customIcon
The Problem: Welcome DMs Don’t Scale Manually
Sending welcome DMs sounds simple until you try to do it every day. Bluesky doesn’t politely line up new followers for you with a “processed” checkmark, so you end up bouncing between your follower list, your messages, and whatever notes you keep (if you keep notes). Miss a day and you’re suddenly backscrolling through names, second-guessing yourself. Double-message a few people and it starts to feel spammy. Skip it entirely and you lose the easiest “first touch” moment you get.
The friction compounds, especially once you’re growing.
- You spend about 10 minutes just figuring out who is actually new.
- It’s easy to DM the same person twice when your follower list changes quickly.
- Manual outreach gets inconsistent, which means your “welcome” becomes a random event instead of a dependable system.
- There’s no clean record for later, so you can’t tell what message was sent or when.
The Solution: Auto-send Bluesky Welcome DMs and Track Them
This n8n workflow runs on a schedule (every 60 minutes), checks your Bluesky account for followers, compares that list to what it has already seen, and identifies only the new people. For each new follower, it composes your welcome message, opens or finds the correct DM conversation, and sends the message automatically. Then it updates its saved follower list so the same person won’t trigger again next hour. In practice, you get a steady stream of “always-on” introductions without living inside your inbox.
The workflow starts with an hourly trigger and creates a Bluesky session (using your app password). It pulls the latest followers, loads your previously saved follower list, and flags the difference. Finally, it batches through new followers, sends DMs, waits briefly to stay polite to the API, then writes the updated list back to storage.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you average 10 new followers a day. Manually, you might spend about 2 minutes per person to confirm they’re new, open a DM, paste a message, and then track it somewhere, which comes out to roughly 20 minutes daily. With this workflow, the “work” is basically zero: it checks every 60 minutes, messages only the new followers, and updates the stored list automatically. You get your time back, and the welcome habit stops depending on your memory.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Bluesky for follower checks and private messages.
- Google Sheets to log each DM send and timestamp.
- Bluesky app password (create it in Bluesky settings with DM access).
Skill level: Beginner. You’ll add credentials, paste a message, and run one setup node once to create the initial follower list.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Hourly check-in. A schedule trigger runs every 60 minutes and starts a new session with Bluesky via HTTP Request.
Follower comparison. The workflow retrieves your current followers, then reads a saved file that contains the follower list from the last successful run. A small code step detects who’s new.
DM sending in batches. New followers are split out and processed in batches. For each person, n8n sets the welcome message text, fetches the conversation ID, then dispatches the DM. There’s also a brief wait to reduce the chance of rate-limit headaches.
Tracking and “no duplicates.” After messaging, the workflow serializes the updated follower list and writes it back to the file, so the next hourly run has a clean baseline. If you’re also curious about alternate tracking backends, the approach is similar to Bluesky + Baserow: welcome DMs, no duplicates, just stored differently.
You can easily modify the message text to match your tone (or add multiple variants) based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
Set the workflow to run on an hourly cadence using the built-in schedule trigger.
- Add and open Hourly Schedule Trigger.
- Set the interval rule to Minutes with
60in the minutesInterval field. - Connect Hourly Schedule Trigger to Initiate Session.
Step 2: Connect Bluesky Session and Follower Retrieval
Authenticate against Bluesky and pull the latest followers list.
- Open Initiate Session and set URL to
https://bsky.social/xrpc/com.atproto.server.createSession. - Set Method to
POSTand enable Send Body. - In Body Parameters, set identifier to
[YOUR_ID]and password to[CONFIGURE_YOUR_TOKEN]. - Open Retrieve Followers and set URL to
https://bsky.social/xrpc/app.bsky.graph.getFollowers. - Enable Send Query and set actor to
{{ $json.did }}, limit to100. - Enable Send Headers and set Authorization to
Bearer {{ $item("0").$node["Initiate Session"].json["accessJwt"] }}. - Configure pagination cursor to
{{ $response.body.cursor }}with a request interval of250and max requests2.
Step 3: Load Stored Followers and Detect New Ones
Read the stored follower file, parse it, and compare against the latest followers to find new DIDs.
- In Read Followers File, set File Selector to
=followers-{{ $('Initiate Session').item.json.handle }}.json. - Connect Read Followers File to Load From File and set Operation to
fromJson. - Open Detect New Followers and keep the provided JavaScript that compares
Retrieve FollowersandLoad From Filedata. - Verify Detect New Followers outputs newDids and count for downstream processing.
followers array to prevent parse errors.Step 4: Configure Batching and Welcome Message Composition
Split new follower IDs into individual records, batch them, and prepare the welcome message content.
- In Distribute Records, set Field to Split Out to
newDidsand keep destinationFieldName asdid. - Connect Distribute Records to Batch Through Items to throttle output.
- Open Compose Welcome Note and set text to
Hello, thanks for your follow. You can read more about my over my site:. - Set link to
https://example.comin Compose Welcome Note.
Step 5: Send Welcome Messages via Chat API
Fetch a conversation ID for each new follower, then send a formatted message with a link.
- Open Fetch Conversation ID and set URL to
{{ $item("0").$node["Initiate Session"].json.didDoc.service[0].serviceEndpoint }}/xrpc/chat.bsky.convo.getConvoForMembers. - Set members query parameter to
{{ $('Distribute Records').item.json.did }}and add headers Authorization and Atproto-Proxy. - Open Dispatch Message and set URL to
{{ $item("0").$node["Initiate Session"].json.didDoc.service[0].serviceEndpoint }}/xrpc/chat.bsky.convo.sendMessage. - Keep Method as
POSTand Specify Body asjson. - Use the provided jsonBody expression to build the message with
{{ $('Compose Welcome Note').item.json.text }}and{{ $('Compose Welcome Note').item.json.link }}. - Ensure headers include Authorization and Atproto-Proxy as configured.
Step 6: Persist Followers File and Handle Parallel Execution
Save the latest followers list to file while also pacing execution through a wait step.
- Retrieve Followers outputs to both Read Followers File and Pause Execution in parallel.
- Open Pause Execution to control flow timing, then connect it to Serialize to File.
- In Serialize to File, set Operation to
toJsonand keep the file name option if needed. - In Write Followers File, set Operation to
writeand File Name to=followers-{{ $('Initiate Session').item.json.handle }}.json. - Keep No-Op Placeholder connected for future expansion or debugging.
Step 7: Test and Activate Your Workflow
Validate the end-to-end flow and then enable the schedule for production runs.
- Click Execute Workflow to run a manual test starting from Hourly Schedule Trigger.
- Confirm Retrieve Followers returns follower data and Detect New Followers outputs a
newDidsarray. - Verify Fetch Conversation ID returns a convo ID and Dispatch Message completes successfully.
- Check that Write Followers File creates or updates the file named
followers-{{ $('Initiate Session').item.json.handle }}.json. - Turn on the workflow using the Active toggle to enable hourly automation.
Common Gotchas
- Bluesky credentials can expire or lack the right permissions. If messages stop sending, check the app password settings (and DM access) first.
- If you’re using Wait nodes or external delays, processing times vary. Bump up the wait duration if downstream HTTP calls fail because the conversation isn’t ready yet.
- Your default welcome text will feel generic fast. Update the “Compose Welcome Note” content early with your voice, or you’ll be rewriting messages by hand anyway.
Frequently Asked Questions
About 30 minutes if you already have your Bluesky app password ready.
No coding required. You’ll connect credentials, edit the welcome message text, and run the one-time “save followers” setup.
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 any hosting costs if you self-host.
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, but you’ll need a rule to classify followers. Common customizations include changing the “Compose Welcome Note” text based on keywords, adding an If node to route different messages, or adjusting the schedule frequency if you want faster replies.
Most of the time it’s the app password. Regenerate it with private message permissions, then update the credentials used by the HTTP Request nodes that initiate the session and send the DM. Also check Bluesky’s createSession rate limits if you increased the schedule too aggressively. Finally, confirm the workflow isn’t running multiple copies at once (for example, after importing and testing), because parallel runs can cause confusing authentication errors.
For most small accounts, it handles daily follower growth easily; the main constraint is Bluesky API rate limits rather than n8n.
Often, yes, because this pattern relies on saved state (the follower list) and a bit more control over batching, waits, and conditional logic. n8n makes that kind of workflow straightforward without turning every extra step into an extra paid task. Zapier or Make can still work if you keep it very simple, but you may end up fighting “duplicate prevention” or storage limitations. If you’re aiming for reliable tracking over time, n8n is usually the calmer option. Talk to an automation expert if you want help choosing.
Once this is running, welcome messages happen quietly in the background, and you stop worrying about duplicates. Set it up once, then spend your attention on real conversations.
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.