Files
lcbp3.np-dms.work/n8n-cache/n8n/public/assets/readyToRunWorkflows.store-Dhb8bhvk.js
2025-09-21 20:29:15 +07:00

2469 lines
70 KiB
JavaScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { $ as defineStore, av as useFoldersStore, a1 as useWorkflowsStore, dd as usePostHog, v as useSettingsStore, a_ as useLocalStorage, x as computed, fp as TEMPLATE_ONBOARDING_EXPERIMENT, c as useI18n, al as useTelemetry, a4 as STORES, bb as useCloudPlanStore, fq as BATCH_11AUG_EXPERIMENT } from "./index--OJ5nhDf.js";
const AGENT_WITH_MEMORY = {
meta: {
templateId: "035_template_onboarding-agent_with_memory"
},
name: "1. Agent with memory",
nodes: [
{
id: "536fa635-c0c8-4fd1-84ef-d19585be64cf",
name: "When chat message received",
webhookId: "9baee3d2-b9cb-4333-b4d5-3b07db8da9b2",
type: "@n8n/n8n-nodes-langchain.chatTrigger",
typeVersion: 1.1,
position: [0, 0],
parameters: {
options: {}
}
},
{
id: "1393095b-ec84-4514-b481-432609d1a5c5",
name: "AI Agent",
type: "@n8n/n8n-nodes-langchain.agent",
typeVersion: 2.1,
position: [208, 0],
parameters: {
options: {
systemMessage: "=You are a helpful assistant\n\nTodays date: {{ $now }}"
}
}
},
{
id: "658eb127-5a9d-4404-9270-72ef1da36ea3",
name: "Sticky Note",
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [-464, -32],
parameters: {
content: `### Readme
Chat with an AI agent that remembers your previous messages during a conversation.
**Quick Start**
1. Open the **Model** node to claim your free API credits and connect to OpenAI.
2. Click the **Open chat** button to start talking to the agent. Provide it with some information to remember, like your name.
3. Ask a follow-up question about the information you shared: "What's my name?"
---
**Learn More**
- [AI Agent node documentation](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/)
- [Simple Memory node documentation](https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.memorybufferwindow/)`,
height: 396,
width: 392,
color: 4
}
},
{
id: "186173c3-d043-4485-b939-9fca3d1e906f",
name: "Model",
type: "@n8n/n8n-nodes-langchain.lmChatOpenAi",
typeVersion: 1.2,
position: [160, 240],
parameters: {
model: {
__rl: true,
mode: "list",
value: "gpt-4.1-mini"
},
options: {}
}
},
{
id: "dadaaa19-8378-4e23-9573-f9d3ff52c884",
name: "Memory",
type: "@n8n/n8n-nodes-langchain.memoryBufferWindow",
typeVersion: 1.3,
position: [352, 240],
parameters: {}
}
],
connections: {
"When chat message received": {
main: [
[
{
node: "AI Agent",
type: "main",
index: 0
}
]
]
},
Model: {
ai_languageModel: [
[
{
node: "AI Agent",
type: "ai_languageModel",
index: 0
}
]
]
},
Memory: {
ai_memory: [
[
{
node: "AI Agent",
type: "ai_memory",
index: 0
}
]
]
}
}
// parentFolderId: newFolder.id,
};
const AGENT_WITH_TOOLS = {
meta: {
templateId: "035_template_onboarding-agent_with_tools"
},
name: "2. Agent with tools",
nodes: [
{
parameters: {
options: {}
},
type: "@n8n/n8n-nodes-langchain.chatTrigger",
typeVersion: 1.1,
position: [-48, -16],
id: "f6c9fe3c-cbde-4514-9fcf-9d618526965c",
name: "When chat message received",
webhookId: "1bf95244-fbc3-4210-9420-f34a45c4f5f5"
},
{
parameters: {
options: {}
},
type: "@n8n/n8n-nodes-langchain.agent",
typeVersion: 2.1,
position: [208, -16],
id: "5db1043f-de79-425a-a66b-8288c3aaa7df",
name: "AI Agent"
},
{
parameters: {},
type: "@n8n/n8n-nodes-langchain.memoryBufferWindow",
typeVersion: 1.3,
position: [208, 288],
id: "29f1ba2f-7511-4771-958a-be6463a64d83",
name: "Simple Memory"
},
{
parameters: {
operation: "update",
documentId: {
__rl: true,
value: "1vbFb2dhys1VafAmX-hRtiyrEDgNKj_xaAA6ZmH09EL8",
mode: "list",
cachedResultName: "Demo",
cachedResultUrl: "https://docs.google.com/spreadsheets/d/1vbFb2dhys1VafAmX-hRtiyrEDgNKj_xaAA6ZmH09EL8/edit?usp=drivesdk"
},
sheetName: {
__rl: true,
value: "gid=0",
mode: "list",
cachedResultName: "Sheet1",
cachedResultUrl: "https://docs.google.com/spreadsheets/d/1vbFb2dhys1VafAmX-hRtiyrEDgNKj_xaAA6ZmH09EL8/edit#gid=0"
},
columns: {
mappingMode: "defineBelow",
value: {
ID: "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('ID__using_to_match_', ``, 'string') }}",
Name: "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Name', ``, 'string') }}"
},
matchingColumns: ["ID"],
schema: [
{
id: "ID",
displayName: "ID",
required: false,
defaultMatch: false,
display: true,
type: "string",
canBeUsedToMatch: true,
removed: false
},
{
id: "Name",
displayName: "Name",
required: false,
defaultMatch: false,
display: true,
type: "string",
canBeUsedToMatch: true,
removed: false
},
{
id: "row_number",
displayName: "row_number",
required: false,
defaultMatch: false,
display: true,
type: "number",
canBeUsedToMatch: true,
readOnly: true,
removed: true
}
],
attemptToConvertTypes: false,
convertFieldsToString: false
},
options: {}
},
type: "n8n-nodes-base.googleSheetsTool",
typeVersion: 4.6,
position: [656, 640],
id: "24d82ca2-b666-415b-9020-f88cf3e095e6",
name: "Update",
credentials: {}
},
{
parameters: {
operation: "append",
documentId: {
__rl: true,
value: "1vbFb2dhys1VafAmX-hRtiyrEDgNKj_xaAA6ZmH09EL8",
mode: "list",
cachedResultName: "Demo",
cachedResultUrl: "https://docs.google.com/spreadsheets/d/1vbFb2dhys1VafAmX-hRtiyrEDgNKj_xaAA6ZmH09EL8/edit?usp=drivesdk"
},
sheetName: {
__rl: true,
value: "gid=0",
mode: "list",
cachedResultName: "Sheet1",
cachedResultUrl: "https://docs.google.com/spreadsheets/d/1vbFb2dhys1VafAmX-hRtiyrEDgNKj_xaAA6ZmH09EL8/edit#gid=0"
},
columns: {
mappingMode: "defineBelow",
value: {
// eslint-disable-next-line n8n-local-rules/no-interpolation-in-regular-string
ID: "={{ `${Math.random()}`.replace('0.', '') }}",
Name: "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Name', ``, 'string') }}"
},
matchingColumns: ["ID"],
schema: [
{
id: "ID",
displayName: "ID",
required: false,
defaultMatch: false,
display: true,
type: "string",
canBeUsedToMatch: true,
removed: false
},
{
id: "Name",
displayName: "Name",
required: false,
defaultMatch: false,
display: true,
type: "string",
canBeUsedToMatch: true,
removed: false
},
{
id: "row_number",
displayName: "row_number",
required: false,
defaultMatch: false,
display: true,
type: "number",
canBeUsedToMatch: true,
readOnly: true,
removed: true
}
],
attemptToConvertTypes: false,
convertFieldsToString: false
},
options: {}
},
type: "n8n-nodes-base.googleSheetsTool",
typeVersion: 4.6,
position: [464, 640],
id: "a0554e4a-8a7a-480c-a9e6-5f9746252cdb",
name: "Create",
credentials: {}
},
{
parameters: {
documentId: {
__rl: true,
value: "1vbFb2dhys1VafAmX-hRtiyrEDgNKj_xaAA6ZmH09EL8",
mode: "list",
cachedResultName: "Demo",
cachedResultUrl: "https://docs.google.com/spreadsheets/d/1vbFb2dhys1VafAmX-hRtiyrEDgNKj_xaAA6ZmH09EL8/edit?usp=drivesdk"
},
sheetName: {
__rl: true,
value: "gid=0",
mode: "list",
cachedResultName: "Sheet1",
cachedResultUrl: "https://docs.google.com/spreadsheets/d/1vbFb2dhys1VafAmX-hRtiyrEDgNKj_xaAA6ZmH09EL8/edit#gid=0"
},
options: {}
},
type: "n8n-nodes-base.googleSheetsTool",
typeVersion: 4.6,
position: [480, 288],
id: "ef476f0d-bdfe-4f41-8690-fb270ed82469",
name: "Read",
credentials: {}
},
{
parameters: {
operation: "delete",
documentId: {
__rl: true,
value: "1vbFb2dhys1VafAmX-hRtiyrEDgNKj_xaAA6ZmH09EL8",
mode: "list",
cachedResultName: "Demo",
cachedResultUrl: "https://docs.google.com/spreadsheets/d/1vbFb2dhys1VafAmX-hRtiyrEDgNKj_xaAA6ZmH09EL8/edit?usp=drivesdk"
},
sheetName: {
__rl: true,
value: "gid=0",
mode: "list",
cachedResultName: "Sheet1",
cachedResultUrl: "https://docs.google.com/spreadsheets/d/1vbFb2dhys1VafAmX-hRtiyrEDgNKj_xaAA6ZmH09EL8/edit#gid=0"
},
startIndex: "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Start_Row_Number', ``, 'number') }}",
numberToDelete: "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Number_of_Rows_to_Delete', ``, 'number') }}"
},
type: "n8n-nodes-base.googleSheetsTool",
typeVersion: 4.6,
position: [864, 640],
id: "d0cca35f-9e74-4935-92e2-9b5e37f1c7f4",
name: "Delete",
credentials: {}
},
{
parameters: {
content: "### Readme\nThis agent uses tools to interact with a simple spreadsheet of orders.\n\n**Quick Start**\n1. Copy this [spreadsheet](https://docs.google.com/spreadsheets/d/1vbFb2dhys1VafAmX-hRtiyrEDgNKj_xaAA6ZmH09EL8/edit?usp=sharing) into your Google Drive.\n2. Open the **Read** tool and connect your Google account by creating a credential and selecting the spreadsheet.\n3. Ask the Agent to calculate the total in the amount column, you should see it use the **Read** tool followed by the **Calculator**.\n4. Try some other questions and see how the agent responds.\n5. Use what you've learned to connect the other tools in the **Next steps** section.\n\n---\n\n**Learn More**\n- [Google sheet tool documentation](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlesheets/?utm_source=n8n_app&utm_medium=node_settings_modal-credential_link&utm_campaign=n8n-nodes-base.googleSheetsTool)\n- [Calculator tool documentation](https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.toolcalculator/)",
height: 460,
width: 440,
color: 4
},
type: "n8n-nodes-base.stickyNote",
position: [-576, -32],
typeVersion: 1,
id: "e57c1fe3-3ef9-447c-81e3-bdf8717706b9",
name: "Sticky Note"
},
{
parameters: {},
type: "@n8n/n8n-nodes-langchain.toolCalculator",
typeVersion: 1,
position: [624, 288],
id: "49030d8b-0818-455b-a472-356b620566c4",
name: "Calculator"
},
{
parameters: {
model: {
__rl: true,
mode: "list",
value: "gpt-4.1-mini"
},
options: {}
},
type: "@n8n/n8n-nodes-langchain.lmChatOpenAi",
typeVersion: 1.2,
position: [48, 288],
id: "67c78b12-b088-41b4-aeb4-70a7f056c9a7",
name: "Model",
credentials: {}
},
{
parameters: {
content: "## 🛠️ Tools",
height: 224,
width: 368,
color: 7
},
type: "n8n-nodes-base.stickyNote",
position: [400, 224],
typeVersion: 1,
id: "14c03c2d-e0ea-4958-94c1-3598e5c273d9",
name: "Sticky Note1"
},
{
parameters: {
content: "## 🛠️ Next steps\n\nConnect these tools to perform create, read and update actions on your order list.",
height: 320,
width: 592,
color: 7
},
type: "n8n-nodes-base.stickyNote",
position: [400, 496],
typeVersion: 1,
id: "a683cb43-e740-497e-bb01-edebfe39a832",
name: "Sticky Note2"
}
],
connections: {
"When chat message received": {
main: [
[
{
node: "AI Agent",
type: "main",
index: 0
}
]
]
},
"Simple Memory": {
ai_memory: [
[
{
node: "AI Agent",
type: "ai_memory",
index: 0
}
]
]
},
Update: {
ai_tool: [[]]
},
Create: {
ai_tool: [[]]
},
Read: {
ai_tool: [
[
{
node: "AI Agent",
type: "ai_tool",
index: 0
}
]
]
},
Delete: {
ai_tool: [[]]
},
Calculator: {
ai_tool: [
[
{
node: "AI Agent",
type: "ai_tool",
index: 0
}
]
]
},
Model: {
ai_languageModel: [
[
{
node: "AI Agent",
type: "ai_languageModel",
index: 0
}
]
]
}
}
};
const AGENT_WITH_KNOWLEDGE = {
meta: {
templateId: "035_template_onboarding-agent_with_knowledge"
},
name: "3. Agent with knowledge",
nodes: [
{
parameters: {
formTitle: "Upload your data to test RAG",
formFields: {
values: [
{
fieldLabel: "Upload your file(s)",
fieldType: "file",
acceptFileTypes: ".pdf, .csv",
requiredField: true
}
]
},
options: {}
},
type: "n8n-nodes-base.formTrigger",
typeVersion: 2.2,
position: [-368, -304],
id: "e45eaedc-7ed9-4fd6-b79b-82a155734bce",
name: "Upload your file here",
webhookId: "82848bc4-5ea2-4e5a-8bb6-3c09b94a8c5d"
},
{
parameters: {
options: {}
},
type: "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
typeVersion: 1.2,
position: [288, 176],
id: "f9f1745a-9c6d-42cf-8f8b-19a1c4c91b77",
name: "Embeddings OpenAI"
},
{
parameters: {
dataType: "binary",
options: {}
},
type: "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
typeVersion: 1.1,
position: [80, -144],
id: "56da285f-9ad9-4cb4-a7d4-fb0f035e9071",
name: "Default Data Loader"
},
{
parameters: {
content: "### Readme\nLoad your data into a vector database with the 📚 **Load Data** flow, and then use your data as chat context with the 🐕 **Retriever** flow.\n\n**Quick start**\n1. Click on the `Execute Workflow` button to run the 📚 **Load Data** flow.\n2. Click on `Open Chat` button to run the 🐕 **Retriever** flow. Then ask a question about content from your document(s)\n\n\nFor more info, check [our docs on RAG in n8n](https://docs.n8n.io/advanced-ai/rag-in-n8n/).",
height: 300,
width: 440,
color: 4
},
type: "n8n-nodes-base.stickyNote",
position: [-896, -368],
typeVersion: 1,
id: "72cb28c7-572b-41ce-ba4c-2dd0dc80acb4",
name: "Sticky Note"
},
{
parameters: {
content: "### 📚 Load Data Flow",
height: 460,
width: 700,
color: 7
},
type: "n8n-nodes-base.stickyNote",
position: [-416, -368],
typeVersion: 1,
id: "075a4895-8b5f-487b-b7ff-8766aa1d1450",
name: "Sticky Note1"
},
{
parameters: {
mode: "insert",
memoryKey: {
__rl: true,
value: "vector_store_key",
mode: "list",
cachedResultName: "vector_store_key"
}
},
type: "@n8n/n8n-nodes-langchain.vectorStoreInMemory",
typeVersion: 1.2,
position: [-176, -304],
id: "d24732cb-b6b4-4eb6-ad47-1f290f0da13d",
name: "Insert Data to Store"
},
{
parameters: {
mode: "retrieve-as-tool",
toolName: "knowledge_base",
toolDescription: "Use this knowledge base to answer questions from the user",
memoryKey: {
__rl: true,
mode: "list",
value: "vector_store_key"
}
},
type: "@n8n/n8n-nodes-langchain.vectorStoreInMemory",
typeVersion: 1.2,
position: [704, -96],
id: "8915e9b6-2a6c-472c-b043-78c1d77888ae",
name: "Query Data Tool"
},
{
parameters: {
options: {}
},
type: "@n8n/n8n-nodes-langchain.agent",
typeVersion: 2,
position: [704, -320],
id: "a2baaa1d-beee-40a2-8b5f-757b2b1aaca9",
name: "AI Agent"
},
{
parameters: {
options: {}
},
type: "@n8n/n8n-nodes-langchain.chatTrigger",
typeVersion: 1.1,
position: [480, -320],
id: "c0a831dd-362c-4352-9409-bfe8c2e6f5ab",
name: "When chat message received",
webhookId: "4091fa09-fb9a-4039-9411-7104d213f601"
},
{
parameters: {
model: {
__rl: true,
mode: "list",
value: "gpt-4o-mini"
},
options: {}
},
type: "@n8n/n8n-nodes-langchain.lmChatOpenAi",
typeVersion: 1.2,
position: [480, -96],
id: "2ba103b5-7783-49a7-9693-a156383ca697",
name: "OpenAI Chat Model"
},
{
parameters: {
content: "### 🐕 2. Retriever Flow",
height: 460,
width: 680,
color: 7
},
type: "n8n-nodes-base.stickyNote",
position: [368, -368],
typeVersion: 1,
id: "729f9492-3811-43d8-8230-d9ad78d910f7",
name: "Sticky Note2"
},
{
parameters: {
content: "### Embeddings\n\nThe Insert and Retrieve operation use the same embedding node.\n\nThis is to ensure that they are using the **exact same embeddings and settings**.\n\nDifferent embeddings might not work at all, or have unintended consequences.\n",
height: 240,
width: 320,
color: 4
},
type: "n8n-nodes-base.stickyNote",
position: [432, 144],
typeVersion: 1,
id: "20a6b946-5588-4df2-b1f6-952fc82d166c",
name: "Sticky Note3"
}
],
connections: {
"Upload your file here": {
main: [
[
{
node: "Insert Data to Store",
type: "main",
index: 0
}
]
]
},
"Embeddings OpenAI": {
ai_embedding: [
[
{
node: "Insert Data to Store",
type: "ai_embedding",
index: 0
},
{
node: "Query Data Tool",
type: "ai_embedding",
index: 0
}
]
]
},
"Default Data Loader": {
ai_document: [
[
{
node: "Insert Data to Store",
type: "ai_document",
index: 0
}
]
]
},
"Query Data Tool": {
ai_tool: [
[
{
node: "AI Agent",
type: "ai_tool",
index: 0
}
]
]
},
"When chat message received": {
main: [
[
{
node: "AI Agent",
type: "main",
index: 0
}
]
]
},
"OpenAI Chat Model": {
ai_languageModel: [
[
{
node: "AI Agent",
type: "ai_languageModel",
index: 0
}
]
]
}
},
pinData: {}
};
const LOCAL_STORAGE_SETTING_KEY$1 = "N8N_AI_TEMPLATES_STARTER_COLLECTION_CALL_OUT_DISMISSED";
const useAITemplatesStarterCollectionStore = defineStore(
STORES.AI_TEMPLATES_STARTER_COLLECTION,
() => {
const telemetry = useTelemetry();
const i18n = useI18n();
const foldersStore = useFoldersStore();
const workflowsStore = useWorkflowsStore();
const posthogStore = usePostHog();
const settingsStore = useSettingsStore();
const calloutDismissedRef = useLocalStorage(LOCAL_STORAGE_SETTING_KEY$1, false);
const calloutDismissed = computed(() => calloutDismissedRef.value);
const isFeatureEnabled = computed(() => {
return settingsStore.isCloudDeployment && posthogStore.getVariant(TEMPLATE_ONBOARDING_EXPERIMENT.name) === TEMPLATE_ONBOARDING_EXPERIMENT.variantStarterPack;
});
const dismissCallout = () => {
calloutDismissedRef.value = true;
};
const createStarterWorkflows = async (projectId, parentFolderId) => {
const collectionFolder = await foldersStore.createFolder(
i18n.baseText("workflows.ai.starter.collection.folder.name"),
projectId,
parentFolderId
);
const agentWitheMemory = {
...AGENT_WITH_MEMORY,
parentFolderId: collectionFolder.id
};
const agentWithTools = {
...AGENT_WITH_TOOLS,
parentFolderId: collectionFolder.id
};
const agentWithKnowledge = {
...AGENT_WITH_KNOWLEDGE,
parentFolderId: collectionFolder.id
};
await workflowsStore.createNewWorkflow(agentWithKnowledge);
await workflowsStore.createNewWorkflow(agentWithTools);
await workflowsStore.createNewWorkflow(agentWitheMemory);
dismissCallout();
return collectionFolder;
};
const trackUserCreatedStarterCollection = (source) => {
telemetry.track("User created AI templates starter collection", {
source
});
};
const trackUserDismissedCallout = () => {
telemetry.track("User dismissed AI templates starter collection callout");
};
const trackUserOpenedWorkflow = (template) => {
telemetry.track("User opened AI template workflow", {
template
});
};
const trackUserExecutedWorkflow = (template, status) => {
telemetry.track("User executed AI template", {
template,
status
});
};
return {
isFeatureEnabled,
calloutDismissed,
dismissCallout,
createStarterWorkflows,
trackUserCreatedStarterCollection,
trackUserDismissedCallout,
trackUserOpenedWorkflow,
trackUserExecutedWorkflow
};
}
);
const PLAYGROUND_1 = {
meta: {
templateId: "37_onboarding_experiments_batch_aug11-1_filter_data"
},
name: "▶️ 1. Filter data coming from an API",
nodes: [
{
parameters: {},
type: "n8n-nodes-base.merge",
typeVersion: 3.2,
position: [448, 176],
id: "01f2f222-4ff2-41ec-afd9-68496d2e0cb3",
name: "Merge"
},
{
parameters: {},
type: "n8n-nodes-base.manualTrigger",
typeVersion: 1,
position: [-768, 192],
id: "e5ef1b32-ce8a-4c71-aa14-6885a09feabe",
name: "When clicking Execute workflow"
},
{
parameters: {
assignments: {
assignments: [
{
id: "2fd0b039-7dd9-4666-bc24-d3a81e6d4b68",
name: "quote_category",
value: "Personal",
type: "string"
}
]
},
options: {}
},
type: "n8n-nodes-base.set",
typeVersion: 3.4,
position: [160, 272],
id: "42d065cd-1580-4b2a-8cc6-796be9a1da2a",
name: "Set Category = Personal"
},
{
parameters: {
assignments: {
assignments: [
{
id: "1ff91e4a-8460-4991-a273-c5f24b4038e9",
name: "quote_category",
value: "team",
type: "string"
}
]
},
options: {}
},
type: "n8n-nodes-base.set",
typeVersion: 3.4,
position: [160, 64],
id: "a5259694-11ed-442c-be2a-e0000926fb30",
name: "Set Category = Team"
},
{
parameters: {
assignments: {
assignments: [
{
id: "c014a174-3f17-41bf-9fa5-19e822427346",
name: "author",
value: "={{ $('Make an API request to get a random quote').item.json.author }}",
type: "string"
},
{
id: "1d60a497-d964-406b-96fc-0206c82d5742",
name: "quote",
value: "={{ $('Make an API request to get a random quote').item.json.quote }}",
type: "string"
},
{
id: "5faf3496-8aa3-4a71-934c-6c5e3f08100b",
name: "quote_category",
value: "={{ $json.quote_category }}",
type: "string"
}
]
},
options: {}
},
type: "n8n-nodes-base.set",
typeVersion: 3.4,
position: [736, 176],
id: "82b78022-f986-4bb0-aac8-f34558d46e5d",
name: "Quote with category"
},
{
parameters: {
content: "The node below is an `HTTP Node`. It makes a request to an API, which returns a single random quote. ",
height: 512,
width: 304,
color: 7
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [-512, -48],
id: "d6145c80-0504-4a0b-bfd7-5e85867b3d76",
name: "Sticky Note3"
},
{
parameters: {
content: 'The `Filter node` checks if the quote contains "you" or "your" , to categorise the quote.\n\nIf matched, we create a `quote_category` variable in the `Set node` , with the value to "Team"',
height: 512,
width: 496,
color: 7
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [-160, -48],
id: "75efc471-b2a7-4cb0-8299-f7ad710ff67e",
name: "Sticky Note5"
},
{
parameters: {
content: "You can reference data input from earlier nodes. We use here the `author` variable which was returned from the first node, the API request.\n\n",
height: 512,
width: 288,
color: 7
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [640, -48],
id: "9df256c6-a437-4a53-a760-e6964e73c5c3",
name: "Sticky Note6"
},
{
parameters: {
content: "The `Merge` combines the outputs of both branches into a single list.\n",
height: 512,
color: 7
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [368, -48],
id: "ad7ec1f3-7a95-444f-a5b8-363fc1224f95",
name: "Sticky Note8"
},
{
parameters: {
content: '### ⏩ Next up: \n\n- Tweak and edit this workflow. It\'s made for you to hack up! \n*Example: Try adding the quote `id` to the final output in the "Quote with category" node.*\n\n- Try out the other workflows in the Playground \n\n\n\n\n',
height: 240,
width: 400,
color: 4
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [960, 96],
id: "0d9362fd-e399-4ce5-ba47-c9ab59b452de",
name: "Sticky Note9"
},
{
parameters: {
content: "**Tip: Ressources**\n- Use the `n8n Assistant` or any LLM like `ChatGPT` to explain a screenshot, fix issues, or create workflows for you\n- Learn and get inspired with [templates](https://n8n.io/workflows/)\n- Follow the [n8n Courses](https://docs.n8n.io/courses/) or find tutorials on Youtube\n- Ask [the community](https://community.n8n.io/) for help \n",
height: 176,
width: 400,
color: 5
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [960, 480],
id: "724338d8-3e2b-43a1-8a3d-a38be2a50ed3",
name: "Sticky Note7"
},
{
parameters: {
content: "## ▶ Click to start\n\n1. Click the orange `Execute Workflow` button \n2. Double-click nodes to view data flows\n2. Re-run to see results change",
height: 448,
width: 368,
color: 4
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [-912, -48],
id: "a05fb79b-a6e6-498d-bdb2-c73ff7898233",
name: "Sticky Note11"
},
{
parameters: {
conditions: {
options: {
caseSensitive: false,
leftValue: "",
typeValidation: "strict",
version: 2
},
conditions: [
{
id: "4b2c3ebb-ad22-4d62-a64e-fdc2837565bc",
leftValue: "={{ $json.quote }}",
rightValue: "you",
operator: {
type: "string",
operation: "contains"
}
},
{
id: "da268099-9c51-4e93-bc02-d8f0eda03ffd",
leftValue: "={{ $json.quote }}",
rightValue: "your",
operator: {
type: "string",
operation: "contains"
}
}
],
combinator: "or"
},
options: {
ignoreCase: true
}
},
type: "n8n-nodes-base.if",
typeVersion: 2.2,
position: [-96, 192],
id: "f2dda369-4176-493e-8c6e-c3390a6968a3",
name: "Filter the quote"
},
{
parameters: {
url: "https://dummyjson.com/quotes/random",
options: {}
},
id: "c4437d01-a813-48a7-ac9a-366740d44428",
name: "Make an API request to get a random quote",
type: "n8n-nodes-base.httpRequest",
typeVersion: 1,
position: [-400, 192]
}
],
connections: {
Merge: {
main: [
[
{
node: "Quote with category",
type: "main",
index: 0
}
]
]
},
"When clicking Execute workflow": {
main: [
[
{
node: "Make an API request to get a random quote",
type: "main",
index: 0
}
]
]
},
"Set Category = Personal": {
main: [
[
{
node: "Merge",
type: "main",
index: 1
}
]
]
},
"Set Category = Team": {
main: [
[
{
node: "Merge",
type: "main",
index: 0
}
]
]
},
"Filter the quote": {
main: [
[
{
node: "Set Category = Team",
type: "main",
index: 0
}
],
[
{
node: "Set Category = Personal",
type: "main",
index: 0
}
]
]
},
"Make an API request to get a random quote": {
main: [
[
{
node: "Filter the quote",
type: "main",
index: 0
}
]
]
}
}
};
const PLAYGROUND_2 = {
meta: {
templateId: "37_onboarding_experiments_batch_aug11-2_process_user_answers"
},
settings: {
executionOrder: "v1"
},
name: "▶️ 2. Process user answers from a form",
nodes: [
{
parameters: {
numberInputs: 3
},
type: "n8n-nodes-base.merge",
typeVersion: 3.2,
position: [960, 336],
id: "f6f94912-64a3-4671-9bda-abb03f4dc42e",
name: "Merge"
},
{
parameters: {
content: "## ▶ Click to start \n\n1. Click the orange `Execute Worfklow` button\n2. Submit the form\n3. Double-click nodes to view data flows\n4. Try different answers",
height: 432,
width: 352,
color: 4
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [-992, 160],
id: "e5382a25-e813-4fba-bd8e-c16918521da7",
name: "Sticky Note11"
},
{
parameters: {
content: "The `Switch` node routes the workflow based on the selected meal type: chicken, vegetarian, or surprise.",
height: 432,
width: 272,
color: 7
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [-592, 160],
id: "ab955ee5-03ea-45cb-afbb-4b36ccfdbda6",
name: "Sticky Note"
},
{
parameters: {
rules: {
values: [
{
conditions: {
options: {
caseSensitive: false,
leftValue: "",
typeValidation: "strict",
version: 2
},
conditions: [
{
id: "c90e7527-e4ff-41a8-9177-ffdf7d25c72e",
leftValue: "={{ $json['What type of meal would you like to cook tonight ? '] }}",
rightValue: "chicken",
operator: {
type: "string",
operation: "contains"
}
}
],
combinator: "and"
},
renameOutput: true,
outputKey: "chicken"
},
{
conditions: {
options: {
caseSensitive: false,
leftValue: "",
typeValidation: "strict",
version: 2
},
conditions: [
{
leftValue: "={{ $json['What type of meal would you like to cook tonight ? '] }}",
rightValue: "vegetarian",
operator: {
type: "string",
operation: "contains"
},
id: "18bd7d98-f5e3-46df-96c6-8d1c5fea7cf2"
}
],
combinator: "and"
},
renameOutput: true,
outputKey: "vegetarian"
},
{
conditions: {
options: {
caseSensitive: false,
leftValue: "",
typeValidation: "strict",
version: 2
},
conditions: [
{
id: "74441f58-e5e5-487c-972d-ec7f9107436d",
leftValue: "={{ $json['What type of meal would you like to cook tonight ? '] }}",
rightValue: "surprise",
operator: {
type: "string",
operation: "contains"
}
}
],
combinator: "and"
},
renameOutput: true,
outputKey: "surprise"
}
]
},
options: {
ignoreCase: true
}
},
type: "n8n-nodes-base.switch",
typeVersion: 3.2,
position: [-512, 336],
id: "6cbc178b-a420-4d57-a107-247600ae00c8",
name: "Route based on meal preference"
},
{
parameters: {
url: "=https://dummyjson.com/recipes/{{$today.weekday}}",
options: {}
},
type: "n8n-nodes-base.httpRequest",
typeVersion: 4.2,
position: [-160, 560],
id: "98e4c862-5bf8-4cd9-8548-62d30b3c548a",
name: "Get a random recipe from the API"
},
{
parameters: {
url: "=https://dummyjson.com/recipes/search?q={{ $json['What type of meal would you like to cook tonight ? '] }}",
options: {}
},
type: "n8n-nodes-base.httpRequest",
typeVersion: 4.2,
position: [-160, 352],
id: "52d53f34-9036-48f8-a71c-f501cc7e37b0",
name: "Get vegetarian recipes from the API"
},
{
parameters: {
url: "=https://dummyjson.com/recipes/search?q=chicken",
options: {}
},
type: "n8n-nodes-base.httpRequest",
typeVersion: 4.2,
position: [-160, 144],
id: "240a9947-81fb-48ba-ac46-27381f4f67b6",
name: "Get chicken recipes from the API"
},
{
parameters: {
content: "These `HTTP nodes` call the API to get recipes based on the users choice.",
height: 816,
width: 304,
color: 7
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [-272, -48],
id: "f27030aa-9cca-4872-b672-b7ab8f307584",
name: "Sticky Note2"
},
{
parameters: {
content: "In the Chicken branch, the API returns an array with 8 chicken recipes.\n\nThe `Split Out` node splits the array into separate items: 8 items, one per recipe.",
height: 576,
width: 224,
color: 7
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [80, -48],
id: "e4bc5319-ae92-4a72-878e-8c83ca80d203",
name: "Sticky Note4"
},
{
parameters: {
content: "The `Form node` displays the selected recipe on the completion screen",
height: 384,
color: 7
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [1152, 208],
id: "6eb7f690-756d-46df-b927-91426e9635da",
name: "Sticky Note5"
},
{
parameters: {
content: "The `Merge` node combines data from all three recipe branches.",
height: 384,
color: 7
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [864, 208],
id: "8e52483c-c740-454b-898b-cf457af693a8",
name: "Sticky Note6"
},
{
parameters: {
formTitle: "n8n Form",
formFields: {
values: [
{
fieldLabel: "What type of meal would you like to cook tonight ? ",
fieldType: "dropdown",
fieldOptions: {
values: [
{
option: "Chicken-based"
},
{
option: "Vegetarian"
},
{
option: "Surprise me! "
}
]
},
requiredField: true
},
{
fieldLabel: "What's your name? ",
requiredField: true
}
]
},
options: {}
},
type: "n8n-nodes-base.formTrigger",
typeVersion: 2.2,
position: [-864, 352],
id: "3e5b2d36-5126-45f7-a81c-c1cfc82a392d",
name: "Trigger when user submits form",
webhookId: "d9a8c65e-486f-4304-a34d-87e9d68aa868"
},
{
parameters: {
content: "We want to suggest 1 recipe only, not 8.\nSo we sort by cooking time with the `Sort` node, and then pick the recipe with lowest cooking time using `Limit` node",
height: 384,
width: 416,
color: 7
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [368, -48],
id: "520e150e-9b22-4ed8-b3f2-1d128ed9e4c2",
name: "Sticky Note7"
},
{
parameters: {
sortFieldsUi: {
sortField: [
{
fieldName: "cookTimeMinutes"
}
]
},
options: {}
},
type: "n8n-nodes-base.sort",
typeVersion: 1,
position: [432, 144],
id: "17834d09-5d83-420f-9109-105e92baffef",
name: "Sort by cooking time"
},
{
parameters: {},
type: "n8n-nodes-base.limit",
typeVersion: 1,
position: [624, 144],
id: "9db21680-c947-44c1-8194-48e42f995755",
name: "Limit to recipe with lowest cooking time"
},
{
parameters: {
operation: "completion",
completionTitle: "Recipe",
completionMessage: "=Hey {{ $('Trigger when user submits form').item.json['What\\'s your name? '] }}, <br /><br />\n\nWhat about cooking a <b>{{ $json.name }}</b> tonight? <br /><br />\n\nIt shouldn't take you more than {{ $json.prepTimeMinutes }} minutes to prepare.<br /><br />\n\n<h3>What you'll need:</h3><br />\n\n<ul>{{ $json.ingredients.map(ingredient => `<li>${ingredient}</li>`).join('') }}</ul><br /><br />\n\n<h3>Instructions</h3><br />\n\n{{ $json.instructions.map((instruction, index) => `${index + 1}. ${instruction}`).join('<br />') }}\n",
options: {
customCss: ":root {\n --font-family: 'Open Sans', sans-serif;\n --font-weight-normal: 400;\n --font-weight-bold: 600;\n --font-size-body: 12px;\n --font-size-label: 14px;\n --font-size-test-notice: 12px;\n --font-size-input: 14px;\n --font-size-header: 20px;\n --font-size-paragraph: 14px;\n --font-size-link: 12px;\n --font-size-error: 12px;\n --font-size-html-h1: 28px;\n --font-size-html-h2: 20px;\n --font-size-html-h3: 16px;\n --font-size-html-h4: 14px;\n --font-size-html-h5: 12px;\n --font-size-html-h6: 10px;\n --font-size-subheader: 14px;\n\n /* Colors */\n --color-background: #fbfcfe;\n --color-test-notice-text: #e6a23d;\n --color-test-notice-bg: #fefaf6;\n --color-test-notice-border: #f6dcb7;\n --color-card-bg: #ffffff;\n --color-card-border: #dbdfe7;\n --color-card-shadow: rgba(99, 77, 255, 0.06);\n --color-link: #7e8186;\n --color-header: #525356;\n --color-label: #555555;\n --color-input-border: #dbdfe7;\n --color-input-text: #71747A;\n --color-focus-border: rgb(90, 76, 194);\n --color-submit-btn-bg: #ff6d5a;\n --color-submit-btn-text: #ffffff;\n --color-error: #ea1f30;\n --color-required: #ff6d5a;\n --color-clear-button-bg: #7e8186;\n --color-html-text: #555;\n --color-html-link: #ff6d5a;\n --color-header-subtext: #7e8186;\n\n /* Border Radii */\n --border-radius-card: 8px;\n --border-radius-input: 6px;\n --border-radius-clear-btn: 50%;\n --card-border-radius: 8px;\n\n /* Spacing */\n --padding-container-top: 24px;\n --padding-card: 24px;\n --padding-test-notice-vertical: 12px;\n --padding-test-notice-horizontal: 24px;\n --margin-bottom-card: 16px;\n --padding-form-input: 12px;\n --card-padding: 24px;\n --card-margin-bottom: 16px;\n\n /* Dimensions */\n --container-width: 448px;\n --submit-btn-height: 48px;\n --checkbox-size: 18px;\n\n /* Others */\n --box-shadow-card: 0px 4px 16px 0px var(--color-card-shadow);\n --opacity-placeholder: 0.5;\n}\n\n.card {\n text-align: left;\n}\n\nul {\n padding-left: 20px;\n}\n\nh4, ul, li {\n text-color: #7e8186!important;\n}\n\n"
}
},
type: "n8n-nodes-base.form",
typeVersion: 1,
position: [1216, 352],
id: "f1291ce7-161a-49bf-9c0c-5bc1227b986c",
name: "Show completion screen with the recipe suggestion",
webhookId: "593b279d-6426-48a0-b28c-44056660bca9"
},
{
parameters: {
content: "**Tip: Send data to n8n**\nYou can trigger a workflow in many ways not just with forms. For example, using a webhook or when a new row is added to a Google Sheet.",
height: 96,
width: 352,
color: 5
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [-992, 608],
id: "16f3bf2a-943d-4399-946f-6444616e8e57",
name: "Sticky Note8"
},
{
parameters: {
fieldToSplitOut: "recipes",
options: {}
},
type: "n8n-nodes-base.splitOut",
typeVersion: 1,
position: [144, 352],
id: "05c93482-4bd4-464c-b7ee-909a0fd0bada",
name: "Split Out the results into separate items"
},
{
parameters: {
fieldToSplitOut: "recipes",
options: {}
},
type: "n8n-nodes-base.splitOut",
typeVersion: 1,
position: [144, 144],
id: "503526fd-c317-4d77-916c-2ff5eb6f63f9",
name: "Split Out the array into 8 items"
}
],
connections: {
Merge: {
main: [
[
{
node: "Show completion screen with the recipe suggestion",
type: "main",
index: 0
}
]
]
},
"Route based on meal preference": {
main: [
[
{
node: "Get chicken recipes from the API",
type: "main",
index: 0
}
],
[
{
node: "Get vegetarian recipes from the API",
type: "main",
index: 0
}
],
[
{
node: "Get a random recipe from the API",
type: "main",
index: 0
}
]
]
},
"Get a random recipe from the API": {
main: [
[
{
node: "Merge",
type: "main",
index: 2
}
]
]
},
"Get vegetarian recipes from the API": {
main: [
[
{
node: "Split Out the results into separate items",
type: "main",
index: 0
}
]
]
},
"Get chicken recipes from the API": {
main: [
[
{
node: "Split Out the array into 8 items",
type: "main",
index: 0
}
]
]
},
"Trigger when user submits form": {
main: [
[
{
node: "Route based on meal preference",
type: "main",
index: 0
}
]
]
},
"Sort by cooking time": {
main: [
[
{
node: "Limit to recipe with lowest cooking time",
type: "main",
index: 0
}
]
]
},
"Limit to recipe with lowest cooking time": {
main: [
[
{
node: "Merge",
type: "main",
index: 0
}
]
]
},
"Show completion screen with the recipe suggestion": {
main: [[]]
},
"Split Out the results into separate items": {
main: [
[
{
node: "Merge",
type: "main",
index: 1
}
]
]
},
"Split Out the array into 8 items": {
main: [
[
{
node: "Sort by cooking time",
type: "main",
index: 0
}
]
]
}
}
};
const PLAYGROUND_3 = {
meta: {
templateId: "37_onboarding_experiments_batch_aug11-3_check_weather_by_location"
},
name: "▶️ 3. Check weather based on user location",
settings: {
executionOrder: "v1"
},
nodes: [
{
parameters: {
jsCode: `const today = new Date().toISOString().slice(0, 10);
const daily = $json.daily;
const index = daily.time.indexOf(today);
if (index === -1) {
throw new Error("Today's forecast not found in response.");
}
return [{
date: today,
temp_max: daily.temperature_2m_max[index],
temp_min: daily.temperature_2m_min[index]
}];
`
},
type: "n8n-nodes-base.code",
typeVersion: 2,
position: [336, -128],
id: "d6463e70-9921-4e6f-acaa-c8d6153254ea",
name: "Get today's high and low"
},
{
parameters: {
content: "**Tip: n8n 🧡 LLM**\n\nUse the n8n Assistant or ChatGPT, Claude, etc. to explain, edit, or create Javascript code for you.",
height: 112,
width: 272,
color: 5
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [240, 96],
id: "30ebd1b4-55c2-45fd-ae30-2b974eee226f",
name: "Sticky Note1"
},
{
parameters: {
content: "## ▶ Start here \n\n1. Click the orange `Execute Worfklow` button \n2. Double-click nodes to view data flows\n3. Note: The form doesnt show up because it runs with [pinned](https://docs.n8n.io/data/data-pinning/) test data (purple highlights)\n3. Unpin the data to run the form normally",
height: 208,
width: 352,
color: 4
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [-1056, -512],
id: "152278ea-a817-4f6d-8053-f129d9038604",
name: "Sticky Note2"
},
{
parameters: {
content: "The `Code` node lets you run Javascript code in your workflow.\n\nWe use it here to extract todays date, max temp, and min temp from the API response.",
height: 352,
width: 272,
color: 7
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [240, -272],
id: "5fcff69f-e059-4827-9241-081e4a7e4a6b",
name: "Sticky Note3"
},
{
parameters: {
content: "This `HTTP node` calls an API to get the citys latitude and longitude.\n\nThe user city input is used as a URL variable.",
height: 352,
width: 272,
color: 7
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [-704, -272],
id: "28813de7-3311-4c46-8b88-946c4c14a99e",
name: "Sticky Note4"
},
{
parameters: {
content: "Another `HTTP node` calls a weather API using the latitude and longitude in the URL.",
height: 352,
width: 272,
color: 7
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [-96, -272],
id: "bc28c149-c4bd-4d68-b597-f7cf2f0ab0c4",
name: "Sticky Note5"
},
{
parameters: {
content: "This `Limit` node keeps only the first item returned by the API.",
height: 352,
width: 256,
color: 7
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [-400, -272],
id: "1d23e68c-5d5c-4383-b6b8-ca552ad3a889",
name: "Sticky Note6"
},
{
parameters: {
formTitle: "What's the weather where you live",
formFields: {
values: [
{
fieldLabel: "Which city do you live in ? ",
fieldType: "textarea",
placeholder: "Paris",
requiredField: true
}
]
},
options: {}
},
type: "n8n-nodes-base.formTrigger",
typeVersion: 2.2,
position: [-944, -128],
id: "beba8fc9-9213-43bb-8f78-08800d629270",
name: "Trigger when user submits form",
webhookId: "a460df1e-c73b-4654-9a21-2987cea55b14"
},
{
parameters: {},
type: "n8n-nodes-base.limit",
typeVersion: 1,
position: [-320, -128],
id: "aa0b1683-0586-465a-bcf2-38cf0617a6fc",
name: "Limit to first item"
},
{
parameters: {
url: "=https://api.open-meteo.com/v1/forecast?latitude={{ $json.lat }}&longitude={{ $json.lon }}&daily=temperature_2m_max,temperature_2m_min",
options: {
response: {
response: {
responseFormat: "json"
}
}
}
},
type: "n8n-nodes-base.httpRequest",
typeVersion: 4.2,
position: [0, -128],
id: "73b40790-3ef6-4091-9cd3-cab673276a7a",
name: "Get weather for that latitude and longitude"
},
{
parameters: {
content: "**Tip: Edit pinned data**\n\nWhen data is pinned, click the ✏ icon in the top right to edit it. Try changing “London” to “Berlin” and rerun the workflow.",
height: 128,
width: 288,
color: 5
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [-1056, 96],
id: "d9390b71-3bf2-4094-b603-3f43988675e9",
name: "Sticky Note"
},
{
parameters: {
url: "=https://nominatim.openstreetmap.org/search?q={{ $json['Which city do you live in ? '] }}&format=json",
options: {
response: {
response: {}
}
}
},
type: "n8n-nodes-base.httpRequest",
typeVersion: 4.2,
position: [-624, -128],
id: "e3ce382a-c21b-4ee8-b366-b28cfe2b1b37",
name: "Get city latitude and longitude"
},
{
parameters: {
content: "This `Limit` node keeps only the first item returned by the API.",
height: 352,
width: 288,
color: 7
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [-1056, -272],
id: "305eea3e-c853-4a8c-a7d4-dd10d81bf099",
name: "Sticky Note7"
}
],
pinData: {
"Trigger when user submits form": [
{
json: {
"Which city do you live in ? ": "London",
submittedAt: "2025-08-01T12:06:25.400+02:00",
formMode: "test"
}
}
]
},
connections: {
"Trigger when user submits form": {
main: [
[
{
node: "Get city latitude and longitude",
type: "main",
index: 0
}
]
]
},
"Limit to first item": {
main: [
[
{
node: "Get weather for that latitude and longitude",
type: "main",
index: 0
}
]
]
},
"Get weather for that latitude and longitude": {
main: [
[
{
node: "Get today's high and low",
type: "main",
index: 0
}
]
]
},
"Get city latitude and longitude": {
main: [
[
{
node: "Limit to first item",
type: "main",
index: 0
}
]
]
}
}
};
const PLAYGROUND_4 = {
meta: {
templateId: "37_onboarding_experiments_batch_aug11-4_create_personalized_email"
},
name: "🔌 4. Create a personalized email",
settings: {
executionOrder: "v1"
},
nodes: [
{
parameters: {
url: "=https://nominatim.openstreetmap.org/search?q={{ $json.City }}&format=json",
options: {
response: {
response: {}
}
}
},
type: "n8n-nodes-base.httpRequest",
typeVersion: 4.2,
position: [-336, -16],
id: "d6ea9452-7fa4-41f6-b9cd-7f12b8e3b686",
name: "Get city latitude and longitude"
},
{
parameters: {
url: "=https://api.open-meteo.com/v1/forecast?latitude={{ $json.lat }}&longitude={{ $json.lon }}&daily=temperature_2m_max,temperature_2m_min",
options: {
response: {
response: {
responseFormat: "json"
}
}
}
},
type: "n8n-nodes-base.httpRequest",
typeVersion: 4.2,
position: [48, -16],
id: "db233160-3f63-47fa-998a-41977a51c2f6",
name: "Get weather"
},
{
parameters: {
assignments: {
assignments: [
{
id: "ea110fbf-b67b-4270-8e55-ffec2f9ddafe",
name: "City",
value: "Paris",
type: "string"
}
]
},
options: {}
},
type: "n8n-nodes-base.set",
typeVersion: 3.4,
position: [-640, -16],
id: "e3c93ca5-2628-41f4-81ea-50c87403b285",
name: "Set your location"
},
{
parameters: {
numberInputs: 3
},
type: "n8n-nodes-base.merge",
typeVersion: 3.2,
position: [416, -208],
id: "21021c33-7b93-4cbe-a592-f7b277ad332e",
name: "Merge",
notesInFlow: false
},
{
parameters: {
aggregate: "aggregateAllItemData",
options: {}
},
type: "n8n-nodes-base.aggregate",
typeVersion: 1,
position: [688, -192],
id: "65312cc9-b31e-4ad3-b5b9-7ccfe066f0fb",
name: "Aggregate"
},
{
parameters: {
jsCode: `const today = new Date().toISOString().slice(0, 10);
const daily = $json.daily;
const index = daily.time.indexOf(today);
if (index === -1) {
throw new Error("Today's forecast not found in response.");
}
return [{
date: today,
temp_max: daily.temperature_2m_max[index],
temp_min: daily.temperature_2m_min[index]
}];
`
},
type: "n8n-nodes-base.code",
typeVersion: 2,
position: [224, -16],
id: "8defc8b4-a50f-41ff-bfb0-bd114e5fcd7c",
name: "Get today's high and low"
},
{
parameters: {},
type: "n8n-nodes-base.limit",
typeVersion: 1,
position: [-112, -16],
id: "a346a114-2981-4c82-91a5-4656b345b0d1",
name: "Limit"
},
{
parameters: {
content: '### Bonus task!\n\nUse the `Gmail node` to send the workflow result via email:\n\n1. Connect the "output" node to the Gmail node\n2. Create your credentials to connect to Gmail ',
height: 448,
width: 288,
color: 4
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [1168, -464],
id: "5398ab1d-4d6b-4308-8129-a3e1ebe7c11c",
name: "Sticky Note5"
},
{
parameters: {},
type: "n8n-nodes-base.manualTrigger",
typeVersion: 1,
position: [-1008, -192],
id: "e378d189-974a-4d8e-a5bc-dd84fe4bc1c1",
name: "1. Click 'Execute workflow",
notesInFlow: false,
notes: "\n"
},
{
parameters: {
content: "## ▶ Start here \n\n1. Click the orange `Execute Worfklow` button \n2. Double-click nodes to view data flows\n3. Try changing variables in `Set your location` node (e.g. set location to London instead of Berlin)",
height: 416,
width: 336,
color: 4
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [-1136, -416],
id: "6ef3cee5-4c05-4611-9372-233b89aedbb9",
name: "Sticky Note6"
},
{
parameters: {
content: "The `Set nodes` below define variables used later in the workflow:\n\n1. Todays day and month\n2. Currency: EUR to USD\n3. Location: Berlin",
height: 784,
color: 7
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [-720, -624],
id: "8d1e0f28-328c-46e7-86a4-d7a063eab933",
name: "Sticky Note"
},
{
parameters: {
assignments: {
assignments: [
{
id: "904f0394-6f4a-498f-98a7-b0526dfd63f0",
name: "current month",
value: "={{$now.format('M')}}",
type: "string"
},
{
id: "c4fd79aa-e889-49c1-86f1-4e5ad672048f",
name: "current day",
value: "={{$now.format('d')}}",
type: "string"
}
]
},
options: {}
},
type: "n8n-nodes-base.set",
typeVersion: 3.4,
position: [-640, -384],
id: "503e303a-99ca-4a88-885b-2738f2067aac",
name: "Set current day and month"
},
{
parameters: {
assignments: {
assignments: [
{
id: "8c17e5ba-1747-46e3-ae41-8f1e9046aa7a",
name: "Convert from currency",
value: "EUR",
type: "string"
},
{
id: "e14ae5dd-7559-4e14-8e25-e627f11d8094",
name: "Convert to currency",
value: "USD",
type: "string"
}
]
},
options: {}
},
type: "n8n-nodes-base.set",
typeVersion: 3.4,
position: [-640, -192],
id: "bc6f48f0-21a1-417a-9724-64eafce2ec1f",
name: "Set exchange currency"
},
{
parameters: {
content: "The `HTTP nodes` below call separate APIs using the previously defined variables to retrieve:\n\n1. Historical events on the same day/month\n2. Currency exchange rate\n3. Weather data ",
height: 784,
width: 256,
color: 7
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [-416, -624],
id: "02b09b86-be1b-47fd-b083-ee6c31b5a83f",
name: "Sticky Note1"
},
{
parameters: {
url: '=http://numbersapi.com/{{ $json["current month"] }}/{{ $json["current day"] }}/date?json',
options: {}
},
type: "n8n-nodes-base.httpRequest",
typeVersion: 4.2,
position: [-336, -384],
id: "0cb9f4df-42db-49b8-b545-e3a7bad28a8f",
name: "Get a historical fact"
},
{
parameters: {
url: "=https://api.frankfurter.dev/v1/latest?base={{ $json['Convert from currency'] }}&symbols={{ $json['Convert to currency'] }}",
options: {}
},
type: "n8n-nodes-base.httpRequest",
typeVersion: 4.2,
position: [-336, -192],
id: "df332c72-8600-4458-a40f-020422bf7818",
name: "Get exchange rates"
},
{
parameters: {
content: "These nodes are explained in the previous workflow: \n▶ 3. Check weather based on user location",
height: 80,
width: 480,
color: 5
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [-128, 144],
id: "e3c29b04-39d5-4d4d-9021-f4eb26e54d95",
name: "Sticky Note7"
},
{
parameters: {
content: "The `Merge` node combines data from the 3 streams, once data for all streams is available.",
height: 352,
width: 224,
color: 7
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [352, -368],
id: "02c84a53-c933-4ad7-a0ce-9a53fbd6b407",
name: "Sticky Note2"
},
{
parameters: {
content: "The `Aggregate` node take the 3 separate items and groups them together into a single item.",
height: 352,
width: 208,
color: 7
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [624, -368],
id: "0ce70667-9587-49d5-96b3-d477fef517b1",
name: "Sticky Note3"
},
{
parameters: {
content: "The `Set node` let us pick the data",
height: 352,
width: 192,
color: 7
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [880, -368],
id: "3587d9df-9ccc-462f-a4b6-e2b3ddaa0e89",
name: "Sticky Note8"
},
{
parameters: {
assignments: {
assignments: [
{
id: "4b651566-5b0d-4f7e-b1d4-ea95dee7fbb5",
name: "On this day",
value: "={{ $json.data[0].text }}",
type: "string"
},
{
id: "cef5bfc7-be8b-4ac4-911d-2b9721c8666d",
name: "Exchange rate",
value: '={{ $json.data[1].rates[$("Set exchange currency").item.json["Convert to currency"]] }}',
type: "string"
},
{
id: "02358dea-7351-49ea-923c-9695ba7003c8",
name: "Daily high",
value: "={{ $json.data[2].temp_max }}°C",
type: "string"
},
{
id: "a8886281-896b-4713-82dd-8a1573b3d1df",
name: "Daily low",
value: "={{ $json.data[2].temp_min }}°C",
type: "string"
}
]
},
options: {}
},
type: "n8n-nodes-base.set",
typeVersion: 3.4,
position: [928, -192],
id: "cef89e73-fa8b-48c1-ad2d-293ac61be2ff",
name: "Select output for the email"
},
{
parameters: {
content: "**Tip: Use credentials**\nAdd [credentials](https://docs.n8n.io/credentials) in n8n to connect apps like Gmail, Slack, or OpenAI and use them in your workflows.",
height: 112,
width: 288,
color: 5
},
type: "n8n-nodes-base.stickyNote",
typeVersion: 1,
position: [1168, 16],
id: "14969990-acce-46f3-a1ab-219ab4a1a858",
name: "Sticky Note9"
},
{
parameters: {
subject: "Daily fact and data",
emailType: "text",
message: "=Hey,\n\nToday in {{ $('Set your location').item.json.City }}:\n- Daily high: {{ $json['Daily high'] }}\n- Daily low: {{ $json['Daily low'] }}\n\n{{ $('Set exchange currency').item.json['Convert from currency'] }} to {{ $('Set exchange currency').item.json['Convert to currency'] }} exchange rate: {{ $json['Exchange rate'] }}\n\nImpress your colleagues by reminding them that: {{ $json['On this day'] }}\n\n(Historical fact generated by numbersapi.com)\n",
options: {}
},
type: "n8n-nodes-base.gmail",
typeVersion: 2.1,
position: [1264, -192],
id: "4a23b2b5-21f7-4a63-a1ab-9f18d6ce2e6a",
name: "Send output via email using Gmail",
webhookId: "65c7b462-bb4a-400c-a556-ef408efcd208",
notesInFlow: true,
notes: "Double-click here to connect!"
}
],
pinData: {},
connections: {
"Get city latitude and longitude": {
main: [
[
{
node: "Limit",
type: "main",
index: 0
}
]
]
},
"Get weather": {
main: [
[
{
node: "Get today's high and low",
type: "main",
index: 0
}
]
]
},
"Set your location": {
main: [
[
{
node: "Get city latitude and longitude",
type: "main",
index: 0
}
]
]
},
Merge: {
main: [
[
{
node: "Aggregate",
type: "main",
index: 0
}
]
]
},
Aggregate: {
main: [
[
{
node: "Select output for the email",
type: "main",
index: 0
}
]
]
},
"Get today's high and low": {
main: [
[
{
node: "Merge",
type: "main",
index: 2
}
]
]
},
Limit: {
main: [
[
{
node: "Get weather",
type: "main",
index: 0
}
]
]
},
"1. Click 'Execute workflow": {
main: [
[
{
node: "Set current day and month",
type: "main",
index: 0
},
{
node: "Set your location",
type: "main",
index: 0
},
{
node: "Set exchange currency",
type: "main",
index: 0
}
]
]
},
"Set current day and month": {
main: [
[
{
node: "Get a historical fact",
type: "main",
index: 0
}
]
]
},
"Set exchange currency": {
main: [
[
{
node: "Get exchange rates",
type: "main",
index: 0
}
]
]
},
"Get a historical fact": {
main: [
[
{
node: "Merge",
type: "main",
index: 0
}
]
]
},
"Get exchange rates": {
main: [
[
{
node: "Merge",
type: "main",
index: 1
}
]
]
},
"Select output for the email": {
main: [[]]
}
}
};
const LOCAL_STORAGE_SETTING_KEY = "N8N_READY_TO_RUN_WORKFLOWS_DISMISSED";
const useReadyToRunWorkflowsStore = defineStore(
STORES.EXPERIMENT_READY_TO_RUN_WORKFLOWS,
() => {
const telemetry = useTelemetry();
const i18n = useI18n();
const foldersStore = useFoldersStore();
const workflowsStore = useWorkflowsStore();
const posthogStore = usePostHog();
const cloudPlanStore = useCloudPlanStore();
const isFeatureEnabled = computed(() => {
return [
BATCH_11AUG_EXPERIMENT.variantReadyToRun,
BATCH_11AUG_EXPERIMENT.variantReadyToRun2,
BATCH_11AUG_EXPERIMENT.variantReadyToRun3
].includes(posthogStore.getVariant(BATCH_11AUG_EXPERIMENT.name)?.toString() ?? "") && cloudPlanStore.userIsTrialing;
});
const calloutDismissedRef = useLocalStorage(LOCAL_STORAGE_SETTING_KEY, false);
const isCalloutDismissed = computed(() => calloutDismissedRef.value);
const dismissCallout = () => {
calloutDismissedRef.value = true;
};
const trackCreateWorkflows = (source) => {
telemetry.track("User created ready to run workflows", {
source
});
};
const trackDismissCallout = () => {
telemetry.track("User dismissed ready to run workflows callout");
};
const trackOpenWorkflow = (template) => {
telemetry.track("User opened ready to run workflow", {
template
});
};
const trackExecuteWorkflow = (template, status) => {
telemetry.track("User executed ready to run workflow", {
template,
status
});
};
function getCardText() {
const variant = posthogStore.getVariant(BATCH_11AUG_EXPERIMENT.name);
switch (variant) {
case BATCH_11AUG_EXPERIMENT.variantReadyToRun:
return i18n.baseText("workflows.readyToRunWorkflows.card");
case BATCH_11AUG_EXPERIMENT.variantReadyToRun2:
return i18n.baseText("workflows.readyToRunWorkflows.card2");
case BATCH_11AUG_EXPERIMENT.variantReadyToRun3:
return i18n.baseText("workflows.readyToRunWorkflows.card3");
default:
return "";
}
}
function getCalloutText() {
const variant = posthogStore.getVariant(BATCH_11AUG_EXPERIMENT.name);
switch (variant) {
case BATCH_11AUG_EXPERIMENT.variantReadyToRun:
return i18n.baseText("workflows.readyToRunWorkflows.callout");
case BATCH_11AUG_EXPERIMENT.variantReadyToRun2:
return i18n.baseText("workflows.readyToRunWorkflows.callout2");
case BATCH_11AUG_EXPERIMENT.variantReadyToRun3:
return i18n.baseText("workflows.readyToRunWorkflows.callout3");
default:
return "";
}
}
const createWorkflows = async (projectId, parentFolderId) => {
const collectionFolder = await foldersStore.createFolder(
i18n.baseText("workflows.readyToRunWorkflows.folder.name"),
projectId,
parentFolderId
);
const playground1 = {
...PLAYGROUND_1,
parentFolderId: collectionFolder.id
};
const playground2 = {
...PLAYGROUND_2,
parentFolderId: collectionFolder.id
};
const playground3 = {
...PLAYGROUND_3,
parentFolderId: collectionFolder.id
};
const playground4 = {
...PLAYGROUND_4,
parentFolderId: collectionFolder.id
};
await workflowsStore.createNewWorkflow(playground4);
await workflowsStore.createNewWorkflow(playground3);
await workflowsStore.createNewWorkflow(playground2);
await workflowsStore.createNewWorkflow(playground1);
dismissCallout();
return collectionFolder;
};
return {
isFeatureEnabled,
isCalloutDismissed,
createWorkflows,
dismissCallout,
trackCreateWorkflows,
trackDismissCallout,
trackOpenWorkflow,
trackExecuteWorkflow,
getCardText,
getCalloutText
};
}
);
export {
useReadyToRunWorkflowsStore as a,
useAITemplatesStarterCollectionStore as u
};