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": "fc128eed-1666-46b8-8feb-e6ddf05e85d1",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
380,
240
],
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 2
}
]
}
},
"typeVersion": 1.2
},
{
"id": "830708eb-197b-4bf7-95da-893d78329ab2",
"name": "Strava",
"type": "n8n-nodes-base.strava",
"position": [
380,
480
],
"parameters": {
"limit": 10,
"operation": "getAll"
},
"typeVersion": 1.1
},
{
"id": "de776ebf-3ad5-4c4c-b0c8-7bc74cba5446",
"name": "Code",
"type": "n8n-nodes-base.code",
"position": [
380,
740
],
"parameters": {
"jsCode": "// Obt\u00e9n los items del nodo \"Strava\"\nconst stravaItems = $('strava_last').all();\n\n// Obt\u00e9n los items del nodo \"ultimas_id\"\nconst ultimasGuardadasItems = $('saved_last').all();\n\n// Extrae las referencias guardadas en un Set, asegurando el formato como cadena\nconst referenciasGuardadas = new Set(\n ultimasGuardadasItems.map(item => String(item.json.id))\n);\n\n// Filtra los items de \"Strava\" cuyos IDs no est\u00e9n en las referencias guardadas\nconst filteredItems = stravaItems.filter(item => {\n // Convertir el ID actual de Strava a cadena para comparar correctamente\n return !referenciasGuardadas.has(String(item.json.id));\n});\n\n// Depuraci\u00f3n: imprime las referencias y los resultados\nconsole.log('Referencias guardadas:', [...referenciasGuardadas]);\nconsole.log('Items filtrados:', filteredItems);\n\n// Devuelve los items filtrados\nreturn filteredItems;\n\n\n"
},
"typeVersion": 2
},
{
"id": "c8a93e6e-67fc-4f6d-bcde-83d3a885c622",
"name": "Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
900,
740
],
"parameters": {
"columns": {
"value": {
"Kms": "={{ $json.distancia }}",
"Ref": "={{ $json.id }}",
"Fecha": "={{ $json.fecha }}",
"Track": "=http://www.strava.com/activities/{{ $json.id }}",
"Tiempo": "={{ $json.tiempo }}",
"Desnivel": "={{ $json.elevacion }}"
},
"schema": [
{
"id": "Fecha",
"type": "string",
"display": true,
"required": false,
"displayName": "Fecha",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Kms",
"type": "string",
"display": true,
"required": false,
"displayName": "Kms",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Tiempo",
"type": "string",
"display": true,
"required": false,
"displayName": "Tiempo",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ref",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Ref",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Track",
"type": "string",
"display": true,
"required": false,
"displayName": "Track",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Bicicleta",
"type": "string",
"display": true,
"required": false,
"displayName": "Bicicleta",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Terreno",
"type": "string",
"display": true,
"required": false,
"displayName": "Terreno",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Desnivel",
"type": "string",
"display": true,
"required": false,
"displayName": "Desnivel",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": []
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 419561402,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/159k8cDL8hZooz-dsHE6ueWf68mBkHhxVCKnWm-lYLqs/edit#gid=419561402",
"cachedResultName": "n8n"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "159k8cDL8hZooz-dsHE6ueWf68mBkHhxVCKnWm-lYLqs",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/159k8cDL8hZooz-dsHE6ueWf68mBkHhxVCKnWm-lYLqs/edit?usp=drivesdk",
"cachedResultName": "Sherlo_Bike"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "0ce07d54-97af-4e88-9d27-452191a0b3ba",
"name": "strava_last",
"type": "n8n-nodes-base.set",
"position": [
1420,
480
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "423ae4b8-287c-4dc1-b32b-d1b6f1f45efa",
"name": "id",
"type": "number",
"value": "={{ $json.id }}"
},
{
"id": "595802d2-17d0-40be-9e43-d655ffbf4ce0",
"name": "fecha",
"type": "string",
"value": "={{ DateTime.fromISO($json.start_date_local).toFormat('d/M/yyyy') }}"
},
{
"id": "4b39d783-19f2-4a7e-b0e6-dbe2b98f1ae0",
"name": "distancia",
"type": "number",
"value": "={{ Math.round($json.distance / 100) / 10 }}"
},
{
"id": "2f321dc0-435f-4b4d-866c-091ff9eaf9df",
"name": "elevacion",
"type": "number",
"value": "={{ Math.round($json.total_elevation_gain) }}"
},
{
"id": "ba1bb089-5ae7-4e42-ac65-07323c4e1842",
"name": "tiempo",
"type": "string",
"value": "={{ `${Math.floor($json.moving_time / 3600)}:${Math.floor(($json.moving_time % 3600) / 60).toString().padStart(2, '0')}:${($json.moving_time % 60).toString().padStart(2, '0')}` }}\n"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "490f7be9-73c9-4431-8b83-fcdbbcc283eb",
"name": "Remove Duplicates",
"type": "n8n-nodes-base.removeDuplicates",
"position": [
900,
480
],
"parameters": {
"compare": "selectedFields",
"options": {},
"fieldsToCompare": "id"
},
"typeVersion": 2
},
{
"id": "2d1c4dc5-2baa-4c89-a312-4b40381d4e5d",
"name": "activities",
"type": "n8n-nodes-base.googleSheets",
"position": [
660,
240
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": 419561402,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/159k8cDL8hZooz-dsHE6ueWf68mBkHhxVCKnWm-lYLqs/edit#gid=419561402",
"cachedResultName": "n8n"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "159k8cDL8hZooz-dsHE6ueWf68mBkHhxVCKnWm-lYLqs",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/159k8cDL8hZooz-dsHE6ueWf68mBkHhxVCKnWm-lYLqs/edit?usp=drivesdk",
"cachedResultName": "Sherlo_Bike"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "2c7b7939-4ca1-4868-92bf-5fd7384a1103",
"name": "sort_saved",
"type": "n8n-nodes-base.sort",
"position": [
900,
240
],
"parameters": {
"options": {},
"sortFieldsUi": {
"sortField": [
{
"fieldName": "Ref"
}
]
}
},
"typeVersion": 1
},
{
"id": "4e1d9064-6dda-4a01-af48-f278792f8b6b",
"name": "last_saved",
"type": "n8n-nodes-base.limit",
"position": [
1160,
240
],
"parameters": {
"keep": "lastItems",
"maxItems": 10
},
"typeVersion": 1
},
{
"id": "6eb2053a-1101-477b-86e9-113813be2d92",
"name": "saved_last",
"type": "n8n-nodes-base.set",
"position": [
1420,
240
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "50097932-ab91-4af7-9412-925fab1982f0",
"name": "id",
"type": "string",
"value": "={{ $json.Ref }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "afd986f1-0c49-4a69-b948-aefcbff1010f",
"name": "sort_strava",
"type": "n8n-nodes-base.sort",
"position": [
660,
480
],
"parameters": {
"options": {},
"sortFieldsUi": {
"sortField": [
{
"fieldName": "id"
}
]
}
},
"typeVersion": 1
},
{
"id": "16094d29-f35b-492c-9d93-3145dab30cd3",
"name": "last_strava",
"type": "n8n-nodes-base.limit",
"position": [
1160,
480
],
"parameters": {
"keep": "lastItems",
"maxItems": 10
},
"typeVersion": 1
},
{
"id": "9986360b-fcd3-42f4-ad13-aea69f6d1a80",
"name": "sort_results",
"type": "n8n-nodes-base.sort",
"position": [
660,
740
],
"parameters": {
"options": {},
"sortFieldsUi": {
"sortField": [
{
"fieldName": "id"
}
]
}
},
"typeVersion": 1
}
],
"connections": {
"Code": {
"main": [
[
{
"node": "sort_results",
"type": "main",
"index": 0
}
]
]
},
"Strava": {
"main": [
[
{
"node": "sort_strava",
"type": "main",
"index": 0
}
]
]
},
"activities": {
"main": [
[
{
"node": "sort_saved",
"type": "main",
"index": 0
}
]
]
},
"last_saved": {
"main": [
[
{
"node": "saved_last",
"type": "main",
"index": 0
}
]
]
},
"saved_last": {
"main": [
[
{
"node": "Strava",
"type": "main",
"index": 0
}
]
]
},
"sort_saved": {
"main": [
[
{
"node": "last_saved",
"type": "main",
"index": 0
}
]
]
},
"last_strava": {
"main": [
[
{
"node": "strava_last",
"type": "main",
"index": 0
}
]
]
},
"sort_strava": {
"main": [
[
{
"node": "Remove Duplicates",
"type": "main",
"index": 0
}
]
]
},
"strava_last": {
"main": [
[
{
"node": "Code",
"type": "main",
"index": 0
}
]
]
},
"sort_results": {
"main": [
[
{
"node": "Google Sheets",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "activities",
"type": "main",
"index": 0
}
]
]
},
"Remove Duplicates": {
"main": [
[
{
"node": "last_strava",
"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.
googleSheetsOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
This workflow automates the tracking of your Strava activities to maintain a clean, duplicate-free log in Google Sheets, saving you time on manual data entry and ensuring your fitness records stay organised without errors. It's ideal for runners, cyclists, or any athlete who regularly uploads workouts to Strava and wants seamless integration with spreadsheets for analysis or sharing. The key step involves fetching recent activities via Strava, processing them with custom code to filter and sort, then appending only new entries to your Google Sheets document while removing any duplicates.
Use this workflow when you need a hands-off way to sync Strava data daily or weekly into Google Sheets for personal tracking or team reports, especially if your activity volume is moderate to high. Avoid it for real-time updates, as the scheduled trigger suits batch processing rather than instant syncing; opt for manual triggers instead in those cases. Common variations include adjusting the cron schedule for different frequencies or adding email notifications for new personal records.
About this workflow
Limit Code. Uses scheduleTrigger, strava, googleSheets, removeDuplicates. Scheduled trigger; 13 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.
Shopify to Google Sheets Product Sync Automation. Uses noOp, graphql, googleSheets, scheduleTrigger. Scheduled trigger; 25 nodes.
Wait Code. Uses scheduleTrigger, markdown, splitInBatches, rssFeedRead. Scheduled trigger; 23 nodes.
Amazon Product Price Tracker. Uses googleSheets, splitInBatches, httpRequest, emailSend. Scheduled trigger; 16 nodes.
Code Schedule. Uses itemLists, httpRequest, googleSheets, stickyNote. Scheduled trigger; 13 nodes.
Schedule Http. Uses httpRequest, noOp, scheduleTrigger, stickyNote. Scheduled trigger; 11 nodes.