🔓 Unlock all 10,000+ workflows & prompts free Join Newsletter →
✅ Full access unlocked — explore all 10,000 AI workflow and prompt templates Browse Templates →
Home n8n Workflow
January 22, 2026

Shopify + Google Sheets: blog posts published clean

Lisa Granqvist Partner Workflow Automation Expert

Your product catalog changes, inventory shifts, promos come and go. But your blog? It’s usually the thing that falls behind because creating posts means copy-pasting product details, chasing approvals, and trying not to publish the same idea twice.

This is the kind of mess Shopify store owners feel first. Marketing managers trying to grow organic traffic get stuck in the same loop. And agencies managing multiple stores? They live here. This Shopify blog automation turns product data into trackable drafts and published posts without the constant busywork.

Below, you’ll see exactly how the workflow runs in n8n, what outcomes to expect, and what you need to set it up so it stays clean as you scale.

How This Automation Works

The full n8n workflow, from trigger to final output:

n8n Workflow Template: Shopify + Google Sheets: blog posts published clean

The Problem: Blog publishing gets messy at scale

Writing “just one more product post” sounds simple until you do it every week for a catalog of 50, 200, or 1,000 products. You pull titles and descriptions from Shopify, grab images, rewrite everything into a blog format, then try to keep it SEO-friendly and on-brand. Meanwhile, you still need a way to track what’s already been drafted or published. Miss that part and you’ll create duplicates, overwrite a draft, or publish something half-finished. Honestly, the mental load is the worst part.

The friction compounds. Here’s where it breaks down.

  • Copying product info into a doc or CMS takes about 20 minutes per post, and it’s easy to miss key specs or benefits.
  • Without a single tracking sheet, teams lose track of what’s “drafted,” “needs review,” or already published.
  • Duplicate prevention becomes a manual ritual, so it gets skipped when you’re busy.
  • Even when the writing is done, turning it into clean HTML for Shopify blog publishing is another tedious step.

The Solution: Generate Shopify blog drafts from product data (then publish)

This n8n workflow starts by pulling your Shopify product catalog, then logging those products into Google Sheets so you have a simple, visible queue. From there, it normalizes the product payload (so fields are consistent), checks the sheet to find unused entries, and processes one product at a time to keep the output predictable. Then Google Gemini generates an SEO-friendly blog draft in structured HTML based on the product’s details. Before anything is published, the workflow sanitizes the HTML so Shopify’s API accepts it cleanly. Finally, it posts the article to Shopify and updates your Google Sheet with the publish status, so you always know what happened.

The workflow begins when you manually launch it (or schedule it later). It pulls products from Shopify, runs a duplicate check in Google Sheets, and sends a single product’s data through Gemini for a draft. After a quick HTML cleanup, the post is published (or drafted) in Shopify and logged back to the sheet.

What You Get: Automation vs. Results

Example: What This Looks Like

Say you want to publish 10 product-based blog posts each week. Manually, if each post takes about 20 minutes to pull product info, 40 minutes to write, and 10 minutes to format and publish, that’s roughly 70 minutes per post (close to 12 hours weekly). With this workflow, you spend about 10 minutes setting the rules once and then hit run. Gemini drafts the posts, n8n logs everything in Google Sheets, and Shopify publishing happens automatically, so your weekly effort becomes review time instead of production time.

What You’ll Need

  • n8n instance (try n8n Cloud free)
  • Self-hosting option if you prefer (Hostinger works well)
  • Shopify for product data and blog publishing
  • Google Sheets to track drafts and prevent duplicates
  • Google Gemini API key (get it from Google AI Studio)

Skill level: Intermediate. You’ll connect accounts, paste API credentials, and make small edits to prompts and field mappings.

Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).

How It Works

You launch the run. The workflow starts from a manual trigger, which is perfect for testing. Once you like the output, you can swap in a schedule so it runs daily or weekly.

Product data is pulled and organized. n8n fetches your Shopify catalog, logs products into Google Sheets, and normalizes fields so the AI prompt gets consistent inputs. Clean inputs matter more than people think.

Duplicates are blocked before they happen. An “unused entries” check routes only fresh rows into the generator, then a limit control processes one item at a time. That keeps drafts from colliding and makes troubleshooting much easier.

Gemini drafts, then Shopify receives. The agent node sends product context to Gemini, parses structured output, sanitizes the HTML for API compatibility, and posts the finished article via HTTP request. Google Sheets is updated again with the publish status so your team can review, spot errors, or re-run safely.

You can easily modify the prompt and the “publish vs draft” behavior based on your needs. See the full implementation guide below for customization options.

