From 79d5e6992d69d1fa64736ed81a4ce7e6d8be0921 Mon Sep 17 00:00:00 2001 From: nusquama Date: Wed, 11 Mar 2026 12:00:26 +0800 Subject: [PATCH] creation --- .../readme-13881.md | 399 ++++++++++++++++++ 1 file changed, 399 insertions(+) create mode 100644 workflows/Generate images from Airtable records with Layerre and Canva-13881/readme-13881.md diff --git a/workflows/Generate images from Airtable records with Layerre and Canva-13881/readme-13881.md b/workflows/Generate images from Airtable records with Layerre and Canva-13881/readme-13881.md new file mode 100644 index 000000000..670f16c56 --- /dev/null +++ b/workflows/Generate images from Airtable records with Layerre and Canva-13881/readme-13881.md @@ -0,0 +1,399 @@ +Generate images from Airtable records with Layerre and Canva + +https://n8nworkflows.xyz/workflows/generate-images-from-airtable-records-with-layerre-and-canva-13881 + + +# Generate images from Airtable records with Layerre and Canva + +# 1. Workflow Overview + +This workflow generates images from Airtable records by using Layerre to render Canva-based template variants, then writes the generated image URL back into Airtable. + +Typical use cases include: +- Generating personalized lead images +- Creating event visuals from structured Airtable data +- Producing product cards or marketing assets at scale + +The workflow is structured into four main logical blocks: + +## 1.1 Trigger and One-Time Template Initialization +The workflow starts manually. It includes an optional one-time Layerre action that converts a Canva design into a reusable Layerre template. + +## 1.2 Airtable Record Retrieval +After the template exists, the workflow fetches records from an Airtable base/table. Each record acts as one input item for image generation. + +## 1.3 Variant Rendering with Layerre +For each Airtable record, the workflow creates one Layerre variant by mapping Airtable fields to specific Canva layers. + +## 1.4 Airtable Record Update +Once Layerre returns the generated image URL, the workflow updates the original Airtable record with that URL. + +--- + +# 2. Block-by-Block Analysis + +## 2.1 Trigger and One-Time Template Initialization + +### Overview +This block provides the workflow entry point and an optional setup step for creating a Layerre template from a Canva design. The template creation is intended to be run once, then disabled for normal production runs. + +### Nodes Involved +- `When clicking "Test"` +- `Create Template from Canva` + +### Node Details + +#### When clicking "Test"` +- **Type and technical role:** `n8n-nodes-base.manualTrigger`; manual entry node for test and ad hoc execution. +- **Configuration choices:** No parameters are configured. It simply starts the workflow when manually executed. +- **Key expressions or variables used:** None. +- **Input and output connections:** + - No input + - Output → `Create Template from Canva` +- **Version-specific requirements:** Type version 1. +- **Edge cases or potential failure types:** + - No functional error on its own + - Only usable for manual runs; not suitable for unattended automation +- **Sub-workflow reference:** None. + +#### Create Template from Canva +- **Type and technical role:** `n8n-nodes-layerre.layerre`; Layerre node used here to create a template from a Canva design URL. +- **Configuration choices:** + - Node is currently **disabled** + - `canvaUrl` is empty in the provided workflow and must be filled before use + - Intended as a one-time setup node +- **Key expressions or variables used:** None in current configuration. +- **Input and output connections:** + - Input ← `When clicking "Test"` + - Output → `List Airtable records` +- **Version-specific requirements:** Type version 1 of the Layerre node. +- **Edge cases or potential failure types:** + - Missing or invalid Layerre credentials + - Empty `canvaUrl` + - Invalid or inaccessible Canva design URL + - Layer parsing issues if the Canva design is unsupported or malformed + - If the node remains disabled, n8n will skip it; depending on workflow behavior, downstream execution should be validated in the editor when rebuilding +- **Sub-workflow reference:** None. + +--- + +## 2.2 Airtable Record Retrieval + +### Overview +This block reads source records from Airtable. Each returned Airtable record becomes one item to process in the image-generation phase. + +### Nodes Involved +- `List Airtable records` + +### Node Details + +#### List Airtable records +- **Type and technical role:** `n8n-nodes-base.airtable`; Airtable search/read node used to fetch records. +- **Configuration choices:** + - Operation: `search` + - Base: selected from Airtable resources + - Table: selected from Airtable resources + - No additional options configured +- **Key expressions or variables used:** None in current configuration. +- **Input and output connections:** + - Input ← `Create Template from Canva` + - Output → `Create a variant` +- **Version-specific requirements:** Type version 2. +- **Edge cases or potential failure types:** + - Missing or invalid Airtable Personal Access Token + - Base or table not selected + - Permission issues on the Airtable base + - Empty result set, which means no variants will be generated + - If later expressions expect fields like `Name` or `Image url`, records missing those fields may break downstream mapping or create incomplete variants +- **Sub-workflow reference:** None. + +--- + +## 2.3 Variant Rendering with Layerre + +### Overview +This block transforms each Airtable record into a Layerre image variant. It maps Airtable fields onto Canva layer overrides, such as text and image layers. + +### Nodes Involved +- `Create a variant` + +### Node Details + +#### Create a variant +- **Type and technical role:** `n8n-nodes-layerre.layerre`; Layerre node used to create a rendered variant from an existing template. +- **Configuration choices:** + - Resource: `variant` + - `templateId`: empty in the provided workflow and must be filled with the template ID created in Step 1 + - Overrides include two layer mappings: + 1. A text override using `={{ $json.fields.Name }}` + 2. An image override using `={{ $json.fields['Image url'] }}` + - Both `layerId` values are empty and must be set to the correct Canva/Layerre layer identifiers + - `variantDimensions` left empty + - `requestOptions` empty +- **Key expressions or variables used:** + - `={{ $json.fields.Name }}` + - `={{ $json.fields['Image url'] }}` +- **Input and output connections:** + - Input ← `List Airtable records` + - Output → `Update Airtable record` +- **Version-specific requirements:** Type version 1 of the Layerre node. +- **Edge cases or potential failure types:** + - Missing or invalid Layerre credentials + - Empty `templateId` + - Missing `layerId` values in overrides + - Field name mismatches in Airtable, such as `Name` or `Image url` not existing + - Null or invalid source image URLs + - Layer type mismatch, e.g. applying text to an image layer or image URL to a text layer + - API failures or rendering timeouts + - Output may not contain `url` if rendering fails or returns an unexpected payload +- **Sub-workflow reference:** None. + +--- + +## 2.4 Airtable Record Update + +### Overview +This block writes the generated image URL back to the same Airtable record that produced the variant. It uses the original Airtable record ID and the Layerre output URL. + +### Nodes Involved +- `Update Airtable record` + +### Node Details + +#### Update Airtable record +- **Type and technical role:** `n8n-nodes-base.airtable`; Airtable update node for writing data back to an existing record. +- **Configuration choices:** + - Operation: `update` + - Base: selected from Airtable resources + - Table: selected from Airtable resources + - Mapping mode: define fields below + - Matching column: `id` + - Mapped fields: + - `id` = `={{ $('List Airtable records').item.json.id }}` + - `Generated url` = `={{ $json.url }}` +- **Key expressions or variables used:** + - `={{ $('List Airtable records').item.json.id }}` + - `={{ $json.url }}` +- **Input and output connections:** + - Input ← `Create a variant` + - No downstream output +- **Version-specific requirements:** Type version 2. +- **Edge cases or potential failure types:** + - Missing or invalid Airtable credentials + - Base/table mismatch with source records + - `Generated url` field not existing in Airtable + - Expression resolution failure if item linking to `List Airtable records` is broken + - Missing or empty `$json.url` from Layerre response + - Record update failure if Airtable record ID is invalid or inaccessible +- **Sub-workflow reference:** None. + +--- + +# 3. Summary Table + +| Node Name | Node Type | Functional Role | Input Node(s) | Output Node(s) | Sticky Note | +|---|---|---|---|---|---| +| When clicking "Test" | Manual Trigger | Manual workflow entry point | | Create Template from Canva | | +| Create Template from Canva | Layerre | One-time creation of a Layerre template from a Canva design | When clicking "Test" | List Airtable records | ## Step 1: Create Template (one-time)
Create 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. | +| List Airtable records | Airtable | Fetch source records from Airtable for variant generation | Create Template from Canva | Create a variant | ## Step 2: List Airtable records
1. Add Airtable credentials (Personal Access Token).
2. Select your base and table.
3. Optionally use **Filter By Formula** to limit records (e.g. only rows where the output URL is empty).
4. Each record needs an **id**; the Update step uses it to write back to the correct row. | +| Create a variant | Layerre | Render one image variant per Airtable record using template overrides | List Airtable records | Update Airtable record | ## Step 3: Create Variant per record
Set **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. | +| Update Airtable record | Airtable | Write the generated image URL back into Airtable | Create a variant | | ## Step 4: Update Airtable with image URL
Write 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. | +| Overview | Sticky Note | Documentation/comment node | | | ## Airtable → Layerre → Airtable

