Google Sheets to Instagram, carousels post themselves
Your Instagram carousel process probably looks “organized” on the surface. Then posting day hits. Someone can’t find the right folder, the caption is in the wrong doc, an image is missing, and you’re re-uploading everything like it’s 2016.
This is where a Sheets Instagram carousel automation pays off fast. Social media managers feel it first, honestly, but marketers running campaigns and small teams handling content in-between client work get dragged into the same chaos.
This workflow turns a Google Sheet into your carousel publishing queue. You’ll see how it pulls assets from Google Drive, uploads them to Cloudinary, then publishes the carousel through the Instagram Graph API and marks the row as done.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets to Instagram, carousels post themselves
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:cog", form: "rounded", label: "Get image list from a Google..", pos: "b", h: 48 }
n1@{ icon: "mdi:database", form: "rounded", label: "Get Execution for Carousel", pos: "b", h: 48 }
n2@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n3["<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/>Upload images to Cloudinary"]
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Setup for Instagram (access ..", pos: "b", h: 48 }
n5["<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/>Download Image from Google D.."]
n6["<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 Media Container (Image)"]
n7@{ icon: "mdi:cog", form: "rounded", label: "Combine Instagram media cont..", pos: "b", h: 48 }
n8["<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 Media Container (Caro.."]
n9["<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/>Publish Instagram Carousel"]
n10@{ icon: "mdi:database", form: "rounded", label: "Update Execute to 'Processed'", pos: "b", h: 48 }
n2 --> n1
n1 --> n0
n9 --> n10
n3 --> n4
n6 --> n7
n8 --> n9
n7 --> n8
n0 --> n5
n5 --> n3
n4 --> n6
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 n2 trigger
class n1,n10 database
class n3,n5,n6,n8,n9 api
classDef customIcon fill:none,stroke:none
class n3,n5,n6,n8,n9 customIcon
The Problem: Carousel scheduling breaks when it’s manual
Manual carousel publishing is deceptively expensive. It’s not just the “upload images + paste caption” part. It’s the scavenger hunt across Drive folders, the double-checking that slide order is correct, the last-minute resize, and the nervous feeling that you’ll hit Publish with the wrong assets. When you’re running multiple campaigns, the mistakes multiply. One missed slide can tank a product walkthrough, and one wrong caption can create a support mess you didn’t need.
The friction compounds. A little delay here, a small correction there, and suddenly posting feels like a task you have to clear your schedule for.
- You end up spending about 30 minutes per carousel just collecting assets and confirming the order.
- Teams forget to update the “status” somewhere, so posts get duplicated or skipped.
- When captions live in one place and images in another, someone always publishes the wrong version.
- Scaling to multiple accounts becomes a spreadsheet of spreadsheets, not a system.
The Solution: Schedule in Google Sheets, publish to Instagram automatically
This n8n workflow watches your content queue for you. Every 5 minutes, it checks a Google Sheet for carousel posts marked “ToDo.” When it finds one, it grabs the images from a Google Drive folder you’ve specified, fetches each image file, and sends the assets to Cloudinary so they’re hosted in a way Instagram can reliably ingest. Then it uses the Instagram Graph API to create individual media items, aggregates their IDs, builds a carousel container, and publishes the post with your caption. Finally, it updates the original Google Sheet row so the same post doesn’t run again.
In plain terms: Google Sheets becomes your planner, Google Drive stays your asset library, and n8n does the uploading and publishing. You keep control of what gets posted, but you lose the repetitive busywork.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you publish 5 carousels a week. Manually, you might spend about 30 minutes per post between finding the Drive folder, uploading slides, re-checking order, and pasting captions, so that’s roughly 2.5 hours weekly. With this workflow, the “work” becomes updating one Google Sheet row and dropping images into a Drive folder, maybe 5 minutes per post. n8n handles the rest in the background on its next 5-minute check, which means you win back about 2 hours most weeks.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for your carousel queue and status.
- Google Drive to store carousel images per post.
- Cloudinary API credentials (get them from your Cloudinary dashboard).
- Instagram Graph API access_token + ig_business_id (get them from Meta developer tools for your business account).
Skill level: Intermediate. You’ll be connecting accounts, pasting API credentials, and mapping a few fields in n8n.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A scheduled check runs automatically. The workflow starts on a schedule trigger (every 5 minutes by default) so you don’t need to click anything or “run” it manually.
Your Google Sheet acts like a publishing queue. n8n pulls rows from Google Sheets and looks for carousel posts marked “ToDo.” If nothing is ready, nothing gets published. Simple.
Assets are fetched from Google Drive and prepared for Instagram. It lists the images in your Drive folder, fetches each file, uploads to Cloudinary, then generates Instagram media items via HTTP requests to the Graph API. Those media IDs get aggregated so Instagram can treat them as one carousel.
The carousel publishes and the queue updates itself. n8n creates the carousel container, publishes the post with your caption, and then marks the row in Google Sheets as processed so it won’t repeat.
You can easily modify the schedule interval to match your posting rhythm based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
This workflow runs on a timed schedule and starts by checking a Google Sheet for queued carousel posts.
- Add and open Scheduled Run Trigger.
- Set Rule → Interval → Field to
minutes. - Connect Scheduled Run Trigger to Retrieve Carousel Queue.
Step 2: Connect Google Sheets
These nodes read and update the carousel queue in Google Sheets.
- Open Retrieve Carousel Queue and set Document to
[YOUR_ID]and Sheet to[YOUR_ID]. - In Retrieve Carousel Queue, confirm filters are set to
Status = ToDoandType = Carousel. - Credential Required: Connect your googleSheetsOAuth2Api credentials to Retrieve Carousel Queue.
- Open Mark Execution Processed and verify Operation is
updatewith Status set toProcessedand ExecuteId set to{{ $('Retrieve Carousel Queue').item.json.ExecuteId }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials to Mark Execution Processed.
Step 3: Connect Google Drive and Fetch Image Files
This stage reads the target folder from the queue and downloads each image for upload.
- Open List Drive Images and set Filter → Folder ID to
{{ $('Retrieve Carousel Queue').item.json.Folder }}. - Ensure Return All is enabled and Fields include
id,name,thumbnailLink, andwebViewLink. - Credential Required: Connect your googleDriveOAuth2Api credentials to List Drive Images.
- Open Fetch Drive Image File and set URL to
=https://drive.google.com/uc?export=download&id={{ $json.id }}with Response Format set tofile.
Step 4: Configure Image Upload and Instagram Media Creation
This workflow uses multiple HTTP requests to upload images, prepare credentials, and create Instagram media items.
- Open Send Images to Cloudinary and set URL to
https://api.cloudinary.com/v1_1/[YOUR_ID]/image/upload. - In Send Images to Cloudinary, keep Method as
POST, Content Type asmultipart-form-data, and confirm the body parameters includefile(binary) andupload_presetset to[YOUR_ID]. - Open Prepare Instagram Credentials and set access_token to
[CONFIGURE_YOUR_TOKEN]and ig_user_id to[YOUR_ID]. - In Prepare Instagram Credentials, set image_url to
{{ $json.url }}and caption to{{ $('Retrieve Carousel Queue').item.json['Expected content'] }}. - Open Generate IG Media Item and set URL to
=https://graph.instagram.com/v23.0/{{ $json.ig_user_id }}/mediawith MethodPOSTand Content Typeform-urlencoded. - In Generate IG Media Item, set body parameters
image_url,caption, andaccess_tokento{{ $json.image_url }},{{ $json.caption }}, and{{ $json.access_token }}respectively.
[CONFIGURE_YOUR_TOKEN] and [YOUR_ID] with valid Instagram Graph API credentials.Step 5: Build and Publish the Carousel
This stage aggregates image IDs, creates the carousel container, and publishes the post.
- Open Aggregate IG Media IDs and confirm Fields to Aggregate contains
body.idwith Merge Lists enabled. - Open Build Carousel Container and set URL to
=https://graph.instagram.com/v23.0/{{ $('Prepare Instagram Credentials').first().json.ig_user_id }}/media. - In Build Carousel Container, set body parameters: caption to
{{ $('Retrieve Carousel Queue').item.json['Expected content'] }}, media_type to=CAROUSEL, children to{{ $json.id }}, and access_token to{{ $('Prepare Instagram Credentials').first().json.access_token }}. - Open Publish Carousel Post and set URL to
=https://graph.instagram.com/v23.0/{{ $('Prepare Instagram Credentials').first().json.ig_user_id }}/media_publish. - In Publish Carousel Post, set body parameters creation_id to
{{ $json.body.id }}and access_token to{{ $('Prepare Instagram Credentials').first().json.access_token }}. - Connect Publish Carousel Post to Mark Execution Processed to update the queue.
Step 6: Test and Activate Your Workflow
Verify each stage works end-to-end before enabling scheduled runs.
- Click Execute Workflow to run a manual test starting at Scheduled Run Trigger.
- Confirm Retrieve Carousel Queue returns at least one row with
Status = ToDoandType = Carousel. - Check that Send Images to Cloudinary returns image URLs and Generate IG Media Item outputs a
body.id. - Verify Publish Carousel Post returns a successful response and Mark Execution Processed updates Status to
Processed. - Toggle the workflow to Active to enable scheduled publishing.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check the n8n Credentials section and confirm the connected Google account still has access to the sheet.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Cloudinary and Instagram Graph API calls can fail silently when a preset, folder setting, or token scope is wrong. If publishing stops, check your HTTP Request node responses and confirm your access_token still has the right permissions.
Frequently Asked Questions
About 45 minutes if you already have API access.
No. You will connect accounts, paste credentials, and map a few fields in n8n.
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 Cloudinary usage and any Meta API-related costs for your setup.
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, and it’s a common tweak. Update the filter logic right after “Retrieve Carousel Queue” so it looks for your preferred status values, then adjust “Mark Execution Processed” to write back whatever state you want (like “Posted” plus a timestamp). Some teams also add extra columns for campaign name, designer, or client approval link. If you’re managing multiple accounts, you can add an “Account” column and route to different credentials before the Graph API calls.
Usually it’s expired Google authentication or the connected account lost access to the sheet. Reconnect the Google Sheets credential in n8n, then open the sheet and confirm the same Google user can view and edit it. If it still fails, check the sheet ID and worksheet/tab name you mapped in the node, because a renamed tab breaks lookups more often than people expect.
In practice, it can handle dozens of queued posts a day as long as your API limits and server resources are fine.
Often, yes, because carousel publishing via the Instagram Graph API is more than a simple two-step trigger and action. n8n makes it easier to handle loops (multiple images), aggregation (collecting media IDs), and conditional logic without paying extra for every branch. It also gives you the self-hosting option, which can be a big deal once you start publishing frequently. Zapier or Make can still be fine for lightweight scheduling, but carousels tend to get fiddly. Talk to an automation expert if you want a quick recommendation based on your volume.
Once this is running, your Google Sheet becomes the calm center of your publishing process. The workflow handles the repetitive parts, so your attention stays on the content itself.
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.