Step-by-Step Implementation Guide

Step 1: Configure the Manual Trigger

This workflow starts manually so you can run it on demand while you validate your Shopify and Google Sheets setup.

  1. Add the Manual Launch Trigger node as the trigger for the workflow.
  2. Flowpast Branding as a visual reference note; it does not affect execution.

Step 2: Connect Shopify and Google Sheets Data Sources

Pull your Shopify product catalog and log it into Google Sheets. Multiple Google Sheets nodes are used for input, refined data, drafts, and status updates.

  1. Configure Fetch Product Catalog with Resource set to product, Operation set to getAll, Return All enabled, and Authentication set to accessToken.
    Credential Required: Connect your shopifyAccessTokenApi credentials.
  2. Set up Log Products to Sheet with Operation set to appendOrUpdate, Document set to [YOUR_ID], and Sheet set to gid=0 (row_data).
  3. Map columns in Log Products to Sheet using expressions: title to {{ $('Fetch Product Catalog').item.json.title }}, Images to {{ $('Fetch Product Catalog').item.json.images }}, handle to {{ $('Fetch Product Catalog').item.json.handle }}, product_id to {{ $('Fetch Product Catalog').item.json.id }}, and description to {{ $('Fetch Product Catalog').item.json.body_html }}.
    Credential Required: Connect your googleSheetsOAuth2Api credentials.
  4. Configure the remaining Google Sheets nodes (Write Refined Sheet, Mark Input Used, Append Blog Drafts, Update Publish Status) with the same Google Sheets document [YOUR_ID] and their respective sheet IDs (25757113 and 1548183235).
    Credential Required: Connect your googleSheetsOAuth2Api credentials to all Google Sheets nodes.

Tip: Use a single Google Sheets OAuth credential across all five Google Sheets nodes to simplify maintenance and avoid token conflicts.

Step 3: Normalize Product Data and Filter Unused Entries

This stage converts raw Shopify data into structured fields, stores refined data, and selects one unused entry for drafting.

  1. In Normalize Product Payload, keep the provided JavaScript to generate cleanDescription, normalize images, and build the refined payload.
  2. Configure Write Refined Sheet with Operation set to appendOrUpdate and column mappings: title to {{ $json.title }}, handle to {{ $json.handle }}, Image_1 to {{ $json.imageSources[0] }}, Image_2 to {{ $json.imageSources[1] }}, Image_3 to {{ $json.imageSources[2] }}, Image_4 to {{ $json.imageSources[3] }}, blog_id to [YOUR_ID], product_id to {{ $json.product_id }}, blog_status to unused, and description to {{ $json.cleanDescription }}.
  3. Set Check Unused Entries to allow items where blog_status equals unused or is empty using expressions {{ $json.blog_status }} with Right Value unused and .
  4. Leave Limit to Single Item as-is to process only one product per run.
  5. Route the false path of Check Unused Entries to No Action Path to safely exit if there are no unused entries.

⚠️ Common Pitfall: If Write Refined Sheet uses the wrong sheet ID, the Check Unused Entries condition will never match and no drafts will be generated.

Step 4: Set Up the AI Draft Composer

The AI pipeline generates structured blog drafts using Gemini and a strict output parser.

  1. In AI Draft Composer, set Text to =Input fields provided: \n- Title: {{ $json.title }}\n- Description: {{ $json.description }} and leave Prompt Type as define with Has Output Parser enabled.
  2. Connect Gemini Model Bridge as the AI language model for AI Draft Composer.
    Credential Required: Connect your googlePalmApi credentials.
  3. Attach Structured Output Parser to AI Draft Composer and keep Auto Fix enabled with the JSON schema example provided.
    Credential Required: Credentials for parsers should be added to the parent model—ensure Gemini Parser Model has googlePalmApi credentials.
  4. Connect Gemini Parser Model as the language model for Structured Output Parser.
    Credential Required: Connect your googlePalmApi credentials.

Tip: Keep the JSON-only response requirement in AI Draft Composer unchanged to ensure the parser can reliably extract blog_title, content, and metadata.

Step 5: Configure Draft Logging and Publishing

