Auto-generate Instagram posts from Google Sheets reviews using UploadtoUrl
Turn your best 5-star reviews into a daily stream of branded social proof content -- fully automated. This workflow pulls the oldest unposted 5-star review from Google Sheets, generates a custom quote card using the h...
Template notes
Turn your best 5-star reviews into a daily stream of branded social proof content -- fully automated. This workflow pulls the oldest unposted 5-star review from Google Sheets, generates a custom quote card using the hcti.io HTML-to-image API, uploads it via Upload to URL to get a stable public CDN link, and publishes it directly to Instagram with a formatted caption. The source row is updated to prevent duplicate posts and the team is notified on Slack.
---
What This Workflow Does
Review Dispatch Automation - Schedule Trigger -- fires daily at 9 AM. Adjust the cron expression for any cadence (twice weekly, every other day, etc.) - Google Sheets -- Fetch Review -- reads the Reviews sheet filtering for Rating = 5 and Posted = FALSE, sorted by Submitted At ascending for FIFO queue dispatch. Fetches exactly one row per run. - IF -- Has Valid Review -- exits the workflow cleanly on the false branch if no unposted reviews remain. No errors, no failed executions.
Dynamic Quote Card Generation - Code -- Prepare Fields -- cleans the raw sheet row: truncates review text to card-safe length, formats the star rating as a count, builds the full Instagram caption with attribution line and hashtag block (max 2200 characters). - Set -- Assemble HTML Card -- constructs a 1080x1080px HTML/CSS quote card template using n8n expressions that reference prepared text fields and env var brand colors. HTML is built in a Set node rather than a Code node to avoid Web Application Firewall false positives on template submission. - HTTP -- hcti.io -- sends the HTML string to the hcti.io API (HTML/CSS to Image) which renders it as a PNG and returns an image URL. Free tier covers 100 renders per month.
CDN Bridge via Upload to URL - Upload to URL -- mandatory step. Instagram Graph API requires a direct public HTTPS image URL and rejects binary payloads and base64 strings. This node downloads the rendered PNG from hcti.io and re-uploads it to a CDN, returning a stable public URL Instagram can access. - Code -- Merge Fields -- combines the CDN URL from Upload to URL with the caption and review metadata from the earlier Code node using cross-node reference.
Instagram Two-Step Publish Flow - HTTP -- IG Create Media Container -- Step 1 of Instagram publishing. POSTs the CDN image URL and caption to /v19.0/{iguserid}/media. Returns a containerid that Instagram uses to stage and validate the image. - Wait 6s -- processing buffer to ensure Instagram completes async validation before the publish call. - HTTP -- IG Publish Container -- Step 2. Calls /mediapublish with the containerid. Returns the live Instagram Post ID confirming the post is on the feed.
Logging and Notification - Google Sheets -- Mark as Posted -- updates the source row: sets Posted = TRUE and writes back the Post ID and timestamp. Prevents the same review from being picked up on the next scheduled run. - Slack -- Notify Team -- sends reviewer name, a 100-character review snippet, the Post ID, and the CDN card URL so the team can verify what went live.