BlueSky to Google Sheets, metrics tracked for you
You post, you wait, and then you end up copying likes and replies into a spreadsheet by hand. It’s tedious. Worse, it’s easy to miss a day, grab the wrong numbers, or forget that one post that spiked late.
This hits social media managers hardest, but agency reporting leads and solo creators feel it too. With BlueSky metrics sync in place, your content calendar becomes a live performance dashboard without you babysitting it.
This workflow pulls engagement from BlueSky once per day, updates the right rows in Google Sheets, and avoids wasting API calls on old posts. Below, you’ll see exactly what it automates, the results you can expect, and what you’ll need to run it reliably.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: BlueSky to Google Sheets, metrics tracked for you
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n1@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet", pos: "b", h: 48 }
n2["<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 Post Stats"]
n3@{ icon: "mdi:database", form: "rounded", label: "Update row in sheet", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Configuration", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter1", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>BlueSky Auth"]
n6 --> n5
n7 --> n1
n4 --> n7
n2 --> n3
n5 --> n2
n0 --> n4
n1 --> n6
n3 --> n5
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 trigger
class n6 decision
class n1,n3 database
class n2,n7 api
classDef customIcon fill:none,stroke:none
class n2,n7 customIcon
The Problem: Manual BlueSky reporting never stays accurate
BlueSky numbers move after you post. Sometimes a lot. A thread might look “meh” at 10 a.m. and then pick up reposts overnight, which means yesterday’s report is already stale. When you track performance in Google Sheets (because clients want spreadsheets, or your team plans content there), manual updates become a recurring chore. You open BlueSky, find the post, copy likes, copy reposts, copy replies, paste them into the right row, then do it again for every post. One interruption and you paste into the wrong line. Now your trend analysis is off, and you’ll be second-guessing the data all month.
The friction compounds. Here’s where it breaks down.
- You end up spending about 5 minutes per post just to refresh three numbers, which adds up fast across a two-week posting cadence.
- Copy-paste reporting creates small mistakes that are annoying to catch and embarrassing to present.
- Viral spikes often happen late, so “end of day” reporting quietly undercounts your best posts.
- Older posts clutter the process, so you either waste time or you stop updating altogether.
The Solution: Daily BlueSky metrics syncing into your Google Sheet
This n8n workflow turns your Google Sheets content calendar into a self-updating analytics log. It runs on a daily schedule, logs into BlueSky via API, then pulls only the rows in your sheet that are marked as posted. From there, it filters down to a smart “active window”: posts from the last 14 days. That window is the sweet spot because it captures delayed engagement (and those surprise spikes) without wasting time on archived content that won’t change much. For each qualifying row, the workflow fetches the latest like, repost, and reply counts from BlueSky and writes them back into the correct columns. If a post was deleted or the link is invalid, it handles the error gracefully so the whole run doesn’t collapse.
The workflow starts with a timed trigger, then sets the key parameters and authenticates with BlueSky. Next, it retrieves posted rows from Google Sheets, filters to recent posts, and iterates through them in batches. Finally, it fetches metrics per post and updates the sheet, leaving you with numbers you can actually trust.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you publish 2 BlueSky posts per day and track them in Google Sheets for two weeks. That’s roughly 28 posts, and manual updating is usually about 5 minutes per post to open the link, copy three counts, and paste them cleanly (so about 2 hours total). With this workflow, the “work” is basically zero: it runs once daily at 9 a.m., spends a few minutes pulling and updating rows, and you just open the sheet when you need it. Your numbers stay fresh without blocking your morning.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for your content calendar and reporting.
- BlueSky account to pull post engagement metrics.
- BlueSky App Password (create it in your BlueSky account settings).
Skill level: Beginner. You’ll connect accounts, pick the right sheet, and paste credentials into the configuration node.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A daily schedule kicks it off. The workflow uses a timed trigger (for example, every morning) so your sheet is updated before you start reporting or planning.
It logs into BlueSky and loads your “posted” content list. n8n sets the parameters, creates a BlueSky session via HTTP request, then retrieves rows from Google Sheets that are marked as Posted.
Only recent posts get processed. A filter checks the “Posted At” date and keeps items from the last 14 days, then a batch iterator moves through each row without overwhelming the API.
Metrics are fetched and written back to your spreadsheet. For each post link, it requests the latest engagement counts, then updates Like Count, Repost Count, and Reply Count in the same row.
You can easily modify the 14-day “active window” to 7 days (for faster-moving accounts) or 30 days (for slower burn content) 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 a daily schedule so it can track analytics consistently.
- Add and open Timed Run Trigger.
- Set the schedule rule to trigger at hour
9(based on the node’s interval rule with triggerAtHour). - Connect Timed Run Trigger to Setup Parameters.
Step 2: Connect Google Sheets
Pull posted records from your sheet and prepare to update metrics in the same file.
- Open Retrieve Posted Rows and choose the correct Document and Sheet.
- Keep the filter so only rows with Status set to
Postedare retrieved. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Retrieve Posted Rows.
- Open Write Metrics to Sheet, select the same Document and Sheet, and keep Operation set to
update. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Write Metrics to Sheet.
Step 3: Set Up the Authentication and Parameters
Store BlueSky credentials and timezone, then create a session token for API calls.
- Open Setup Parameters and set bluesky_handle and app_password to your BlueSky account values.
- Set timezone to
Asia/Kolkataor your preferred zone. - Open BlueSky Session Login and confirm URL is
https://bsky.social/xrpc/com.atproto.server.createSession. - Ensure the JSON body is configured as
{ "identifier":"{{$('Setup Parameters').first().json.bluesky_handle}}", "password": "{{ $('Setup Parameters').first().json.app_password }}" }.
Step 4: Filter, Batch, and Fetch Post Metrics
Validate recent posts, process in batches, and request metrics from BlueSky.
- Open Validate Recent Posts and keep the conditions for non-empty Post Link and Posted At with the date window check.
- Verify the date filter expressions are set to
{{ DateTime.fromFormat($json['Posted At'], 'yyyy-MM-dd HH:mm', { zone: $('Setup Parameters').first().json.timezone }) }}and{{ $now.setZone($('Setup Parameters').first().json.timezone || 'UTC').minus({days: 14}) }}. - Keep Batch Iterate Records connected after Validate Recent Posts to process results in batches.
- Open Fetch Post Metrics and confirm URL is
https://bsky.social/xrpc/app.bsky.feed.getPosts. - Set the query parameter uris to
=at://{{ $('BlueSky Session Login').first().json.did }}/app.bsky.feed.post/{{ $('Batch Iterate Records').item.json["Post Link"].split("/post/")[1] }}. - Set the header Authorization to
=Bearer {{ $('BlueSky Session Login').first().json.accessJwt }}.
yyyy-MM-dd HH:mm, the filter may exclude all rows. Update the format or window if needed.Step 5: Configure Metrics Writeback
Map the returned metrics back into the Google Sheet row using the row number from each record.
- In Write Metrics to Sheet, map Like Count to
{{ $json?.posts[0]?.likeCount || 0 }}. - Map Reply Count to
{{ $json?.posts[0]?.replyCount || 0 }}and Repost Count to{{ $json?.posts[0]?.repostCount || 0 }}. - Map row_number to
{{ $('Batch Iterate Records').item.json.row_number }}and keep it as the matching column. - Ensure Write Metrics to Sheet is connected back to Batch Iterate Records to continue looping.
Step 6: Test and Activate Your Workflow
Run a manual test and confirm that metrics are written back to your sheet before enabling the schedule.
- Click Execute Workflow and watch each node run from Timed Run Trigger through Write Metrics to Sheet.
- Successful execution should update the Like Count, Reply Count, and Repost Count columns in your sheet for recent posts.
- If results are missing, check the output of Validate Recent Posts and Fetch Post Metrics for filtering or API errors.
- When everything looks correct, toggle the workflow to Active to run on schedule.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check the n8n credential connection status and the spreadsheet sharing settings 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 20–30 minutes if your sheet is ready.
No. You’ll connect Google Sheets, then paste your BlueSky handle and app password into the configuration node.
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 BlueSky API usage (typically negligible for a daily 14-day window).
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 may miss late spikes. The easiest change is the schedule trigger (switch it to weekly), and many teams also widen the “active window” filter from 14 days to about 30 days so posts still get a few refresh cycles. You can also adjust which rows get pulled by changing the Google Sheets query so only specific campaigns or tags are included.
Usually it’s an app password issue. Create a fresh BlueSky App Password, update it in the “Configuration” or setup node, then re-run the login request. If it still fails, check that the handle format matches what the workflow expects and that BlueSky isn’t rate-limiting you because of too many runs close together.
Dozens per day is fine for most accounts.
Often, yes. This workflow benefits from n8n’s control over filtering (the 14-day active window), batching, and error handling, which is where simpler tools can get brittle or expensive when you scale. Zapier and Make can work if you only track a handful of posts and don’t care about smart filtering. But if you want stability, fewer wasted calls, and the option to self-host, n8n is a strong fit. Honestly, the “best” tool depends on how many posts you track and how strict your reporting needs are. Talk to an automation expert if you’re not sure which fits.
Once this is running, your reporting sheet stops being a chore and starts being a live snapshot. Set it up once, then get on with the work that actually moves the needle.
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.