Substack Notes Scheduler (JSON)
Save time, stay consistent, and let automation handle the posting for you!
📦⚡ Want to skip the setup and dive right in?
Grab my exported workflow JSON below - just copy-paste it into your own n8n instance and you’re ready to roll!
{
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 6
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
0,
0
],
"id": "0dd59a2c-726f-4e83-9607-20f12823cd6c",
"name": "Schedule Trigger"
},
{
"parameters": {
"documentId": {
"
__rl": true,
"value": "1o
_JDKcwWMRJVr1bxiBDELwU23YjMA78ZgCD1gAmFrHo",
"mode": "list",
"cachedResultName": "Substack Notes drafts",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1o_JDKcwWMRJVr1bxiBDELwU23YjMA78ZgCD1gAmFrHo/edit?usp=drivesdk"
},
"sheetName": {
"
__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "Drafts",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1o_JDKcwWMRJVr1bxiBDELwU23YjMA78ZgCD1gAmFrHo/edit#gid=0"
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
208,
0
],
"id": "46151c11-5a98-4dac-960c-b509e08468f9",
"name": "Get row(s) in sheet",
"credentials": {
"googleSheetsOAuth2Api": {
"id": "xd4WsMz5QECK83x8",
"name": "Google Sheets account"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": false,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "0b5f203b-cf72-484a-8298-37626d130daa",
"leftValue": "={{ $json.exhausted.toString() }}",
"rightValue": "true",
"operator": {
"type": "string",
"operation": "notEquals"
}
}
],
"combinator": "and"
},
"options": {
"ignoreCase": true
}
},
"type": "n8n-nodes-base.filter",
"typeVersion": 2.2,
"position": [
416,
0
],
"id": "ceaa4e45-47f0-4c54-9e1c-18efb7a56173",
"name": "Filter"
},
{
"parameters": {},
"type": "n8n-nodes-base.limit",
"typeVersion": 1,
"position": [
624,
0
],
"id": "2b74c81f-c715-4600-ad30-94b0653043f0",
"name": "Limit"
},
{
"parameters": {
"resource": "note",
"operation": "create",
"body": "={{ $json.content }}",
"contentType": "advanced",
"attachment": "link",
"linkUrl": "={{ $json.link }}"
},
"type": "n8n-nodes-substack.substack",
"typeVersion": 1,
"position": [
816,
0
],
"id": "70652a65-b24a-40b5-bd14-cce3805221ef",
"name": "Create note",
"credentials": {
"substackApi": {
"id": "S0ZbGy9f6anXZDSu",
"name": "Substack account"
}
}
},
{
"parameters": {
"operation": "appendOrUpdate",
"documentId": {
"
__rl": true,
"value": "1o
_JDKcwWMRJVr1bxiBDELwU23YjMA78ZgCD1gAmFrHo",
"mode": "list",
"cachedResultName": "Substack Notes drafts",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1o_JDKcwWMRJVr1bxiBDELwU23YjMA78ZgCD1gAmFrHo/edit?usp=drivesdk"
},
"sheetName": {
"
__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "Drafts",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1o_JDKcwWMRJVr1bxiBDELwU23YjMA78ZgCD1gAmFrHo/edit#gid=0"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"exhausted": "TRUE",
"id": "={{ $('Limit').item.json.id }}"
},
"matchingColumns": [
"id"
],
"schema": [
{
"id": "id",
"displayName": "id",
"required": false,
"defaultMatch": true,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "link",
"displayName": "link",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "content",
"displayName": "content",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "exhausted",
"displayName": "exhausted",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
1024,
0
],
"id": "ece91640-59cb-418e-9d61-f43d8b06ce45",
"name": "Append or update row in sheet",
"credentials": {
"googleSheetsOAuth2Api": {
"id": "xd4WsMz5QECK83x8",
"name": "Google Sheets account"
}
}
}
],
"connections": {
"Schedule Trigger": {
"main": [
[
{
"node": "Get row(s) in sheet",
"type": "main",
"index": 0
}
]
]
},
"Get row(s) in sheet": {
"main": [
[
{
"node": "Filter",
"type": "main",
"index": 0
}
]
]
},
"Filter": {
"main": [
[
{
"node": "Limit",
"type": "main",
"index": 0
}
]
]
},
"Limit": {
"main": [
[
{
"node": "Create note",
"type": "main",
"index": 0
}
]
]
},
"Create note": {
"main": [
[
{
"node": "Append or update row in sheet",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"meta": {
"templateCredsSetupCompleted": true,
"instanceId": "992ac2542863ba689f62908163525ecb734f9f80532de01b501f2657b08b56c0"
}
}



i think Substack is pretty strict for scraping the website.
As of now, the scheduler does not work. It keeps giving the Forbidden access error @Jakub Slys 🤖 , is it possible for you to guide me if I am missing something. I have followed your guide word by word but still when posting the note, it throws an error Forbidden. It fetches all the notes, earlier was fetching Posts as well (not anymore) but posting seems to be closed by Substack now. Your guidance will help a lot.