After AI drafting, the workflow logs drafts, sanitizes HTML, publishes to Shopify, and updates status in Google Sheets.

  1. AI Draft Composer outputs to both Mark Input Used and Append Blog Drafts in parallel.
  2. In Mark Input Used, set product_id to {{ $('Limit to Single Item').item.json.product_id }} and blog_status to used.
    Credential Required: Connect your googleSheetsOAuth2Api credentials.
  3. In Append Blog Drafts, set content to {{ $json.output.content }}, excerpt to {{ $json.output.excerpt }}, blog_title to {{ $json.output.blog_title }}, page_title to {{ $json.output.page_title }}, product_id to {{ $('Limit to Single Item').item.json.product_id }}, URL _handle to {{ $('Limit to Single Item').item.json.handle }}, blog_status to generated, and meta_description to {{ $json.output.meta_description }}.
    Credential Required: Connect your googleSheetsOAuth2Api credentials.
  4. Keep Sanitize Blog HTML as-is to escape HTML for Shopify JSON compatibility.
  5. Configure Publish Blog Article with URL set to https://[YOUR_SHOP].myshopify.com/admin/api/2025-07/blogs/[YOUR_ID]/articles.json, Method set to POST, and JSON Body set to ={ "article": { "title": "{{ $json.blog_title }}", "author": "[YOUR_NAME]", "tags": "Electronics", "body_html": "{{ $json.body_html }}", "published_at": "{{$now}}" } }.
    Credential Required: Connect your shopifyAccessTokenApi credentials.
  6. In Update Publish Status, set article_id to {{ $json.article.id }}, product_id to {{ $('Append Blog Drafts').item.json.product_id }}, and blog_status to posted.
    Credential Required: Connect your googleSheetsOAuth2Api credentials.
  7. Allow Update Publish Status to complete at No Action End for a clean termination path.

⚠️ Common Pitfall: If you forget to replace [YOUR_SHOP], [YOUR_ID], or [YOUR_NAME] in Publish Blog Article, Shopify will reject the request.

Step 6: Test and Activate Your Workflow

Run a manual test to verify the full end-to-end flow before enabling in production.

  1. Click Execute Workflow to trigger Manual Launch Trigger and monitor each node’s output.
  2. Confirm new rows appear in the sheets updated by Log Products to Sheet, Write Refined Sheet, Append Blog Drafts, and Update Publish Status.
  3. Verify that Publish Blog Article returns an article.id and the Shopify blog post appears as expected.
  4. If no unused items are found, confirm the workflow safely exits via No Action Path.
  5. Once successful, save the workflow and activate it for scheduled or manual production runs.
🔒

Unlock Full Step-by-Step Guide

Get the complete implementation guide + downloadable template

Common Gotchas

  • Shopify credentials can expire or need specific permissions. If things break, check your Shopify private app/custom app access token scopes first (and confirm the blog/article endpoints are allowed).
  • 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

How long does it take to set up this Shopify blog automation automation?

About 45 minutes if your Shopify, Sheets, and Gemini access are ready.

Do I need coding skills to automate Shopify blog automation?

No coding is required for the basic setup. You’ll mostly map fields, connect credentials, and adjust the Gemini prompt to match your store.

Is n8n free to use for this Shopify blog automation workflow?

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 Gemini API usage costs, which depend on your model and how long your articles are.

Where can I host n8n to run this automation?

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.

Can I customize this Shopify blog automation workflow for draft-only publishing?

Yes, but you’ll want to do it intentionally. Keep the same Shopify fetch and Google Sheets tracking, then adjust the “Publish Blog Article” HTTP request to create drafts (or route to a “needs review” path) instead of publishing immediately. Common customizations include changing the prompt structure, adding internal links between related products, and generating multi-language versions for specific collections.

Why is my Shopify connection failing in this workflow?

Usually it’s an access token scope issue or an expired token. Regenerate your Shopify access token, confirm it can read products and write blog articles, then update the credential in n8n. If it fails only sometimes, you may also be hitting Shopify API throttling, especially when you pull a large catalog and run drafts back-to-back.

How many posts can this Shopify blog automation automation handle?

A lot.

Is this Shopify blog automation automation better than using Zapier or Make?

For AI-driven blog pipelines like this, n8n is usually the more comfortable fit because you can branch, loop one product at a time, and sanitize HTML before publishing without paying extra for “premium” logic steps. You also get the option to self-host, which matters when you’re generating lots of drafts across a big catalog. Zapier or Make can still work, but the moment you need structured parsing, conditional duplicate checks, and a publish-status feedback loop, the scenario tends to sprawl. If you want simple “new row in sheet → create draft” and nothing else, they may be faster to set up. If you’re unsure, Talk to an automation expert and get a straight recommendation.

Once this is running, your blog stops being a “someday” project. It becomes a system that quietly ships content while you focus on merchandising, offers, and growth.

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.

Lisa Granqvist

Workflow Automation Expert

Expert in workflow automation and no-code tools.

×

Use template

Get instant access to this n8n workflow Json file

💬
Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Launch login modal Launch register modal