Generate images from Airtable records (e.g. leads, events, products) and write the rendered image URL back into your base.

### How it works
1. **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).
2. **List Airtable records**: Read records from your base and table.
3. **Create Variant**: For each record, create one image variant; map Airtable fields to your Canva layers.
4. **Update Airtable**: Write the rendered image URL back to the same record.

### Prerequisites
- [Layerre account](https://layerre.com) with API key
- Canva design with the layers you want to customize
- Airtable base with a table and a column for the output URL

### Customization
- Map your field names in Create Variant (e.g. `$json.fields.Name`, `$json.fields['Image url']`).
- In Update, use the record **id** from the List step and the image URL from the variant output (e.g. `$json.url`).
- Add a Filter or Schedule trigger to run only for new or updated records.

### Resources
- [Layerre Documentation](https://layerre.com/docs)
- [Layerre n8n Node](https://github.com/layerre/n8n-nodes-layerre) | +| Step 1 Instructions | Sticky Note | Documentation/comment node | | | ## Step 1: Create Template (one-time)

Create 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. | +| Step 2 Instructions | Sticky Note | Documentation/comment node | | | ## Step 2: List Airtable records

1. Add Airtable credentials (Personal Access Token).
2. Select your base and table.
3. Optionally use **Filter By Formula** to limit records (e.g. only rows where the output URL is empty).
4. Each record needs an **id**; the Update step uses it to write back to the correct row. | +| Step 3 Instructions | Sticky Note | Documentation/comment node | | | ## Step 3: Create Variant per record

Set **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. | +| Step 4 Instructions | Sticky Note | Documentation/comment node | | | ## Step 4: Update Airtable with image URL

Write 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. | + +--- + +# 4. Reproducing the Workflow from Scratch + +1. **Create a new workflow** + - Name it: `Generate images from Airtable records with Layerre`. + +2. **Add a Manual Trigger node** + - Node type: `Manual Trigger` + - Keep default configuration. + - Rename it to: `When clicking "Test"`. + +3. **Add the first documentation sticky note** + - Add a Sticky Note node named `Overview`. + - Paste this content: + - Airtable → Layerre → Airtable + - Explain that the workflow creates images from Airtable records and writes generated URLs back + - Include prerequisites: + - Layerre account and API key + - Canva design + - Airtable base/table with output URL field + - Include resource links: + - `https://layerre.com/docs` + - `https://github.com/layerre/n8n-nodes-layerre` + +4. **Add the one-time Layerre template creation node** + - Node type: `Layerre` + - Rename it to: `Create Template from Canva` + - Configure it for template creation from a Canva URL. + - Enter the Canva design URL in the `canvaUrl` field. + - Add Layerre credentials: + - Configure the Layerre API key in n8n credentials + - After successfully creating the template once, copy the returned template ID. + - Disable this node for future runs. + +5. **Connect the trigger to the template creation node** + - `When clicking "Test"` → `Create Template from Canva` + +6. **Add a sticky note for Step 1** + - Content should state that this is a one-time step: + - Run once + - Create a template from Canva + - Then disable the node + - Paste the template ID into the variant node + +7. **Add the Airtable record listing node** + - Node type: `Airtable` + - Rename it to: `List Airtable records` + - Set operation to: `Search` + - Select your Airtable credentials: + - Use a Personal Access Token with access to the target base/table + - Select: + - Base + - Table + - Optionally configure search/filter options, especially if you only want rows where the generated URL is empty. + +8. **Connect the template creation node to the Airtable list node** + - `Create Template from Canva` → `List Airtable records` + +9. **Add a sticky note for Step 2** + - Mention: + - Add Airtable credentials + - Select base and table + - Optionally use Filter By Formula + - Ensure the record `id` is available for updates + +10. **Add the Layerre variant creation node** + - Node type: `Layerre` + - Rename it to: `Create a variant` + - Configure: + - Resource: `variant` + - Template ID: paste the template ID created in Step 4 + - Add override entries for each Canva layer you want to customize. + +11. **Configure the first override in Create a variant** + - Set the target `layerId` to the text layer in the Layerre template + - Configure a text override with: + - `={{ $json.fields.Name }}` + - This reads the Airtable field `Name` + +12. **Configure the second override in Create a variant** + - Set the target `layerId` to the image layer in the Layerre template + - Configure an image URL override with: + - `={{ $json.fields['Image url'] }}` + - This reads the Airtable field named `Image url` + +13. **Review optional Layerre settings** + - Leave `variantDimensions` empty unless you need specific output dimensions + - Leave request options empty unless required by Layerre API behavior + - Confirm credentials are attached + +14. **Connect Airtable listing to variant creation** + - `List Airtable records` → `Create a variant` + +15. **Add a sticky note for Step 3** + - Mention: + - Set template ID + - Map Airtable fields with expressions such as `$json.fields['Field Name']` + - One record becomes one variant + - Preserve the Airtable record ID for the update step + +16. **Prepare Airtable to receive the generated URL** + - In Airtable, create a field named `Generated url` + - Ensure it is writable by the token being used. + +17. **Add the Airtable update node** + - Node type: `Airtable` + - Rename it to: `Update Airtable record` + - Set operation to: `Update` + - Select the same base and table as in the list node + +18. **Configure the update mapping** + - Use “define below” style mapping + - Add field mappings: + - `id` = `={{ $('List Airtable records').item.json.id }}` + - `Generated url` = `={{ $json.url }}` + - Use `id` as the matching field/column + +19. **Connect variant creation to Airtable update** + - `Create a variant` → `Update Airtable record` + +20. **Add a sticky note for Step 4** + - Mention: + - Write back to the same Airtable record + - Use the original record ID from the list node + - Use the generated URL from the variant node output + +21. **Test the one-time template creation** + - Enable `Create Template from Canva` + - Fill the Canva URL + - Run the workflow manually + - Copy the returned template ID + +22. **Finalize production configuration** + - Paste the template ID into `Create a variant` + - Fill all required `layerId` values in the override list + - Disable `Create Template from Canva` + +23. **Run an end-to-end test** + - Execute the workflow + - Confirm that: + - Airtable records are listed + - One Layerre variant is created per record + - The response contains a usable `url` + - Airtable records are updated in the `Generated url` field + +24. **Optional hardening** + - Add filters before variant creation to skip records with missing `Name` or `Image url` + - Add a scheduled trigger instead of a manual trigger for automation + - Add Airtable search filters so only records without generated URLs are processed + +### Credential Configuration + +#### Layerre credentials +- Create Layerre credentials in n8n using your Layerre API key. +- Attach them to: + - `Create Template from Canva` + - `Create a variant` + +#### Airtable credentials +- Create Airtable credentials in n8n using a Personal Access Token. +- Ensure access to: + - The selected base + - The selected table + - Read/write permissions for the output field + +### Sub-workflow setup +- This workflow does **not** use any Execute Workflow / sub-workflow nodes. +- No child workflow setup is required. + +--- + +# 5. General Notes & Resources + +| Note Content | Context or Link | +|---|---| +| Layerre account with API key is required before using the Layerre nodes. | https://layerre.com | +| Layerre API and product documentation. | https://layerre.com/docs | +| Layerre n8n node source and reference. | https://github.com/layerre/n8n-nodes-layerre | +| The Canva design must contain the layers you intend to override through Layerre. | Canva design preparation | +| The Airtable table should include a writable output field such as `Generated url`. | Airtable schema requirement | +| Suggested customization: add a Filter or Schedule trigger so only new or updated records are processed. | Operational improvement | + +## Additional implementation notes + +- The provided workflow contains only a **manual trigger**. It is not fully automated unless you replace or supplement it with a Schedule Trigger, Airtable Trigger, or another event source. +- In the provided JSON, the Layerre nodes are missing actual credentials and required values such as: + - Canva URL + - Template ID + - Override layer IDs +- In the provided JSON, both Airtable nodes are also missing selected base/table values and credentials. +- The workflow assumes that Layerre returns a top-level `url` field after variant creation. If your Layerre node version returns a different payload shape, adjust the update expression accordingly. +- The expression `$('List Airtable records').item.json.id` relies on item linking across node executions. If the workflow is modified with merge/split logic later, validate that paired items still resolve correctly. \ No newline at end of file