AutomationFlowsAI & RAG › Track Athlete Sessions and Weekly Performance with Openai, Google Sheets,…

Track Athlete Sessions and Weekly Performance with Openai, Google Sheets,…

Original n8n title: Track Athlete Sessions and Weekly Performance with Openai, Google Sheets, Slack, and Email

ByCheng Siong Chin @cschin on n8n.io

This workflow automates athlete performance monitoring through two parallel pipelines: real-time session analysis triggered by training form submissions, and scheduled weekly performance summaries. Designed for sports coaches, athletic trainers, and performance analysts, it…

Event trigger★★★★☆ complexityAI-powered29 nodesForm TriggerGoogle SheetsAgentOpenAI ChatOutput Parser StructuredSlackHTTP Request
AI & RAG Trigger: Event Nodes: 29 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #13714 — we link there as the canonical source.

This workflow follows the Agent → Form Trigger recipe pattern — see all workflows that pair these two integrations.

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 →

Download .json
{
  "id": "jqbRHApsMENycxghr05ra",
  "name": "Smart athlete performance tracker with session analysis and weekly alerts",
  "tags": [],
  "nodes": [
    {
      "id": "aed9b5b2-c691-4dc1-9887-f3d20cd69267",
      "name": "Training Session Form",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -1184,
        16
      ],
      "parameters": {
        "options": {
          "appendAttribution": false
        },
        "formTitle": "Skating Training Session Entry",
        "formFields": {
          "values": [
            {
              "fieldName": "skater_name",
              "fieldLabel": "Skater Name"
            },
            {
              "fieldName": "training_date",
              "fieldType": "date",
              "fieldLabel": "Training Date"
            },
            {
              "fieldName": "training_duration",
              "fieldType": "number",
              "fieldLabel": "Training Duration (minutes)"
            },
            {
              "fieldName": "session_type",
              "fieldType": "dropdown",
              "fieldLabel": "Session Type",
              "fieldOptions": {
                "values": [
                  {
                    "option": "Endurance"
                  },
                  {
                    "option": "Technique"
                  },
                  {
                    "option": "Speed"
                  },
                  {
                    "option": "Choreography"
                  }
                ]
              }
            },
            {
              "fieldName": "coach_name",
              "fieldLabel": "Coach Name"
            },
            {
              "fieldName": "laps_completed",
              "fieldType": "number",
              "fieldLabel": "Laps Completed"
            },
            {
              "fieldName": "average_speed",
              "fieldType": "number",
              "fieldLabel": "Average Speed (km/h)"
            },
            {
              "fieldName": "stamina_score",
              "fieldType": "number",
              "fieldLabel": "Stamina Score (1-10)"
            },
            {
              "fieldName": "jump_consistency",
              "fieldType": "number",
              "fieldLabel": "Jump Consistency (%)"
            },
            {
              "fieldName": "notes",
              "fieldType": "textarea",
              "fieldLabel": "Notes"
            }
          ]
        }
      },
      "typeVersion": 2.5
    },
    {
      "id": "b8715690-eb24-4a66-b5cb-c5e19588e53c",
      "name": "Workflow Configuration",
      "type": "n8n-nodes-base.set",
      "position": [
        -960,
        16
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "id-1",
              "name": "googleSheetId",
              "type": "string",
              "value": "<__PLACEHOLDER_VALUE__Google Sheet ID for training records__>"
            },
            {
              "id": "id-2",
              "name": "slackChannel",
              "type": "string",
              "value": "<__PLACEHOLDER_VALUE__Slack channel ID for alerts__>"
            },
            {
              "id": "id-3",
              "name": "emailApiUrl",
              "type": "string",
              "value": "<__PLACEHOLDER_VALUE__Email API endpoint URL__>"
            },
            {
              "id": "id-4",
              "name": "performanceThreshold",
              "type": "number",
              "value": 5
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "6cba7e17-a51b-43dc-87ab-f72b9a87e902",
      "name": "Store Training Record",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -736,
        16
      ],
      "parameters": {
        "columns": {
          "value": null,
          "schema": [],
          "mappingMode": "autoMapInputData",
          "matchingColumns": [
            "timestamp"
          ]
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Training Records"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Workflow Configuration').first().json.googleSheetId }}"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "a438b1c2-1b37-4b3b-8206-0f6b5ca956a8",
      "name": "Fetch Historical Data",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -496,
        112
      ],
      "parameters": {
        "options": {
          "dataLocationOnSheet": {
            "values": {
              "range": "A:Z",
              "rangeDefinition": "specifyRangeA1"
            }
          }
        },
        "filtersUI": {
          "values": [
            {
              "lookupValue": "={{ $json['Skater Name'] }}",
              "lookupColumn": "Skater Name"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Training Records"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Workflow Configuration').first().json.googleSheetId }}"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "ae5d9991-ac84-4aa2-bd43-c996a6efc741",
      "name": "Combine Current and Historical Data",
      "type": "n8n-nodes-base.merge",
      "position": [
        -288,
        16
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineAll"
      },
      "typeVersion": 3.2
    },
    {
      "id": "b1d01153-d095-4ae6-88c9-6e806ba52c53",
      "name": "Performance Analysis Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -48,
        0
      ],
      "parameters": {
        "text": "={{ $json }}",
        "options": {
          "systemMessage": "You are a Performance Analysis Agent specialized in analyzing skating training data.\n\nYour task is to:\n1. Analyze the current training session data and historical performance records\n2. Identify performance trends (improvement, plateau, or regression) across key metrics: laps, speed, stamina, jump consistency\n3. Compare current session metrics to historical averages and recent sessions\n4. Detect patterns indicating improvement or areas of concern\n5. Generate actionable insights and recommendations for the next training session\n6. Highlight milestones achieved (personal bests, consistency streaks)\n7. Flag performance drops that require attention\n\nProvide structured analysis with trend assessment, insights, and specific recommendations for focus areas."
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3.1
    },
    {
      "id": "ac604fcb-6e82-48e9-a8e8-d73dd726b5e7",
      "name": "OpenAI Model - Analysis",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -64,
        160
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "b22b3df2-91e6-45c4-8c03-57b22a10783c",
      "name": "Analysis Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        112,
        160
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"overallTrend\": {\"type\": \"string\", \"enum\": [\"improving\", \"stable\", \"declining\"]},\n    \"performanceScore\": {\"type\": \"number\", \"minimum\": 0, \"maximum\": 10},\n    \"lapsTrend\": {\"type\": \"string\"},\n    \"speedTrend\": {\"type\": \"string\"},\n    \"staminaTrend\": {\"type\": \"string\"},\n    \"jumpConsistencyTrend\": {\"type\": \"string\"},\n    \"insights\": {\"type\": \"array\", \"items\": {\"type\": \"string\"}},\n    \"recommendations\": {\"type\": \"array\", \"items\": {\"type\": \"string\"}},\n    \"milestonesAchieved\": {\"type\": \"array\", \"items\": {\"type\": \"string\"}},\n    \"concernAreas\": {\"type\": \"array\", \"items\": {\"type\": \"string\"}},\n    \"alertRequired\": {\"type\": \"boolean\"}\n  },\n  \"required\": [\"overallTrend\", \"performanceScore\", \"insights\", \"recommendations\", \"alertRequired\"]\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "68d8149e-e272-4978-bfac-75bdc9e983bb",
      "name": "Update Record with Insights",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        288,
        16
      ],
      "parameters": {
        "columns": {
          "value": {
            "timestamp": "={{ $json.timestamp }}",
            "AI Analysis": "={{ JSON.stringify($json) }}"
          },
          "schema": [
            {
              "id": "timestamp",
              "required": false,
              "displayName": "timestamp",
              "defaultMatch": true,
              "canBeUsedToMatch": true
            },
            {
              "id": "AI Analysis",
              "required": false,
              "displayName": "AI Analysis",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "timestamp"
          ]
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Training Records"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Workflow Configuration').first().json.googleSheetId }}"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "2ecede3f-b06b-447b-a13c-dd40ffda379d",
      "name": "Check Performance Threshold",
      "type": "n8n-nodes-base.if",
      "position": [
        512,
        16
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": false,
            "typeValidation": "loose"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "id-1",
              "operator": {
                "type": "number",
                "operation": "lt"
              },
              "leftValue": "={{ $('Performance Analysis Agent').item.json.performanceScore }}",
              "rightValue": "={{ $('Workflow Configuration').first().json.performanceThreshold }}"
            },
            {
              "id": "id-2",
              "operator": {
                "type": "boolean",
                "operation": "equals"
              },
              "leftValue": "={{ $('Performance Analysis Agent').item.json.alertRequired }}",
              "rightValue": "true"
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "accc9780-4a08-402c-b24f-e3a657950a71",
      "name": "Send Slack Alert",
      "type": "n8n-nodes-base.slack",
      "position": [
        768,
        0
      ],
      "parameters": {
        "text": "=\ud83d\udea8 *Performance Alert: {{ $json['Skater Name'] }}*\n\n*Session Date:* {{ $json['Training Date'] }}\n*Coach:* {{ $json['Coach Name'] }}\n*Performance Score:* {{ $json.performanceScore }}/10\n*Overall Trend:* {{ $json.overallTrend }}\n\n*Key Insights:*\n{{ $json.insights.map((i, idx) => `${idx + 1}. ${i}`).join(\"\\n\") }}\n\n*Concern Areas:*\n{{ $json.concernAreas.map((c, idx) => `${idx + 1}. ${c}`).join(\"\\n\") }}\n\n*Recommendations:*\n{{ $json.recommendations.map((r, idx) => `${idx + 1}. ${r}`).join(\"\\n\") }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Workflow Configuration').first().json.slackChannel }}"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.4
    },
    {
      "id": "4646b3c1-b4c0-44c7-a719-7a7b09b0c1b4",
      "name": "Send Email Alert",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        768,
        192
      ],
      "parameters": {
        "url": "={{ $('Workflow Configuration').first().json.emailApiUrl }}",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"to\": \"{{ $json['Coach Name'] }}\",\n  \"subject\": \"Performance Alert: {{ $json['Skater Name'] }} - {{ $json['Training Date'] }}\",\n  \"body\": \"Performance Score: {{ $json.performanceScore }}/10\\n\\nOverall Trend: {{ $json.overallTrend }}\\n\\nInsights:\\n{{ $json.insights.join('\\n') }}\\n\\nRecommendations:\\n{{ $json.recommendations.join('\\n') }}\"\n}",
        "sendBody": true,
        "specifyBody": "json"
      },
      "typeVersion": 4.3
    },
    {
      "id": "cfe800de-4acc-4377-b825-417d0c0e7cc6",
      "name": "Weekly Summary Schedule",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -1184,
        448
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                1
              ],
              "triggerAtHour": 9
            }
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "52079b71-71b3-4bb4-bd1b-201d73a573e5",
      "name": "Weekly Config",
      "type": "n8n-nodes-base.set",
      "position": [
        -960,
        448
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "id-1",
              "name": "googleSheetId",
              "type": "string",
              "value": "<__PLACEHOLDER_VALUE__Google Sheet ID for training records__>"
            },
            {
              "id": "id-2",
              "name": "slackChannel",
              "type": "string",
              "value": "<__PLACEHOLDER_VALUE__Slack channel ID for weekly summaries__>"
            },
            {
              "id": "id-3",
              "name": "emailApiUrl",
              "type": "string",
              "value": "<__PLACEHOLDER_VALUE__Email API endpoint URL__>"
            },
            {
              "id": "id-4",
              "name": "weekStartDate",
              "type": "string",
              "value": "={{ $now.minus({ days: 7 }).toFormat('yyyy-MM-dd') }}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "1e29db8c-9431-40fc-8c96-7d6a21bb9380",
      "name": "Fetch Weekly Data",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -736,
        448
      ],
      "parameters": {
        "options": {
          "dataLocationOnSheet": {
            "values": {
              "range": "A:Z",
              "rangeDefinition": "specifyRangeA1"
            }
          }
        },
        "filtersUI": {
          "values": [
            {
              "lookupValue": "={{ $('Weekly Config').first().json.weekStartDate }}",
              "lookupColumn": "Training Date"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Training Records"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Weekly Config').first().json.googleSheetId }}"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "9b41f370-5f14-40b5-8dce-c6a780b297c6",
      "name": "Group by Athlete",
      "type": "n8n-nodes-base.code",
      "position": [
        -512,
        448
      ],
      "parameters": {
        "jsCode": "const athleteData = {};\n\nfor (const item of $input.all()) {\n  const skaterName = item.json['Skater Name'];\n  if (!athleteData[skaterName]) {\n    athleteData[skaterName] = [];\n  }\n  athleteData[skaterName].push(item.json);\n}\n\nconst output = [];\nfor (const [name, sessions] of Object.entries(athleteData)) {\n  output.push({\n    json: {\n      athleteName: name,\n      sessions: sessions,\n      sessionCount: sessions.length\n    }\n  });\n}\n\nreturn output;"
      },
      "typeVersion": 2
    },
    {
      "id": "b6861fce-5ac4-4753-85e4-9886268742d6",
      "name": "Weekly Summary Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -288,
        448
      ],
      "parameters": {
        "text": "={{ $json }}",
        "options": {
          "systemMessage": "You are a Weekly Performance Summary Agent specialized in generating comprehensive training reports for skating athletes.\n\nYour task is to:\n1. Analyze all training sessions for the athlete over the past week\n2. Calculate weekly statistics: total sessions, total training time, average performance scores\n3. Identify week-over-week trends and progress patterns\n4. Highlight achievements, milestones, and areas of improvement\n5. Detect consistency patterns and training frequency\n6. Generate actionable recommendations for the upcoming week\n7. Provide motivational insights and celebrate progress\n8. Flag any concerning patterns requiring coach attention\n\nProvide a structured weekly summary with statistics, trends, achievements, and forward-looking recommendations."
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3.1
    },
    {
      "id": "260366f0-67f6-4290-9506-26de961d1342",
      "name": "OpenAI Model - Summary",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -304,
        672
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "c51d858e-d4cb-4e5c-a9c4-4e5b2d70069f",
      "name": "Summary Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -144,
        672
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"athleteName\": {\"type\": \"string\"},\n    \"weekPeriod\": {\"type\": \"string\"},\n    \"totalSessions\": {\"type\": \"number\"},\n    \"totalTrainingMinutes\": {\"type\": \"number\"},\n    \"averagePerformanceScore\": {\"type\": \"number\"},\n    \"weeklyTrend\": {\"type\": \"string\", \"enum\": [\"improving\", \"stable\", \"declining\"]},\n    \"achievements\": {\"type\": \"array\", \"items\": {\"type\": \"string\"}},\n    \"keyMetrics\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"avgLaps\": {\"type\": \"number\"},\n        \"avgSpeed\": {\"type\": \"number\"},\n        \"avgStamina\": {\"type\": \"number\"},\n        \"avgJumpConsistency\": {\"type\": \"number\"}\n      }\n    },\n    \"recommendations\": {\"type\": \"array\", \"items\": {\"type\": \"string\"}},\n    \"coachNotes\": {\"type\": \"string\"}\n  },\n  \"required\": [\"athleteName\", \"totalSessions\", \"totalTrainingMinutes\", \"averagePerformanceScore\", \"weeklyTrend\", \"achievements\", \"recommendations\"]\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "1a326f6c-c64d-43f8-b35b-e4b0f11dc3e8",
      "name": "Send Weekly Summary to Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        320,
        448
      ],
      "parameters": {
        "text": "=\ud83d\udcca *Weekly Training Summary: {{ $json.athleteName }}*\n\n*Period:* {{ $json.weekPeriod }}\n*Total Sessions:* {{ $json.totalSessions }}\n*Total Training Time:* {{ $json.totalTrainingMinutes }} minutes\n*Average Performance Score:* {{ $json.averagePerformanceScore }}/10\n*Weekly Trend:* {{ $json.weeklyTrend }}\n\n*Key Metrics:*\n\u2022 Avg Laps: {{ $json.keyMetrics.avgLaps }}\n\u2022 Avg Speed: {{ $json.keyMetrics.avgSpeed }} km/h\n\u2022 Avg Stamina: {{ $json.keyMetrics.avgStamina }}/10\n\u2022 Avg Jump Consistency: {{ $json.keyMetrics.avgJumpConsistency }}%\n\n*Achievements:*\n{{ $json.achievements.map((a, idx) => `${idx + 1}. ${a}`).join(\"\\n\") }}\n\n*Recommendations for Next Week:*\n{{ $json.recommendations.map((r, idx) => `${idx + 1}. ${r}`).join(\"\\n\") }}\n\n*Coach Notes:*\n{{ $json.coachNotes }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Weekly Config').first().json.slackChannel }}"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.4
    },
    {
      "id": "d941a193-45f2-420b-834a-021f0b90c6bf",
      "name": "Send Weekly Summary Email",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        112,
        624
      ],
      "parameters": {
        "url": "={{ $('Weekly Config').first().json.emailApiUrl }}",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"to\": \"coach@example.com\",\n  \"subject\": \"Weekly Training Summary: {{ $json.athleteName }}\",\n  \"body\": \"Weekly Summary for {{ $json.athleteName }}\\n\\nPeriod: {{ $json.weekPeriod }}\\nTotal Sessions: {{ $json.totalSessions }}\\nTotal Training Time: {{ $json.totalTrainingMinutes }} minutes\\nAverage Performance: {{ $json.averagePerformanceScore }}/10\\n\\nAchievements:\\n{{ $json.achievements.join('\\n') }}\\n\\nRecommendations:\\n{{ $json.recommendations.join('\\n') }}\\n\\nCoach Notes:\\n{{ $json.coachNotes }}\"\n}",
        "sendBody": true,
        "specifyBody": "json"
      },
      "typeVersion": 4.3
    },
    {
      "id": "3a0b9328-8d6f-4850-ada3-cfca846196ae",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1232,
        -416
      ],
      "parameters": {
        "width": 528,
        "height": 304,
        "content": "## How It Works\nThis workflow automates athlete performance monitoring through two parallel pipelines: real-time session analysis triggered by training form submissions, and scheduled weekly performance summaries. Designed for sports coaches, athletic trainers, and performance analysts, it eliminates manual data aggregation and ensures threshold breaches and weekly trends are communicated instantly. A training session form submission stores the record to Google Sheets, fetches historical data, and combines both inputs for a Performance Analysis Agent. OpenAI analyses the combined data, updates the sheet with insights, then checks performance thresholds, triggering Slack alerts or email notifications on breach. In parallel, a weekly schedule fetches all athlete data, groups by athlete, and passes to a Weekly Summary Agent that distributes summaries via both Slack and email.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "fef2a551-8d73-4273-870a-e4be3f505b31",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -672,
        -416
      ],
      "parameters": {
        "width": 352,
        "height": 304,
        "content": "## Setup Steps\n1. Configure Training Session Form fields to match athlete and session data schema.\n2. Connect Google Sheets credentials to Store, Fetch, and Update Record nodes.\n3. Add OpenAI API credentials to Performance Analysis and Weekly Summary Agent nodes.\n4. Configure Slack credentials and set coaching team alert and summary channels.\n5. Add Gmail/SMTP credentials to Send Email Alert and Weekly Summary Email nodes.\n6. Define performance threshold values in the Check Performance Threshold node."
      },
      "typeVersion": 1
    },
    {
      "id": "57d31cc2-bcb8-4c80-89b8-a59dbfea86c1",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -288,
        -480
      ],
      "parameters": {
        "color": 5,
        "width": 608,
        "height": 336,
        "content": "## Prerequisites\n- Google Sheets with service account credentials\n- Slack workspace with bot token\n- Gmail or SMTP credentials\n## Use Cases\n- Real-time performance threshold alerts for elite athlete training programmes\n## Customization\n- Replace OpenAI with Anthropic Claude for analysis and summary agents\n## Benefits\n- Automates session analysis and insight storage immediately after each training entry"
      },
      "typeVersion": 1
    },
    {
      "id": "0b978ab3-6ab1-4653-83f8-966943a1105f",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -96,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 512,
        "height": 432,
        "content": "## Performance Analysis Agent\n**What** \u2013 Analyses combined data using OpenAI and updates Sheets with insights.\n**Why** \u2013 Automates performance interpretation without manual coach review."
      },
      "typeVersion": 1
    },
    {
      "id": "3a2d429d-9165-40e5-a4c6-3982f8613b3a",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        448,
        -144
      ],
      "parameters": {
        "color": 7,
        "width": 480,
        "height": 464,
        "content": "## Check Performance Threshold\n**What** \u2013 Evaluates whether metrics breach defined performance thresholds.\n**Why** \u2013 Ensures coaches are alerted only when athlete performance requires attention."
      },
      "typeVersion": 1
    },
    {
      "id": "4a5c56a2-119b-4317-a082-ad573dada97d",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1232,
        -80
      ],
      "parameters": {
        "color": 7,
        "width": 1120,
        "height": 416,
        "content": "\n## Fetch & Combine Historical Data\n**What** \u2013 Retrieves prior records and merges with current session input.\n**Why** \u2013 Gives the analysis agent full longitudinal context for accurate insight generation."
      },
      "typeVersion": 1
    },
    {
      "id": "9f6f5813-e2a6-4269-a88a-2b970b8456c7",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1232,
        352
      ],
      "parameters": {
        "color": 7,
        "width": 864,
        "height": 432,
        "content": "## Weekly Summary Schedule & Grouping\n**What** \u2013 Fetches all weekly data and groups records by individual athlete.\n**Why** \u2013 Organises data correctly before generating per-athlete summary reports."
      },
      "typeVersion": 1
    },
    {
      "id": "c14ffd06-849f-4bdd-bba7-de6fb2b5488e",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -336,
        352
      ],
      "parameters": {
        "color": 7,
        "width": 848,
        "height": 432,
        "content": "## Weekly Summary Agent & Distribution\n**What** \u2013 Generates summaries via OpenAI and sends to Slack and email.\n**Why** \u2013 Delivers consistent weekly performance visibility to coaching staff automatically."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "4db67062-e644-43c2-9fe6-a0eec2383114",
  "connections": {
    "Weekly Config": {
      "main": [
        [
          {
            "node": "Fetch Weekly Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Group by Athlete": {
      "main": [
        [
          {
            "node": "Weekly Summary Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Weekly Data": {
      "main": [
        [
          {
            "node": "Group by Athlete",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Weekly Summary Agent": {
      "main": [
        [
          {
            "node": "Send Weekly Summary to Slack",
            "type": "main",
            "index": 0
          },
          {
            "node": "Send Weekly Summary Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Historical Data": {
      "main": [
        [
          {
            "node": "Combine Current and Historical Data",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Store Training Record": {
      "main": [
        [
          {
            "node": "Fetch Historical Data",
            "type": "main",
            "index": 0
          },
          {
            "node": "Combine Current and Historical Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Summary Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Weekly Summary Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Training Session Form": {
      "main": [
        [
          {
            "node": "Workflow Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analysis Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Performance Analysis Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Model - Summary": {
      "ai_languageModel": [
        [
          {
            "node": "Weekly Summary Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Workflow Configuration": {
      "main": [
        [
          {
            "node": "Store Training Record",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Model - Analysis": {
      "ai_languageModel": [
        [
          {
            "node": "Performance Analysis Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Weekly Summary Schedule": {
      "main": [
        [
          {
            "node": "Weekly Config",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Performance Analysis Agent": {
      "main": [
        [
          {
            "node": "Update Record with Insights",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Performance Threshold": {
      "main": [
        [
          {
            "node": "Send Slack Alert",
            "type": "main",
            "index": 0
          },
          {
            "node": "Send Email Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Record with Insights": {
      "main": [
        [
          {
            "node": "Check Performance Threshold",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Combine Current and Historical Data": {
      "main": [
        [
          {
            "node": "Performance Analysis Agent",
            "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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow automates athlete performance monitoring through two parallel pipelines: real-time session analysis triggered by training form submissions, and scheduled weekly performance summaries. Designed for sports coaches, athletic trainers, and performance analysts, it…

Source: https://n8n.io/workflows/13714/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

🎯 Create viral TikToks, Shorts, Reels, podcasts, and ASMR videos in minutes — all on autopilot.

OpenAI, HTTP Request, Form Trigger +7
AI & RAG

🧠 Automate end-to-end SEO blog creation and WordPress publishing using a GPT-5 multi-agent workflow with real-time research, metadata generation, and optional featured images.

Output Parser Structured, HTTP Request, OpenAI +10
AI & RAG

YouTube Strategist. Uses formTrigger, splitOut, splitInBatches, agent. Event-driven trigger; 50 nodes.

Form Trigger, Agent, OpenRouter Chat +5
AI & RAG

This advanced multi-phase n8n workflow automates the complete research, analysis, and ideation pipeline for a YouTube strategist. It scrapes competitor channels, analyzes top-performing titles and thu

Form Trigger, Agent, OpenRouter Chat +5
AI & RAG

This workflow generates comprehensive B2B leads, from a selected Business type in ANY CITY IN THE WORLD, including: Company name; Website; Email (enriched with AI Agent); Phone number; Address; Main L

Output Parser Structured, Memory Buffer Window, Agent +8