Massuppladdningar av produkter låter enkelt tills du sitter med en mapp full av bilder, ett halvifyllt kalkylark och en Shopify-import som fortsätter att misslyckas på grund av små formateringsdetaljer. Arbetet är repetitivt, men misstagen blir dyra.
Shopify-butiksägare märker det när nytt lager kommer in. E-handelsansvariga märker det vid säsongssläpp. Och byråteam fastnar i samma jobb för kund efter kund. Den här Shopify CSV-automatiseringen förvandlar råa produktbilder till en Shopify-klar CSV i Google Sheets, så att du kan granska, ladda upp och gå vidare.
Du får se hur arbetsflödet hämtar bilder från Google Drive, använder AI för att skapa produktdata, laddar upp tillgångar till Shopify och genererar en strukturerad import-CSV som teamet kan lita på.
Så här fungerar automatiseringen
Se hur den löser problemet:
n8n Workflow Template: Google Drive till Shopify: CSV klar i Sheets
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n12@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet", pos: "b", h: 48 }
n13@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger1", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items2", pos: "b", h: 48 }
n44@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch", pos: "b", h: 48 }
n45@{ icon: "mdi:brain", form: "rounded", label: "Gemini", pos: "b", h: 48 }
n46@{ icon: "mdi:memory", form: "rounded", label: "Memory", pos: "b", h: 48 }
n47@{ icon: "mdi:robot", form: "rounded", label: "Structured", pos: "b", h: 48 }
n48@{ icon: "mdi:robot", form: "rounded", label: "Bridal item", pos: "b", h: 48 }
n49@{ icon: "mdi:brain", form: "rounded", label: "Gemini 2.5flash", pos: "b", h: 48 }
n50["<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/>text to HTML"]
n51@{ icon: "mdi:database", form: "rounded", label: "update bridal data", pos: "b", h: 48 }
n52@{ icon: "mdi:brain", form: "rounded", label: "Gemini1", pos: "b", h: 48 }
n53@{ icon: "mdi:memory", form: "rounded", label: "Memory1", pos: "b", h: 48 }
n54@{ icon: "mdi:robot", form: "rounded", label: "Structured1", pos: "b", h: 48 }
n55@{ icon: "mdi:brain", form: "rounded", label: "Gemini 2.5flash1", pos: "b", h: 48 }
n56["<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/>text to HTML1"]
n57@{ icon: "mdi:robot", form: "rounded", label: "Chain item", pos: "b", h: 48 }
n58@{ icon: "mdi:database", form: "rounded", label: "update chain data", pos: "b", h: 48 }
n59@{ icon: "mdi:brain", form: "rounded", label: "Gemini2", pos: "b", h: 48 }
n60@{ icon: "mdi:memory", form: "rounded", label: "Memory2", pos: "b", h: 48 }
n61@{ icon: "mdi:robot", form: "rounded", label: "Structured2", pos: "b", h: 48 }
n62@{ icon: "mdi:brain", form: "rounded", label: "Gemini 2.5flash2", pos: "b", h: 48 }
n63["<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/>text to HTML2"]
n64@{ icon: "mdi:brain", form: "rounded", label: "Gemini3", pos: "b", h: 48 }
n65@{ icon: "mdi:memory", form: "rounded", label: "Memory3", pos: "b", h: 48 }
n66@{ icon: "mdi:robot", form: "rounded", label: "Structured3", pos: "b", h: 48 }
n67@{ icon: "mdi:brain", form: "rounded", label: "Gemini 2.5flash3", pos: "b", h: 48 }
n68["<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/>text to HTML3"]
n69@{ icon: "mdi:robot", form: "rounded", label: "Rakhi item", pos: "b", h: 48 }
n70@{ icon: "mdi:database", form: "rounded", label: "update Rakhi data", pos: "b", h: 48 }
n71@{ icon: "mdi:brain", form: "rounded", label: "Gemini5", pos: "b", h: 48 }
n72@{ icon: "mdi:memory", form: "rounded", label: "Memory5", pos: "b", h: 48 }
n73@{ icon: "mdi:robot", form: "rounded", label: "Structured5", pos: "b", h: 48 }
n74@{ icon: "mdi:brain", form: "rounded", label: "Gemini 2.5flash5", pos: "b", h: 48 }
n75["<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/>text to HTML5"]
n76@{ icon: "mdi:brain", form: "rounded", label: "Gemini6", pos: "b", h: 48 }
n77@{ icon: "mdi:memory", form: "rounded", label: "Memory6", pos: "b", h: 48 }
n78@{ icon: "mdi:robot", form: "rounded", label: "Structured6", pos: "b", h: 48 }
n79@{ icon: "mdi:brain", form: "rounded", label: "Gemini 2.5flash6", pos: "b", h: 48 }
n80["<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/>text to HTML6"]
n81@{ icon: "mdi:brain", form: "rounded", label: "Gemini7", pos: "b", h: 48 }
n82@{ icon: "mdi:memory", form: "rounded", label: "Memory7", pos: "b", h: 48 }
n83@{ icon: "mdi:robot", form: "rounded", label: "Structured7", pos: "b", h: 48 }
n84@{ icon: "mdi:brain", form: "rounded", label: "Gemini 2.5flash7", pos: "b", h: 48 }
n85["<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/>text to HTML7"]
n86@{ icon: "mdi:robot", form: "rounded", label: "Bindi item", pos: "b", h: 48 }
n87@{ icon: "mdi:database", form: "rounded", label: "update Bindi data", pos: "b", h: 48 }
n88@{ icon: "mdi:database", form: "rounded", label: "update Pandents data", pos: "b", h: 48 }
n89@{ icon: "mdi:robot", form: "rounded", label: "Pandents item", pos: "b", h: 48 }
n90@{ icon: "mdi:robot", form: "rounded", label: "Jewellery Accessories item", pos: "b", h: 48 }
n91@{ icon: "mdi:database", form: "rounded", label: "update Jewellery Accessories..", pos: "b", h: 48 }
n92@{ icon: "mdi:brain", form: "rounded", label: "Gemini8", pos: "b", h: 48 }
n93@{ icon: "mdi:memory", form: "rounded", label: "Memory8", pos: "b", h: 48 }
n94@{ icon: "mdi:robot", form: "rounded", label: "Structured8", pos: "b", h: 48 }
n95@{ icon: "mdi:brain", form: "rounded", label: "Gemini 2.5flash8", pos: "b", h: 48 }
n96["<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/>text to HTML8"]
n97@{ icon: "mdi:brain", form: "rounded", label: "Gemini9", pos: "b", h: 48 }
n98@{ icon: "mdi:memory", form: "rounded", label: "Memory9", pos: "b", h: 48 }
n99@{ icon: "mdi:robot", form: "rounded", label: "Structured9", pos: "b", h: 48 }
n100@{ icon: "mdi:brain", form: "rounded", label: "Gemini 2.5flash9", pos: "b", h: 48 }
n101["<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/>text to HTML10"]
n102@{ icon: "mdi:brain", form: "rounded", label: "Gemini10", pos: "b", h: 48 }
n103@{ icon: "mdi:memory", form: "rounded", label: "Memory10", pos: "b", h: 48 }
n104@{ icon: "mdi:robot", form: "rounded", label: "Structured10", pos: "b", h: 48 }
n105@{ icon: "mdi:brain", form: "rounded", label: "Gemini 2.5flash10", pos: "b", h: 48 }
n106["<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/>text to HTML11"]
n107@{ icon: "mdi:brain", form: "rounded", label: "Gemini11", pos: "b", h: 48 }
n108@{ icon: "mdi:memory", form: "rounded", label: "Memory11", pos: "b", h: 48 }
n109@{ icon: "mdi:robot", form: "rounded", label: "Structured11", pos: "b", h: 48 }
n110@{ icon: "mdi:brain", form: "rounded", label: "Gemini 2.5flash11", pos: "b", h: 48 }
n111["<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/>text to HTML12"]
n112@{ icon: "mdi:brain", form: "rounded", label: "Gemini12", pos: "b", h: 48 }
n113@{ icon: "mdi:memory", form: "rounded", label: "Memory12", pos: "b", h: 48 }
n114@{ icon: "mdi:robot", form: "rounded", label: "Structured12", pos: "b", h: 48 }
n115@{ icon: "mdi:brain", form: "rounded", label: "Gemini 2.5flash12", pos: "b", h: 48 }
n116["<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/>text to HTML13"]
n117@{ icon: "mdi:brain", form: "rounded", label: "Gemini13", pos: "b", h: 48 }
n118@{ icon: "mdi:memory", form: "rounded", label: "Memory13", pos: "b", h: 48 }
n119@{ icon: "mdi:robot", form: "rounded", label: "Structured13", pos: "b", h: 48 }
n120@{ icon: "mdi:brain", form: "rounded", label: "Gemini 2.5flash13", pos: "b", h: 48 }
n121["<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/>text to HTML14"]
n122@{ icon: "mdi:robot", form: "rounded", label: "Hair accessories item", pos: "b", h: 48 }
n123@{ icon: "mdi:database", form: "rounded", label: "update Hair accessories data", pos: "b", h: 48 }
n124@{ icon: "mdi:robot", form: "rounded", label: "Combo item", pos: "b", h: 48 }
n125@{ icon: "mdi:database", form: "rounded", label: "update Combo data", pos: "b", h: 48 }
n126@{ icon: "mdi:robot", form: "rounded", label: "Rings item", pos: "b", h: 48 }
n127@{ icon: "mdi:database", form: "rounded", label: "update Rings data", pos: "b", h: 48 }
n128@{ icon: "mdi:robot", form: "rounded", label: "Bangles item", pos: "b", h: 48 }
n129@{ icon: "mdi:database", form: "rounded", label: "update Bangles data", pos: "b", h: 48 }
n130@{ icon: "mdi:robot", form: "rounded", label: "Earrings item", pos: "b", h: 48 }
n131@{ icon: "mdi:database", form: "rounded", label: "update Earrings data", pos: "b", h: 48 }
n132@{ icon: "mdi:robot", form: "rounded", label: "Necklace item", pos: "b", h: 48 }
n133@{ icon: "mdi:database", form: "rounded", label: "update Necklace data", pos: "b", h: 48 }
n134@{ icon: "mdi:robot", form: "rounded", label: "Brooch item", pos: "b", h: 48 }
n135@{ icon: "mdi:database", form: "rounded", label: "update Brooch data", pos: "b", h: 48 }
n136@{ icon: "mdi:cog", form: "rounded", label: "Wait2", pos: "b", h: 48 }
n136 --> n14
n45 -.-> n48
n46 -.-> n48
n44 --> n132
n44 --> n130
n44 --> n128
n44 --> n126
n44 --> n124
n44 --> n122
n44 --> n90
n44 --> n89
n44 --> n86
n44 --> n69
n44 --> n134
n44 --> n48
n44 --> n57
n52 -.-> n57
n59 -.-> n69
n64 -.-> n134
n71 -.-> n86
n76 -.-> n90
n81 -.-> n89
n92 -.-> n122
n97 -.-> n126
n53 -.-> n57
n60 -.-> n69
n65 -.-> n134
n72 -.-> n86
n77 -.-> n90
n82 -.-> n89
n93 -.-> n122
n98 -.-> n126
n102 -.-> n124
n107 -.-> n130
n112 -.-> n128
n117 -.-> n132
n103 -.-> n124
n108 -.-> n130
n113 -.-> n128
n118 -.-> n132
n86 --> n75
n57 --> n56
n124 --> n106
n69 --> n63
n126 --> n101
n47 -.-> n48
n48 --> n50
n134 --> n68
n54 -.-> n57
n61 -.-> n69
n66 -.-> n134
n73 -.-> n86
n78 -.-> n90
n83 -.-> n89
n94 -.-> n122
n99 -.-> n126
n128 --> n116
n104 -.-> n124
n109 -.-> n130
n114 -.-> n128
n119 -.-> n132
n50 --> n51
n130 --> n111
n132 --> n121
n89 --> n85
n56 --> n58
n63 --> n70
n68 --> n135
n75 --> n87
n80 --> n91
n85 --> n88
n96 --> n123
n101 --> n127
n106 --> n125
n111 --> n131
n116 --> n129
n121 --> n133
n49 -.-> n47
n55 -.-> n54
n62 -.-> n61
n67 -.-> n66
n74 -.-> n73
n79 -.-> n78
n84 -.-> n83
n95 -.-> n94
n100 -.-> n99
n14 --> n44
n105 -.-> n104
n110 -.-> n109
n115 -.-> n114
n120 -.-> n119
n13 --> n12
n87 --> n136
n125 --> n136
n70 --> n136
n127 --> n136
n58 --> n136
n135 --> n136
n51 --> n136
n12 --> n14
n129 --> n136
n131 --> n136
n133 --> n136
n88 --> n136
n122 --> n96
n90 --> n80
n123 --> n136
n91 --> n136
end
subgraph sg1["Schedule Flow"]
direction LR
n33@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet2", pos: "b", h: 48 }
n34@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger4", pos: "b", h: 48 }
n35@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items4", pos: "b", h: 48 }
n36@{ icon: "mdi:database", form: "rounded", label: "Update row in sheet3", pos: "b", h: 48 }
n37@{ icon: "mdi:robot", form: "rounded", label: "AI Agent2", pos: "b", h: 48 }
n38@{ icon: "mdi:memory", form: "rounded", label: "Simple Memory2", pos: "b", h: 48 }
n39@{ icon: "mdi:robot", form: "rounded", label: "Auto-fixing Output Parser", pos: "b", h: 48 }
n40@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n41@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model2", pos: "b", h: 48 }
n43@{ icon: "mdi:cog", form: "rounded", label: "Wait1", pos: "b", h: 48 }
n138@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model1", pos: "b", h: 48 }
n43 --> n36
n37 --> n43
n38 -.-> n37
n35 --> n37
n34 --> n33
n138 -.-> n39
n33 --> n35
n36 --> n35
n40 -.-> n39
n39 -.-> n37
n41 -.-> n37
end
subgraph sg2["START Flow"]
direction LR
n24@{ icon: "mdi:swap-vertical", form: "rounded", label: "query_folder_name1", pos: "b", h: 48 }
n25@{ icon: "mdi:cog", form: "rounded", label: "Search_folders1", pos: "b", h: 48 }
n26@{ icon: "mdi:cog", form: "rounded", label: "image_within_folder1", pos: "b", h: 48 }
n27@{ icon: "mdi:swap-vertical", form: "rounded", label: "looping1", pos: "b", h: 48 }
n28@{ icon: "mdi:database", form: "rounded", label: "add_image_data2", pos: "b", h: 48 }
n29@{ icon: "mdi:cog", form: "rounded", label: "sku_sort", pos: "b", h: 48 }
n30["<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/>variant_numbering1"]
n31["<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/>sku_structuring1"]
n32["<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/form.svg' width='40' height='40' /></div><br/>START"]
n32 --> n24
n27 --> n28
n29 --> n30
n25 --> n26
n28 --> n27
n31 --> n29
n24 --> n25
n30 --> n27
n26 --> n31
end
subgraph sg3["When clicking ‘Execute workflow’ Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Execute workf..", pos: "b", h: 48 }
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/>HTTP Request"]
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/>HTTP Request1"]
n3@{ icon: "mdi:cog", form: "rounded", label: "Download file", pos: "b", h: 48 }
n4["<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/>HTTP Request2"]
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/>HTTP Request3"]
n15@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n16@{ icon: "mdi:database", form: "rounded", label: "Update row in sheet2", pos: "b", h: 48 }
n137@{ icon: "mdi:database", form: "rounded", label: "get product data", pos: "b", h: 48 }
n1 --> n3
n3 --> n2
n2 --> n4
n4 --> n5
n5 --> n16
n15 --> n1
n137 --> n15
n16 --> n15
n0 --> n137
end
subgraph sg4["Schedule Flow"]
direction LR
n6@{ icon: "mdi:robot", form: "rounded", label: "Analyze an image", pos: "b", h: 48 }
n7@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items1", pos: "b", h: 48 }
n9@{ icon: "mdi:cog", form: "rounded", label: "Download file1", pos: "b", h: 48 }
n10@{ icon: "mdi:database", form: "rounded", label: "Update row in sheet", pos: "b", h: 48 }
n11@{ icon: "mdi:database", form: "rounded", label: "pending_image_to analyze", pos: "b", h: 48 }
n42@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n42 --> n10
n9 --> n6
n6 --> n42
n8 --> n9
n7 --> n11
n10 --> n8
n11 --> n8
end
subgraph sg5["Schedule Flow"]
direction LR
n17@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger2", pos: "b", h: 48 }
n18@{ icon: "mdi:database", form: "rounded", label: "get finalized data", pos: "b", h: 48 }
n19["<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/>structuring columns"]
n20["<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/>structuring body content"]
n21@{ icon: "mdi:database", form: "rounded", label: "Append row in sheet", pos: "b", h: 48 }
n22@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items3", pos: "b", h: 48 }
n23@{ icon: "mdi:cog", form: "rounded", label: "nothing", pos: "b", h: 48 }
n22 --> n23
n22 --> n19
n17 --> n18
n18 --> n22
n21 --> n22
n19 --> n20
n20 --> n21
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,n34,n32,n0,n7,n17 trigger
class n47,n48,n54,n57,n61,n66,n69,n73,n78,n83,n86,n89,n90,n94,n99,n104,n109,n114,n119,n122,n124,n126,n128,n130,n132,n134,n37,n39,n40,n6 ai
class n45,n49,n52,n55,n59,n62,n64,n67,n71,n74,n76,n79,n81,n84,n92,n95,n97,n100,n102,n105,n107,n110,n112,n115,n117,n120,n41,n138 aiModel
class n46,n53,n60,n65,n72,n77,n82,n93,n98,n103,n108,n113,n118,n38 ai
class n44 decision
class n12,n51,n58,n70,n87,n88,n91,n123,n125,n127,n129,n131,n133,n135,n33,n36,n28,n16,n137,n10,n11,n18,n21 database
class n1,n2,n4,n5 api
class n50,n56,n63,n68,n75,n80,n85,n96,n101,n106,n111,n116,n121,n30,n31,n19,n20 code
classDef customIcon fill:none,stroke:none
class n50,n56,n63,n68,n75,n80,n85,n96,n101,n106,n111,n116,n121,n30,n31,n32,n1,n2,n4,n5,n19,n20 customIcon
Utmaningen: att göra bilder till importklart produktdata
Om din katalog i första hand utgår från bilder (smycken, mode, accessoarer) börjar din ”produktdata” ofta som foton och en SKU-lista, inte som snyggt strukturerade fält. Någon måste namnge filer, matcha varianter, skriva titlar och beskrivningar, gissa kategorier, ladda upp bilder, kopiera URL:er och sedan bygga om allt i Shopifys CSV-format. Och sedan gör du det igen eftersom en kolumnrubrik var fel, HTML-beskrivningen skapade fel, eller varianterna inte mappades korrekt. Det är inte svårt arbete. Det är skört arbete, och det dränerar snabbt din uppmärksamhet.
Det eskalerar snabbt. Här är var det ofta faller isär i riktiga butiker.
- Varje manuell kopiera/klistra mellan Drive, Sheets och Shopify är en risk att blanda ihop en SKU och skapa fel variant.
- Att skriva produkttitlar, taggar och HTML-beskrivningar för dussintals artiklar blir lätt en lång eftermiddag av ”det får duga”-innehåll.
- Shopify CSV-importer misslyckas av irriterande skäl (saknade handles, fel rubriker, fel struktur på bild-URL:er), och felsökningen äter upp tiden du trodde att du sparade.
- När processen sitter i någons huvud blir det stressigt och inkonsekvent att skala till veckovisa släpp.
Lösningen: konvertera Google Drive-bilder till en Shopify-klar CSV
Det här arbetsflödet behandlar din Google Drive-mapp som starten på din produktpipeline. Du lägger produktbilder i en specifik ”pending”-mappstruktur och använder ett konsekvent filnamnsmönster som innehåller SKU och färgkod (till exempel 12345GR). Därefter skannar n8n mappen, hämtar varje bild och analyserar dem en och en via ett AI-steg för bildanalys som prioriterar precision framför hastighet. AI:n skapar grunderna du annars ofta behöver hitta på manuellt: kategori, titel, Shopify-klar HTML-beskrivning, taggar och attribut. Sedan laddar arbetsflödet upp bilderna till Shopify, hämtar CDN-URL:erna och mappar tillbaka dem till rätt produktrader. Till sist skriver det allt till Google Sheets i Shopifys import-CSV-struktur så att du kan granska, exportera och ladda upp med betydligt färre överraskningar.
Arbetsflödet startar med en manuell eller schemalagd trigger. Sedan hämtar det bilder från Google Drive och använder Google Sheets som ”kontrollcenter” för att organisera rader, varianter och genererat innehåll. Shopify tar emot bilderna via API-uppladdning, och slutresultatet är ett strukturerat kalkylark som är redo att exporteras som CSV för massimport.
Vad som förändras: före vs. efter
| Det här elimineras | Effekten du märker |
|---|---|
|
|
Verklig effekt
Säg att du ska lägga in 50 produkter för en ny kollektion, och varje produkt har 3 variantbilder. Manuellt är det lätt att lägga cirka 5 minuter per produkt på filnamn och mappning, ytterligare 10 minuter på att skriva text, plus några minuter på uppladdning och klistra in bild-URL:er. Det är ungefär 15 minuter per produkt, eller cirka 12 timmar för hela batchen. Med det här arbetsflödet förbereder du Drive-mappen en gång och låter sedan AI- och Shopify-uppladdningsstegen köra; de flesta team landar på cirka en timme för att granska Google-arket innan import.
Krav
- n8n-instans (prova n8n Cloud gratis)
- Alternativ för self-hosting om du föredrar det (Hostinger fungerar bra)
- Google Drive för att lagra mappar med produktbilder.
- Google Sheets för att skapa och granska CSV-utdata.
- Åtkomsttoken till Shopify Admin API (skapa den i Shopify admin för appar).
- API-nyckel för AI-leverantör (hämta den i din AI-leverantörs dashboard).
Svårighetsnivå: Medel. Du kopplar konton, klistrar in API-nycklar och säkerställer att Shopifys CSV-fält matchar din butiks konfiguration.
Behöver du hjälp att implementera detta? Prata med en automationsspecialist (gratis 15-minuters konsultation).
Flödet i arbetsflödet
En mappskanning startar allt. Du kör arbetsflödet manuellt (eller enligt schema) och det skannar Google Drive efter bilder i din pending/<brand_name>-mappstruktur. Filnamnen tolkas för att hämta SKU och färgkod så att varianter inte blandas ihop.
Google Sheets blir stagingyta. Arbetsflödet skapar en rad per artikel (och per variant vid behov), så att du får en strukturerad plats att följa upp vad som hittades, vad som genererades och vad som är klart för uppladdning.
AI fyller i de saknade produktdetaljerna. Bilder analyseras en och en, vilket är långsammare men ärligt talat säkrare för riktiga kataloger. Arbetsflödet identifierar huvudkategorin (t.ex. Smycken) och genererar sedan titlar, HTML-beskrivningar, taggar och attribut utifrån kategorilogiken.
Shopify tar emot bilderna och returnerar korrekta URL:er. Bilder laddas upp via Shopify (ofta via HTTP request eller Shopify-noder), och arbetsflödet fångar CDN-URL:erna. De URL:erna mappas tillbaka till rätt CSV-fält i Google Sheets.
Du kan enkelt justera kategoriprompter och CSV-kolumner så att de matchar din nisch och dina importregler. Se den fullständiga implementationsguiden nedan för anpassningsmöjligheter.
Saker att se upp med
- OAuth-inloggningar för Google Drive och Google Sheets kan löpa ut eller sakna mappbehörigheter. Om skanningen plötsligt inte returnerar något, kontrollera status för n8n-credentials och bekräfta att ”pending”-mappen är korrekt delad.
- Om du använder Wait-noder eller förlitar dig på att Shopify hinner bearbeta uppladdningar varierar tiderna. Öka väntetiden om efterföljande noder fallerar på tomma svar eller saknade CDN-URL:er.
- Standardprompter för AI är generiska, och generiskt innehåll ser generiskt ut. Lägg in din varumärkeston, materialdetaljer du bryr dig om och ”gissa inte”-regler tidigt, annars kommer du att redigera utdata för alltid.
Vanliga frågor
Cirka en timme om dina konton och tokens är klara.
Ja, men någon behöver vara bekväm med att koppla OAuth-konton och klistra in API-nycklar. När allt är kopplat är den dagliga användningen i princip: ”lägg bilder i Drive, kör, granska i Sheets”.
Ja. n8n har ett gratis self-hosted-alternativ och en gratis provperiod på n8n Cloud. Molnplaner börjar på 20 USD/månad för högre volymer. Du behöver också räkna in kostnader för AI-API och användning av Shopify API.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller self-hosting på en VPS. För self-hosting är Hostinger VPS prisvärd och hanterar n8n bra. Self-hosting ger obegränsat antal körningar men kräver grundläggande serveradministration.
Du kan justera kategoriidentifiering och skrivstil genom att redigera AI-prompterna som används för bildanalys och innehållsgenerering. Om du inte säljer smycken eller mode, ändra logiken för ”huvudkategori” så att flödet hamnar i rätt attribut för din nisch. Vanliga anpassningar är att lägga till metafält, generera flerspråkiga beskrivningar och mappa till dina föredragna alternativnamn (som Storlek, Material eller Ytfinish).
Oftast beror det på en utgången access token eller en app som saknar rätt Admin API-scopes. Skapa en ny Shopify access token, uppdatera den i n8n och kör sedan ett test med en bild för att bekräfta att uppladdningar fungerar. Om det bara misslyckas vid större batcher kan det bero på rate limiting eller timeouts vid bilduppladdning. I så fall, sänk hastigheten i flödet och behåll en-och-en-upplägget.
Den skalar bra eftersom bilder bearbetas en i taget, så du kan köra stora batcher utan kaos. I n8n Cloud beror kapaciteten på planens antal körningar per månad. Om du self-hostar finns ingen körningsgräns, men din server och Shopifys API-gränser blir flaskhalsen. I praktiken kör de flesta butiker detta som ett batchjobb för nya kollektioner och gör sedan en snabb kontroll i arket innan import.
Ofta, ja, eftersom det här flödet behöver förgreningar, filhantering (läsa bilder) och transformationer i flera steg som blir klumpiga och dyra i enklare automationsverktyg. n8n är också enklare att self-hosta, vilket spelar roll om du kör stora batcher. Zapier eller Make kan fortfarande fungera om du håller omfattningen liten och inte behöver AI-analys per bild. Den verkliga frågan är underhåll: vill du ha en robust pipeline som går att bygga vidare på, eller en snabb koppling som snabbt når sin gräns? Prata med en automationsspecialist om du vill ha en second opinion baserat på storleken på din katalog.
När detta väl är på plats slutar nya produkter att kännas som ett dataregistreringsprojekt. Du får ett granskningsbart Google-ark, en Shopify-klar CSV och ett arbetsflöde som inte får panik när nästa kollektion dyker upp.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.