{"workflow":{"id":13881,"name":"Generate images from Airtable records with Layerre and Canva","views":78,"recentViews":1,"totalViews":78,"createdAt":"2026-03-05T03:34:53.465Z","description":"How it works\n\n• Reads records from an Airtable table (e.g. leads, events, products) with fields such as name and image URL.\n• Uses Layerre to create image variants from a Canva-based template; the template ID comes from the one-time “Create Template from Canva” node.\n• For each record, one image is rendered and the image URL is written back into the same Airtable row.\n\nSet up steps\n\n• Create a Layerre template from your Canva design: run the “Create Template from Canva” node once with your Canva URL, then disable it and paste the template ID into the Create Variant node.\n• Add Airtable credentials (Personal Access Token), select your base and table, and optionally use Filter By Formula to limit which records are processed.\n• In the Create Variant node, map your Airtable field names to your Canva layers (e.g. $json.fields.Name for a text layer, $json.fields['Image url'] for an image layer).\n• In the Update Airtable node, map the record id from the List step and the image URL from the variant output (e.g. $json.url) so each row is updated correctly. Add a column in your table for the output URL if needed.\n","workflow":{"name":"Generate images from Airtable records with Layerre","nodes":[{"id":"3e5aa464-ddf2-40e0-8d73-64cf45ba34bf","name":"When clicking \"Test\"","type":"n8n-nodes-base.manualTrigger","position":[144,416],"parameters":{},"typeVersion":1},{"id":"f3f96264-e766-4ebd-888e-52c3e6282f4a","name":"Overview","type":"n8n-nodes-base.stickyNote","position":[-400,-128],"parameters":{"width":480,"height":820,"content":"## Airtable → Layerre → Airtable\n\nGenerate images from Airtable records (e.g. leads, events, products) and write the rendered image URL back into your base.\n\n### How it works\n1. **Create Template**: One-time – create a Layerre template from your Canva design (run the Create Template node once, then disable it and set the template ID in the Create Variant node).\n2. **List Airtable records**: Read records from your base and table.\n3. **Create Variant**: For each record, create one image variant; map Airtable fields to your Canva layers.\n4. **Update Airtable**: Write the rendered image URL back to the same record.\n\n### Prerequisites\n- [Layerre account](https://layerre.com) with API key\n- Canva design with the layers you want to customize\n- Airtable base with a table and a column for the output URL\n\n### Customization\n- Map your field names in Create Variant (e.g. `$json.fields.Name`, `$json.fields['Image url']`).\n- In Update, use the record **id** from the List step and the image URL from the variant output (e.g. `$json.url`).\n- Add a Filter or Schedule trigger to run only for new or updated records.\n\n### Resources\n- [Layerre Documentation](https://layerre.com/docs)\n- [Layerre n8n Node](https://github.com/layerre/n8n-nodes-layerre)"},"typeVersion":1},{"id":"a8779b50-cf93-4bc3-b33c-bc50af5a4c8d","name":"Step 1 Instructions","type":"n8n-nodes-base.stickyNote","position":[448,112],"parameters":{"color":7,"width":320,"height":200,"content":"## Step 1: Create Template (one-time)\n\nCreate a Layerre template from your Canva design. Run this node once with your Canva URL, then disable it and paste the template ID into the Create Variant node."},"typeVersion":1},{"id":"910d2fdb-0d36-44bc-831e-c892c221e4d3","name":"Create Template from Canva","type":"n8n-nodes-layerre.layerre","disabled":true,"position":[576,416],"parameters":{"canvaUrl":"","requestOptions":{}},"credentials":{},"typeVersion":1},{"id":"a0617442-116e-48da-8d86-18a582c98f0c","name":"Step 2 Instructions","type":"n8n-nodes-base.stickyNote","position":[912,-48],"parameters":{"color":7,"width":360,"height":380,"content":"## Step 2: List Airtable records\n\n1. Add Airtable credentials (Personal Access Token).\n2. Select your base and table.\n3. Optionally use **Filter By Formula** to limit records (e.g. only rows where the output URL is empty).\n4. Each record needs an **id**; the Update step uses it to write back to the correct row."},"typeVersion":1},{"id":"1b1bd407-7000-4280-9dfb-c66337db3e9f","name":"List Airtable records","type":"n8n-nodes-base.airtable","position":[1024,416],"parameters":{"base":{"__rl":true,"mode":"list","value":"","cachedResultUrl":"","cachedResultName":""},"table":{"__rl":true,"mode":"list","value":"","cachedResultUrl":"","cachedResultName":""},"options":{},"operation":"search"},"credentials":{},"typeVersion":2},{"id":"7acebddd-7287-49c6-920b-d4db557446d7","name":"Step 3 Instructions","type":"n8n-nodes-base.stickyNote","position":[1408,0],"parameters":{"color":7,"width":360,"height":300,"content":"## Step 3: Create Variant per record\n\nSet **Template ID** (from Step 1). Map Airtable fields to your Canva layers using `$json.fields['Field Name']` for field values. Each list item becomes one variant; the record **id** is passed through for the Update step."},"typeVersion":1},{"id":"b2631099-c38d-4a4a-972d-80b23593f4c1","name":"Step 4 Instructions","type":"n8n-nodes-base.stickyNote","position":[1856,32],"parameters":{"color":7,"width":376,"height":300,"content":"## Step 4: Update Airtable with image URL\n\nWrite the rendered image URL back to the same record. Use the record **id** from the List step (e.g. `$('List Airtable records').item.json.id`) and the image URL from the variant output (e.g. `$json.url`) so each row is updated correctly."},"typeVersion":1},{"id":"196bbbd6-e1ed-414e-b7e4-687ac72a20c0","name":"Update Airtable record","type":"n8n-nodes-base.airtable","position":[1968,416],"parameters":{"base":{"__rl":true,"mode":"list","value":"","cachedResultUrl":"","cachedResultName":""},"table":{"__rl":true,"mode":"list","value":"","cachedResultUrl":"","cachedResultName":""},"columns":{"value":{"id":"={{ $('List Airtable records').item.json.id }}","Generated url":"={{ $json.url }}"},"schema":[{"id":"id","type":"string","display":true,"removed":false,"readOnly":true,"required":false,"displayName":"id","defaultMatch":true},{"id":"Generated url","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"Generated url","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["id"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"update"},"credentials":{},"typeVersion":2},{"id":"87e4be2e-765a-49bf-a8a0-0d6adaa90c8d","name":"Create a variant","type":"n8n-nodes-layerre.layerre","position":[1520,416],"parameters":{"resource":"variant","overrides":{"override":[{"layerId":"","overrideOptions":{"text":"={{ $json.fields.Name }}"}},{"layerId":"","overrideOptions":{"imgUrl":"={{ $json.fields['Image url'] }}"}}]},"templateId":"","requestOptions":{},"variantDimensions":{}},"credentials":{},"typeVersion":1}],"pinData":{},"connections":{"Create a variant":{"main":[[{"node":"Update Airtable record","type":"main","index":0}]]},"When clicking \"Test\"":{"main":[[{"node":"Create Template from Canva","type":"main","index":0}]]},"List Airtable records":{"main":[[{"node":"Create a variant","type":"main","index":0}]]},"Create Template from Canva":{"main":[[{"node":"List Airtable records","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":10,"nodeTypes":{"n8n-nodes-base.airtable":{"count":2},"n8n-nodes-base.stickyNote":{"count":5},"n8n-nodes-layerre.layerre":{"count":2},"n8n-nodes-base.manualTrigger":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"Layerre","username":"layerre","bio":"","verified":true,"links":["https://x.com/layerre"],"avatar":"https://gravatar.com/avatar/eeb2a09a989069ad65b52530314c8b14fc44fcdae7edd3d9bbeb0417be587aa5?r=pg&d=retro&size=200"},"nodes":[{"id":2,"icon":"file:airtable.svg","name":"n8n-nodes-base.airtable","codex":{"data":{"resources":{"generic":[{"url":"https://n8n.io/blog/2021-goals-level-up-your-vocabulary-with-vonage-and-n8n/","icon":"🎯","label":"2021 Goals: Level Up Your Vocabulary With Vonage and n8n"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/","icon":"🧰","label":"Learn to Build Powerful API Endpoints Using Webhooks"},{"url":"https://n8n.io/blog/sending-sms-the-low-code-way-with-airtable-twilio-programmable-sms-and-n8n/","icon":"📱","label":"Sending SMS the Low-Code Way with Airtable, Twilio Programmable SMS, and n8n"},{"url":"https://n8n.io/blog/automating-conference-organization-processes-with-n8n/","icon":"🙋‍♀️","label":"Automating Conference Organization Processes with n8n"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.airtable/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/airtable/"}]},"categories":["Data & Storage"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\"]","defaults":{"name":"Airtable"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMDAgMTcwIj48cGF0aCBmaWxsPSIjZmNiNDAwIiBkPSJNODkgNC44IDE2LjIgMzQuOWMtNC4xIDEuNy00IDcuNC4xIDkuMWw3My4yIDI5YzYuNCAyLjYgMTMuNiAyLjYgMjAgMGw3My4yLTI5YzQuMS0xLjYgNC4xLTcuNC4xLTkuMWwtNzMtMzAuMUMxMDMuMiAyIDk1LjcgMiA4OSA0LjgiLz48cGF0aCBmaWxsPSIjMThiZmZmIiBkPSJNMTA1LjkgODguOXY3Mi41YzAgMy40IDMuNSA1LjggNi43IDQuNWw4MS42LTMxLjdjMS45LS43IDMuMS0yLjUgMy4xLTQuNVY1Ny4yYzAtMy40LTMuNS01LjgtNi43LTQuNUwxMDkgODQuM2MtMS45LjgtMy4xIDIuNi0zLjEgNC42Ii8+PHBhdGggZmlsbD0iI2Y4MmI2MCIgZD0ibTg2LjkgOTIuNi0yNC4yIDExLjctMi41IDEuMkw5LjEgMTMwYy0zLjIgMS42LTcuNC0uOC03LjQtNC40VjU3LjVjMC0xLjMuNy0yLjQgMS42LTMuM3EuNi0uNiAxLjItLjljMS4yLS43IDMtLjkgNC40LS4zbDc3LjUgMzAuN2M0IDEuNSA0LjMgNy4xLjUgOC45Ii8+PHBhdGggZmlsbD0iI2JhMWU0NSIgZD0ibTg2LjkgOTIuNi0yNC4yIDExLjctNTkuNC01MHEuNi0uNiAxLjItLjljMS4yLS43IDMtLjkgNC40LS4zbDc3LjUgMzAuN2M0IDEuNCA0LjMgNyAuNSA4LjgiLz48L3N2Zz4="},"displayName":"Airtable","typeVersion":2,"nodeCategories":[{"id":3,"name":"Data & Storage"}]},{"id":565,"icon":"fa:sticky-note","name":"n8n-nodes-base.stickyNote","codex":{"data":{"alias":["Comments","Notes","Sticky"],"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\"]","defaults":{"name":"Sticky Note","color":"#FFD233"},"iconData":{"icon":"sticky-note","type":"icon"},"displayName":"Sticky Note","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":838,"icon":"fa:mouse-pointer","name":"n8n-nodes-base.manualTrigger","codex":{"data":{"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.manualworkflowtrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\"]","defaults":{"name":"When clicking ‘Execute workflow’","color":"#909298"},"iconData":{"icon":"mouse-pointer","type":"icon"},"displayName":"Manual Trigger","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":31,"name":"Content Creation"},{"id":51,"name":"Multimodal AI"}],"image":[]}}