{ "meta": { "instanceId": "bb6a1286a4ce98dce786d6c2748b867c1252d53458c87d87fbf6824b862d4c9c" }, "nodes": [ { "id": "faade37e-908d-494c-af74-93c8f01adcc5", "name": "Everyday at 7PM", "type": "n8n-nodes-base.scheduleTrigger", "position": [ 440, 520 ], "parameters": { "rule": { "interval": [ { "field": "cronExpression", "expression": "0 0 19 * * *" } ] } }, "typeVersion": 1.2 }, { "id": "4abddfea-fee9-419c-92c4-3055faa2dd09", "name": "Airtable Get Today's Orders", "type": "n8n-nodes-base.airtable", "position": [ 900, 520 ], "parameters": { "base": { "__rl": true, "mode": "list", "value": "appdtUVSpfWswMwNC", "cachedResultUrl": "https://airtable.com/appdtUVSpfWswMwNC", "cachedResultName": "Untitled Base" }, "table": { "__rl": true, "mode": "list", "value": "tblu6F5rLbR3Axtgj", "cachedResultUrl": "https://airtable.com/appdtUVSpfWswMwNC/tblu6F5rLbR3Axtgj", "cachedResultName": "orders" }, "options": {}, "operation": "search", "filterByFormula": "=AND(time < \"{{ $json.now }}\", time > \"{{ $json.yesterday }}\")" }, "credentials": { "airtableTokenApi": { "id": "uSxVhc7fcMM7uPM2", "name": "Airtable Personal Access Token account" } }, "typeVersion": 2.1 }, { "id": "ea29159e-3674-4385-a0bd-2a9df7d7117c", "name": "Yesterday Date", "type": "n8n-nodes-base.code", "position": [ 660, 520 ], "parameters": { "jsCode": "// Create a new date object for yesterday, 7pm\nconst yesterday = new Date();\nyesterday.setDate( new Date().getDate() - 1); \nyesterday.setHours(19, 0, 0, 0);\nconst isoString = yesterday.toISOString();\nreturn {yesterday:isoString, now:new Date().toISOString()}" }, "typeVersion": 2 }, { "id": "8254aa63-2682-4c48-8843-c93830c724de", "name": "HTML", "type": "n8n-nodes-base.html", "position": [ 1120, 520 ], "parameters": { "html": "\n\n\n \n\n\n \n \n {{ Object.keys($input.first().json).map(propname=>'').join('') \n }}\n \n \n {{ $input.all().map(order=>{\n \n return \"\"+Object.values(order.json).map(prop=>{\n return \"\"\n }).join('') +\"\"\n }).join('') \n }}\n
'+propname+'
\"+prop+\"
\n\n\n\n\n" }, "executeOnce": true, "typeVersion": 1.2 }, { "id": "5e9f6ad7-e4fc-41e3-991b-cae9210dfb71", "name": "Set Order Fields", "type": "n8n-nodes-base.set", "position": [ 660, 220 ], "parameters": { "options": {}, "assignments": { "assignments": [ { "id": "2c2f9e3c-696a-466a-8bfe-5c8aa942c9ab", "name": "time", "type": "string", "value": "={{ new Date().toISOString() }}" }, { "id": "5618b2a7-8149-469d-87ee-535f1adac121", "name": "orderID", "type": "string", "value": "={{ $json.body.orderID }}" }, { "id": "dc31db55-24e4-468f-a9fd-456298f5e5ab", "name": "orderPrice", "type": "number", "value": "={{ $json.body.orderPrice }}" } ] } }, "typeVersion": 3.4 }, { "id": "68eaa8f7-3b67-484e-8bad-87e621adc1df", "name": "Send to Gmail", "type": "n8n-nodes-base.gmail", "position": [ 1340, 520 ], "parameters": { "sendTo": "axelrose20272027@gmail.com", "message": "={{ $json.html }}", "options": {}, "subject": "Daily Order Summary" }, "credentials": { "gmailOAuth2": { "id": "qMvN3j2E5MFAguNF", "name": "Gmail account" } }, "typeVersion": 2.1 }, { "id": "9f22bedc-fbe1-421b-8212-189c7d436cab", "name": "Store Order", "type": "n8n-nodes-base.airtable", "position": [ 900, 220 ], "parameters": { "base": { "__rl": true, "mode": "list", "value": "appdtUVSpfWswMwNC", "cachedResultUrl": "https://airtable.com/appdtUVSpfWswMwNC", "cachedResultName": "Untitled Base" }, "table": { "__rl": true, "mode": "list", "value": "tblu6F5rLbR3Axtgj", "cachedResultUrl": "https://airtable.com/appdtUVSpfWswMwNC/tblu6F5rLbR3Axtgj", "cachedResultName": "orders" }, "columns": { "value": { "orderID": 0, "customerID": 0, "orderPrice": 0 }, "schema": [ { "id": "time", "type": "dateTime", "display": true, "removed": false, "readOnly": false, "required": false, "displayName": "time", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "orderID", "type": "number", "display": true, "removed": false, "readOnly": false, "required": false, "displayName": "orderID", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "customerID", "type": "number", "display": true, "removed": false, "readOnly": false, "required": false, "displayName": "customerID", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "orderPrice", "type": "number", "display": true, "removed": false, "readOnly": false, "required": false, "displayName": "orderPrice", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "orderStatus", "type": "string", "display": true, "removed": false, "readOnly": false, "required": false, "displayName": "orderStatus", "defaultMatch": false, "canBeUsedToMatch": true } ], "mappingMode": "autoMapInputData", "matchingColumns": [] }, "options": { "typecast": true }, "operation": "create" }, "credentials": { "airtableTokenApi": { "id": "uSxVhc7fcMM7uPM2", "name": "Airtable Personal Access Token account" } }, "typeVersion": 2.1 }, { "id": "6ace0e8f-85e1-45bc-ae81-331c5722ef46", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [ 340, 160 ], "parameters": { "width": 857.9236217062975, "height": 220.18022408852067, "content": "### New order is sent to the Webhook via POST with params {orderID, orderPrice}" }, "typeVersion": 1 }, { "id": "6907ae8d-90b7-4e07-883d-3ebd4440d811", "name": "Sticky Note1", "type": "n8n-nodes-base.stickyNote", "position": [ 340, 460 ], "parameters": { "width": 1202.2434730902464, "height": 235.62797364881823, "content": "### Daily summary sent to email at 7PM" }, "typeVersion": 1 }, { "id": "848c6acb-2f9c-4d85-8349-a4a31204922b", "name": "Sticky Note2", "type": "n8n-nodes-base.stickyNote", "position": [ -620, -80 ], "parameters": { "color": 4, "width": 607.7708924207209, "height": 893.1187181589532, "content": "# Aggregate Daily Orders with Airtable\n### This workflow will collect order data as it is produced, then send a summary email of all orders at the end of every day, formatted in a table.\n\n## Setup:\n 1. Create a new table in Airtable and give it a field *time* with type date, *orderID* with type number, and *orderPrice* also with type number. \n 2. Create a new access token if you haven't already at https://airtable.com/create/tokens/new. Make sure to give the token the scopes *data.records:read*, *data.records:write*, *schema.bases:read* and access to whichever table you choose to store the orders. A pop-up window appears with the token. Use this token to make `Create New Credential` > `Access Token` for Airtable in the `Store Order` and `Airtable Get Today's Orders` nodes.\n 3. Create access credentials for your Gmail as described here: https://developers.google.com/workspace/guides/create-credentials. Use the credentials from your *client_secret.json* in the `Send to Gmail` node.\n 4. In the `Store Order` node, change *Base* and *Table* to the database and table in your Airtable account you wish to use to store orders. Make sure to use these same values in the `Airtable Get Today's Orders` node.\n 5. Every time an order is created in your system, send a POST request to Webhook from your order software. Each request must contain a single order containing fields *'orderID'* and *'orderPrice'* (or, edit `Set Order Fields` to select which incoming fields you wish to save)\n 6. Change the schedule time for sending email from `Everyday at 7PM` to whichever time you choose. \n \n\n## Test:\n- Activate the workflow.\n- From the node `Webhook`, copy *Production URL*\n- Send the following CURL request to the URL given to you:\n` curl -X POST -H \"Content-Type: application/json\" -d '{\"orderID\": 12345, \"orderPrice\": 99.99}' YOUR_URL_HERE`\n- It should say *Node executed successfully*. Now check your Airtable and confirm the order was stored in the right place." }, "typeVersion": 1 }, { "id": "d9a5ef05-beba-480f-967e-840cf1b71248", "name": "Sticky Note4", "type": "n8n-nodes-base.stickyNote", "position": [ 200, 240 ], "parameters": { "color": 3, "width": 170, "height": 80, "content": "- New Order!" }, "typeVersion": 1 }, { "id": "0f433e34-79cd-42d0-9b56-4a306eb91907", "name": "Sticky Note5", "type": "n8n-nodes-base.stickyNote", "position": [ 200, 540 ], "parameters": { "color": 3, "width": 170, "height": 80, "content": " - It's 7PM!" }, "typeVersion": 1 }, { "id": "fb9c4b49-ee1f-4233-8277-4c35fb423fde", "name": "Webhook", "type": "n8n-nodes-base.webhook", "position": [ 440, 220 ], "webhookId": "e9e62c98-390d-4d16-bc77-a13b043bf1cf", "parameters": { "path": "e9e62c98-390d-4d16-bc77-a13b043bf1cf", "options": {}, "httpMethod": "POST" }, "typeVersion": 2 } ], "pinData": {}, "connections": { "HTML": { "main": [ [ { "node": "Send to Gmail", "type": "main", "index": 0 } ] ] }, "Webhook": { "main": [ [ { "node": "Set Order Fields", "type": "main", "index": 0 } ] ] }, "Yesterday Date": { "main": [ [ { "node": "Airtable Get Today's Orders", "type": "main", "index": 0 } ] ] }, "Everyday at 7PM": { "main": [ [ { "node": "Yesterday Date", "type": "main", "index": 0 } ] ] }, "Set Order Fields": { "main": [ [ { "node": "Store Order", "type": "main", "index": 0 } ] ] }, "Airtable Get Today's Orders": { "main": [ [ { "node": "HTML", "type": "main", "index": 0 } ] ] } } }