The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"nodes": [
{
"id": "f418ae01-01ea-4794-8903-d5709a29c735",
"name": "Get current date",
"type": "n8n-nodes-base.code",
"position": [
240,
2460
],
"parameters": {
"jsCode": "const monthNames = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n]\n\nconst date = new Date()\nconst year = date.getFullYear()\nconst month = date.getMonth()\n\nlet currentDate = {\n month: month,\n year: year,\n text: `${monthNames[month]} '${year.toString().slice(-2)}`\n}\n\nitems[0].json.currentDate = currentDate\n\nreturn items\n\n// Month > Number e.g. July = 6, December = 11\n// Year > Text\n// Text > Playlist name\n\n// let currentDate = {\n// month: 8, \n// year: '2024',\n// text: `September '23`\n// }\n\n// items[0].json.currentDate = currentDate\n\n// return items\n\n"
},
"typeVersion": 1
},
{
"id": "855e493a-a232-45ef-8fdd-4a8225065c95",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
460,
2580
],
"parameters": {
"width": 1290.936043660723,
"height": 407.6508589002549,
"content": "## Check if the song is present in the database"
},
"typeVersion": 1
},
{
"id": "672ef06c-b812-41c8-8501-cde8b61a4aef",
"name": "Get last 10 liked tracks",
"type": "n8n-nodes-base.spotify",
"position": [
500,
2680
],
"parameters": {
"limit": 10,
"resource": "library"
},
"credentials": {
"spotifyOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "da13c571-6af4-49bf-b8ff-2d54245f6d3e",
"name": "Check if track is saved",
"type": "n8n-nodes-base.nocoDb",
"position": [
940,
2780
],
"parameters": {
"table": "m0dm2y304t7vmuk",
"options": {
"where": "=(uri,eq,{{ $json.track.uri }})",
"fields": [
"uri"
]
},
"operation": "getAll",
"projectId": "pepq760y5lwt5tm",
"returnAll": true,
"authentication": "nocoDbApiToken"
},
"credentials": {
"nocoDbApiToken": {
"name": "<your credential>"
}
},
"typeVersion": 3,
"alwaysOutputData": true
},
{
"id": "9144cda9-f18f-46d9-be2d-9fca4b192dbb",
"name": "Is not saved",
"type": "n8n-nodes-base.if",
"position": [
1160,
2780
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "dbb259d9-e2ec-4a7b-b375-601346dc2571",
"operator": {
"type": "object",
"operation": "empty",
"singleValue": true
},
"leftValue": "={{ $json }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2
},
{
"id": "66b430e2-f46c-43b2-84e7-35c85d2b4403",
"name": "Create song entry",
"type": "n8n-nodes-base.nocoDb",
"position": [
1380,
2700
],
"parameters": {
"table": "m0dm2y304t7vmuk",
"fieldsUi": {
"fieldValues": [
{
"fieldName": "uri",
"fieldValue": "={{ $('For each tracks in liked song').item.json.track.uri }}"
},
{
"fieldName": "added_at",
"fieldValue": "={{ $('For each tracks in liked song').item.json.added_at }}"
},
{
"fieldName": "playlistName",
"fieldValue": "={{ $('Get current date').item.json.currentDate.text }}"
}
]
},
"operation": "create",
"projectId": "pepq760y5lwt5tm",
"authentication": "nocoDbApiToken"
},
"credentials": {
"nocoDbApiToken": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "9bd883ea-2e87-45aa-b8a0-b361ba7c5d9f",
"name": "Get all user playlist",
"type": "n8n-nodes-base.spotify",
"position": [
500,
2220
],
"parameters": {
"resource": "playlist",
"operation": "getUserPlaylists",
"returnAll": true
},
"credentials": {
"spotifyOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "3a0dad98-4571-4fb7-b366-0060d35b65fe",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
460,
2080
],
"parameters": {
"width": 1481.5336029736159,
"height": 416.7665808180022,
"content": "## Check if the playlist present in the database"
},
"typeVersion": 1
},
{
"id": "e793b97c-cc29-47b0-8aa7-015fa631bc37",
"name": "Get monthly playlist",
"type": "n8n-nodes-base.filter",
"position": [
720,
2220
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "56173299-d774-4cb4-b26f-4dca294dda1d",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.name }}",
"rightValue": "={{ $('Get current date').item.json.currentDate.text }}"
}
]
}
},
"typeVersion": 2,
"alwaysOutputData": true
},
{
"id": "502ea9e2-7f03-4a8a-860e-90d63e42ee33",
"name": "Get playlist in DB",
"type": "n8n-nodes-base.nocoDb",
"position": [
1160,
2120
],
"parameters": {
"table": "mchan0xys9h7h7e",
"options": {
"where": "=(name,eq,{{ $('Get current date').item.json.currentDate.text }})"
},
"operation": "getAll",
"projectId": "pepq760y5lwt5tm",
"returnAll": true,
"authentication": "nocoDbApiToken"
},
"credentials": {
"nocoDbApiToken": {
"name": "<your credential>"
}
},
"typeVersion": 3,
"alwaysOutputData": true
},
{
"id": "3d2bece0-8096-4ee1-a3b9-ae91b83f0957",
"name": "Monthly playlist exist in Spotify ?",
"type": "n8n-nodes-base.if",
"position": [
940,
2220
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "a2d9e3e0-a906-4ed9-9e23-166f781c86b1",
"operator": {
"type": "object",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2
},
{
"id": "d983b940-2f8d-4823-aaaf-d1bfa4428b41",
"name": "Playlist exist in DB ?",
"type": "n8n-nodes-base.if",
"position": [
1380,
2120
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "9485c9d4-ecdc-4d0e-a576-c7db5787c069",
"operator": {
"type": "object",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2
},
{
"id": "c694ab19-bca7-4dd4-8d10-cf8a1adab341",
"name": "Create playlist in Spotify",
"type": "n8n-nodes-base.spotify",
"position": [
1160,
2320
],
"parameters": {
"name": "={{ $('Get current date').item.json.currentDate.text }}",
"resource": "playlist",
"operation": "create",
"additionalFields": {
"description": "Monthly playlist"
}
},
"credentials": {
"spotifyOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "dc9dc3b5-cef7-412b-b3f8-5ec011c2746d",
"name": "Create playlist in DB1",
"type": "n8n-nodes-base.nocoDb",
"position": [
1380,
2320
],
"parameters": {
"table": "mchan0xys9h7h7e",
"fieldsUi": {
"fieldValues": [
{
"fieldName": "uri",
"fieldValue": "={{ $json.uri }}"
},
{
"fieldName": "name",
"fieldValue": "={{ $json.name }}"
},
{
"fieldName": "description",
"fieldValue": "={{ $json.description}}"
}
]
},
"operation": "create",
"projectId": "pepq760y5lwt5tm",
"authentication": "nocoDbApiToken"
},
"credentials": {
"nocoDbApiToken": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "0356c3a4-dc20-42b0-b069-045048768939",
"name": "Create playlist in DB",
"type": "n8n-nodes-base.nocoDb",
"position": [
1600,
2200
],
"parameters": {
"table": "mchan0xys9h7h7e",
"fieldsUi": {
"fieldValues": [
{
"fieldName": "uri",
"fieldValue": "={{ $('Get monthly playlist').item.json.uri }}"
},
{
"fieldName": "name",
"fieldValue": "={{ $('Get monthly playlist').item.json.name }}"
},
{
"fieldName": "description",
"fieldValue": "={{ $('Get monthly playlist').item.json.description }}"
}
]
},
"operation": "create",
"projectId": "pepq760y5lwt5tm",
"authentication": "nocoDbApiToken"
},
"credentials": {
"nocoDbApiToken": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "e2c86f04-725c-4af7-b3c2-9c22e2dc64bf",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
2040,
2460
],
"parameters": {
"mode": "chooseBranch",
"output": "empty"
},
"typeVersion": 2.1
},
{
"id": "036e0d74-3383-44e9-991d-7e062b982b51",
"name": "Clean op",
"type": "n8n-nodes-base.noOp",
"position": [
1820,
2200
],
"parameters": {},
"typeVersion": 1
},
{
"id": "323c9746-f713-4a3d-9af5-9579ec767fca",
"name": "Clean op2",
"type": "n8n-nodes-base.noOp",
"position": [
1600,
2800
],
"parameters": {},
"typeVersion": 1
},
{
"id": "3b0be7ca-c47b-4524-b72a-c37f25c5e4d0",
"name": "Get this month playlist in DB",
"type": "n8n-nodes-base.nocoDb",
"position": [
2260,
2460
],
"parameters": {
"table": "mchan0xys9h7h7e",
"options": {
"where": "=(name,eq,{{ $('Get current date').item.json.currentDate.text }})"
},
"operation": "getAll",
"projectId": "pepq760y5lwt5tm",
"returnAll": true,
"authentication": "nocoDbApiToken"
},
"credentials": {
"nocoDbApiToken": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "733077e4-c474-4c95-ba05-d0b2375475ad",
"name": "Get this month tracks in DB",
"type": "n8n-nodes-base.nocoDb",
"position": [
2480,
2460
],
"parameters": {
"table": "m0dm2y304t7vmuk",
"options": {
"where": "=(playlistName,eq,{{ $('Get current date').item.json.currentDate.text }})"
},
"operation": "getAll",
"projectId": "pepq760y5lwt5tm",
"returnAll": true,
"authentication": "nocoDbApiToken"
},
"credentials": {
"nocoDbApiToken": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "6c8ef70f-542d-4454-9ae6-8f4e9778beb0",
"name": "Add song to the playlist",
"type": "n8n-nodes-base.spotify",
"position": [
3580,
2460
],
"parameters": {
"id": "={{ $('Get this month playlist in DB').item.json.uri }}",
"trackID": "={{ $('For each monthly tracks in DB').item.json.uri }}",
"resource": "playlist",
"additionalFields": {}
},
"credentials": {
"spotifyOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "034cd38d-4800-4f9c-9b67-453fdb2afa3c",
"name": "For each tracks in liked song",
"type": "n8n-nodes-base.splitInBatches",
"position": [
720,
2680
],
"parameters": {
"options": {
"reset": false
}
},
"typeVersion": 3
},
{
"id": "90ff5c0b-e842-437f-be85-a5938288c513",
"name": "For each monthly tracks in DB",
"type": "n8n-nodes-base.splitInBatches",
"position": [
2700,
2460
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "decf36a4-fb8c-41eb-ae15-7ba36d621ad7",
"name": "Get this month tracks in Spotify",
"type": "n8n-nodes-base.spotify",
"position": [
2920,
2560
],
"parameters": {
"id": "={{ $('Get this month playlist in DB').item.json.uri }}",
"resource": "playlist",
"operation": "getTracks",
"returnAll": true
},
"credentials": {
"spotifyOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1,
"alwaysOutputData": true
},
{
"id": "d322a655-e80b-4277-87d9-93e927b2f372",
"name": "Filter1",
"type": "n8n-nodes-base.filter",
"position": [
3140,
2560
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "a11640e1-f22a-4ce9-abff-976efc57e1d3",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $('For each monthly tracks in DB').item.json.uri }}",
"rightValue": "={{ $json.track.uri }}"
}
]
}
},
"executeOnce": false,
"typeVersion": 2,
"alwaysOutputData": true
},
{
"id": "5027f98d-b973-405f-81cf-534df794325f",
"name": "Song is not present in the playlist ?",
"type": "n8n-nodes-base.if",
"position": [
3360,
2560
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "1beb843e-53da-48ce-9717-d7797232e4ae",
"operator": {
"type": "object",
"operation": "empty",
"singleValue": true
},
"leftValue": "={{ $json }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2
},
{
"id": "cd2e3a28-24c1-47d7-ad30-c836e08ad40f",
"name": "Clean op1",
"type": "n8n-nodes-base.noOp",
"position": [
3800,
2560
],
"parameters": {},
"typeVersion": 1
},
{
"id": "56bbb0e9-3ee5-48e3-b0bf-48e8d026daa9",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
2220,
2400
],
"parameters": {
"width": 1733.785946789966,
"height": 351.94195615011336,
"content": "## Check if the song is in the Spotify playlist. If not, add it."
},
"typeVersion": 1
},
{
"id": "9834163b-0991-4910-bb4f-cf4557bfa0d5",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
20,
2460
],
"parameters": {
"rule": {
"interval": [
{
"field": "minutes"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "72a3c48f-a759-4e0c-b7bb-9f69a5f4377e",
"name": "End",
"type": "n8n-nodes-base.noOp",
"position": [
4100,
2260
],
"parameters": {},
"typeVersion": 1
}
],
"connections": {
"Merge": {
"main": [
[
{
"node": "Get this month playlist in DB",
"type": "main",
"index": 0
}
]
]
},
"Filter1": {
"main": [
[
{
"node": "Song is not present in the playlist ?",
"type": "main",
"index": 0
}
]
]
},
"Clean op": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Clean op1": {
"main": [
[
{
"node": "For each monthly tracks in DB",
"type": "main",
"index": 0
}
]
]
},
"Clean op2": {
"main": [
[
{
"node": "For each tracks in liked song",
"type": "main",
"index": 0
}
]
]
},
"Is not saved": {
"main": [
[
{
"node": "Create song entry",
"type": "main",
"index": 0
}
],
[
{
"node": "Clean op2",
"type": "main",
"index": 0
}
]
]
},
"Get current date": {
"main": [
[
{
"node": "Get all user playlist",
"type": "main",
"index": 0
},
{
"node": "Get last 10 liked tracks",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Get current date",
"type": "main",
"index": 0
}
]
]
},
"Create song entry": {
"main": [
[
{
"node": "Clean op2",
"type": "main",
"index": 0
}
]
]
},
"Get playlist in DB": {
"main": [
[
{
"node": "Playlist exist in DB ?",
"type": "main",
"index": 0
}
]
]
},
"Get monthly playlist": {
"main": [
[
{
"node": "Monthly playlist exist in Spotify ?",
"type": "main",
"index": 0
}
]
]
},
"Create playlist in DB": {
"main": [
[
{
"node": "Clean op",
"type": "main",
"index": 0
}
]
]
},
"Get all user playlist": {
"main": [
[
{
"node": "Get monthly playlist",
"type": "main",
"index": 0
}
]
]
},
"Create playlist in DB1": {
"main": [
[
{
"node": "Clean op",
"type": "main",
"index": 0
}
]
]
},
"Check if track is saved": {
"main": [
[
{
"node": "Is not saved",
"type": "main",
"index": 0
}
]
]
},
"Playlist exist in DB ?": {
"main": [
[
{
"node": "Clean op",
"type": "main",
"index": 0
}
],
[
{
"node": "Create playlist in DB",
"type": "main",
"index": 0
}
]
]
},
"Add song to the playlist": {
"main": [
[
{
"node": "Clean op1",
"type": "main",
"index": 0
}
]
]
},
"Get last 10 liked tracks": {
"main": [
[
{
"node": "For each tracks in liked song",
"type": "main",
"index": 0
}
]
]
},
"Create playlist in Spotify": {
"main": [
[
{
"node": "Create playlist in DB1",
"type": "main",
"index": 0
}
]
]
},
"Get this month tracks in DB": {
"main": [
[
{
"node": "For each monthly tracks in DB",
"type": "main",
"index": 0
}
]
]
},
"For each monthly tracks in DB": {
"main": [
[
{
"node": "End",
"type": "main",
"index": 0
}
],
[
{
"node": "Get this month tracks in Spotify",
"type": "main",
"index": 0
}
]
]
},
"For each tracks in liked song": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
],
[
{
"node": "Check if track is saved",
"type": "main",
"index": 0
}
]
]
},
"Get this month playlist in DB": {
"main": [
[
{
"node": "Get this month tracks in DB",
"type": "main",
"index": 0
}
]
]
},
"Get this month tracks in Spotify": {
"main": [
[
{
"node": "Filter1",
"type": "main",
"index": 0
}
]
]
},
"Monthly playlist exist in Spotify ?": {
"main": [
[
{
"node": "Get playlist in DB",
"type": "main",
"index": 0
}
],
[
{
"node": "Create playlist in Spotify",
"type": "main",
"index": 0
}
]
]
},
"Song is not present in the playlist ?": {
"main": [
[
{
"node": "Add song to the playlist",
"type": "main",
"index": 0
}
],
[
{
"node": "Clean op1",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
nocoDbApiTokenspotifyOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
Effortlessly keep your Spotify library organised by automatically adding newly liked songs to a dedicated monthly playlist, ensuring you never lose track of your favourites amid daily discoveries. This workflow suits music enthusiasts who frequently save tracks but want a curated collection without manual effort, delivering a seamless way to build evolving playlists that reflect your tastes over time. The key step involves querying your liked tracks via the Spotify integration, cross-checking against a NocoDB database to avoid duplicates, and then appending fresh additions to the appropriate playlist.
Use this workflow when you like songs sporadically and prefer automated monthly curation to maintain a growing archive without sifting through your entire library. Avoid it if you rarely add likes or need real-time updates, as the scheduled trigger runs periodically rather than instantly. Common variations include adjusting the cron schedule for daily runs or filtering tracks by genre before adding them to the playlist.
About this workflow
Add Liked Songs To A Spotify Monthly Playlist. Uses stickyNote, spotify, nocoDb, noOp. Scheduled trigger; 30 nodes.
Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
> This Workflow is a port of Add saved songs to a monthly playlist from IFTTT.
This n8n workflow automatically retrieves the monthly CrUX (Chrome User Experience) Report from Google BigQuery and updates the data in NocoDB. It removes the previous month’s data before inserting th
This automation template allows you to automatically receive news from RSS feeds, process their content, and publish or schedule posts on various social media platforms using PostPulse.
Send Google Analytics Data To A I To Analyze Then Save Results In Baserow. Uses scheduleTrigger, manualTrigger, stickyNote, googleAnalytics. Scheduled trigger; 22 nodes.
This n8n template automates daily backups of workflows and credentials to S3-compatible storage with automatic retention management. Designed for self-hosted n8n instances requiring disaster recovery