Suivi des dépenses personnelles

Intermédiaire

Ceci est unPersonal Productivityworkflow d'automatisation du domainecontenant 15 nœuds.Utilise principalement des nœuds comme Cron, Webhook, Function, GoogleSheets, RespondToWebhook. utilisationWebhooksetGoogle Sheetsautomatisation追踪器gestion个人支出

Prérequis
  • Point de terminaison HTTP Webhook (généré automatiquement par n8n)
  • Informations d'identification Google Sheets API
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "id": "E1CD2pH99IVoXnwp",
  "meta": {
    "instanceId": "922f87b0adfedb3ae09541ddf50e19d9af2c8cfac1d8da5d9cd4cdfe64d30bee",
    "templateCredsSetupCompleted": true
  },
  "name": "Personal expense tracker",
  "tags": [],
  "nodes": [
    {
      "id": "0dc9105c-6579-4bde-b831-b993ac6e1a54",
      "name": "Saisie de Dépense Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        240,
        100
      ],
      "webhookId": "expense-tracker-api",
      "parameters": {
        "path": "add-expense",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 1
    },
    {
      "id": "17662aeb-97d6-468e-b1d1-2b82a44dfbb9",
      "name": "Valider et Formater les Données de Dépense",
      "type": "n8n-nodes-base.function",
      "position": [
        540,
        100
      ],
      "parameters": {
        "functionCode": "// Validate and format expense data\nconst body = $input.first().json.body || {};\n\nconst expense = {\n  date: body.date || new Date().toISOString().split('T')[0],\n  category: body.category || 'Other',\n  description: body.description || 'No description',\n  amount: parseFloat(body.amount) || 0,\n  payment_method: body.payment_method || 'Cash'\n};\n\n// Validate amount\nif (expense.amount <= 0) {\n  throw new Error('Amount must be greater than 0');\n}\n\n// Validate category\nconst validCategories = ['Food', 'Transport', 'Shopping', 'Bills', 'Entertainment', 'Health', 'Other'];\nif (!validCategories.includes(expense.category)) {\n  expense.category = 'Other';\n}\n\n// Format amount to 2 decimal places\nexpense.amount = Math.round(expense.amount * 100) / 100;\n\nreturn { json: expense };"
      },
      "typeVersion": 1
    },
    {
      "id": "0a4044a1-f23e-4c5a-9383-425f0fb5cf9e",
      "name": "Enregistrer la Dépense dans Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        840,
        100
      ],
      "parameters": {
        "options": {
          "cellFormat": "USER_ENTERED"
        },
        "operation": "append",
        "sheetName": "Expenses",
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "REPLACE_WITH_YOUR_SPREADSHEET_ID"
        }
      },
      "typeVersion": 4
    },
    {
      "id": "84af3396-544e-41fe-a8ae-5f27f912bf77",
      "name": "Calculer le Résumé Mensuel",
      "type": "n8n-nodes-base.function",
      "position": [
        1140,
        100
      ],
      "parameters": {
        "functionCode": "// Calculate summary for current expense\nconst currentExpense = $('Validate and Format Expense Data').first().json;\nconst currentDate = new Date(currentExpense.date);\nconst currentMonth = currentDate.getMonth() + 1;\nconst currentYear = currentDate.getFullYear();\n\n// Create response with expense details and summary\nconst summary = {\n  expense_added: currentExpense,\n  monthly_summary: {\n    month: currentMonth,\n    year: currentYear,\n    category: currentExpense.category,\n    amount_added: currentExpense.amount,\n    date_updated: new Date().toISOString()\n  },\n  success: true,\n  message: `Expense of $${currentExpense.amount} for ${currentExpense.category} has been recorded successfully.`\n};\n\nreturn { json: summary };"
      },
      "typeVersion": 1
    },
    {
      "id": "71a8e380-dc27-4cdb-a4e7-388347a38939",
      "name": "Envoyer une Réponse de Succès",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1440,
        100
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "638d6c11-fcdc-4aa7-a785-6a23dad63e06",
      "name": "Envoyer une Réponse d'Erreur",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        540,
        260
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "026567d0-aef6-49a8-9100-22cbac0bccae",
      "name": "Planification du Résumé Quotidien",
      "type": "n8n-nodes-base.cron",
      "position": [
        240,
        400
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "483b47d5-4b82-4e5b-9d79-fb1c2337d90a",
      "name": "Lire les Dépenses d'Aujourd'hui depuis la Feuille",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        540,
        400
      ],
      "parameters": {
        "options": {},
        "sheetName": "Expenses",
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "REPLACE_WITH_YOUR_SPREADSHEET_ID"
        }
      },
      "typeVersion": 4
    },
    {
      "id": "f166a60d-06f0-4852-88e2-c4a05fbf39c9",
      "name": "Calculer le Total Quotidien",
      "type": "n8n-nodes-base.function",
      "position": [
        840,
        400
      ],
      "parameters": {
        "functionCode": "// Filter and calculate today's expenses\nconst today = new Date().toISOString().split('T')[0];\nconst allExpenses = $input.all()[0].json || [];\n\n// Filter expenses for today\nconst todayExpenses = allExpenses.filter(expense => {\n  return expense.date === today;\n});\n\n// Calculate total and by category\nconst categoryTotals = {};\nlet totalToday = 0;\n\ntodayExpenses.forEach(expense => {\n  const amount = parseFloat(expense.amount || 0);\n  totalToday += amount;\n  \n  if (!categoryTotals[expense.category]) {\n    categoryTotals[expense.category] = 0;\n  }\n  categoryTotals[expense.category] += amount;\n});\n\nreturn {\n  json: {\n    date: today,\n    total_expenses: Math.round(totalToday * 100) / 100,\n    expense_count: todayExpenses.length,\n    category_breakdown: categoryTotals,\n    expenses: todayExpenses\n  }\n};"
      },
      "typeVersion": 1
    },
    {
      "id": "b395295d-2f98-41cf-9ea3-37aa8ba09e83",
      "name": "Explication du Workflow Principal",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -320,
        -100
      ],
      "parameters": {
        "color": 4,
        "width": 450,
        "height": 1180,
        "content": "# 💰 Personal Expense Tracker API\n\n## What This Workflow Does\nProvides a complete expense tracking system with webhook API for adding expenses and automatic Google Sheets storage with daily summaries.\n\n## How It Works\n1. **API Endpoint**: Receives expenses via POST webhook\n2. **Data Validation**: Ensures proper format and categories\n3. **Google Sheets Storage**: Automatically saves to spreadsheet\n4. **Daily Reports**: Sends summary at 8 PM daily\n5. **Real-time Responses**: Returns success/error immediately\n\n## API Usage\nSend POST to: `/webhook/add-expense`\n```json\n{\n  \"amount\": 25.50,\n  \"category\": \"Food\",\n  \"description\": \"Lunch at cafe\",\n  \"payment_method\": \"Credit Card\"\n}\n```\n\n## Categories\n• Food • Transport • Shopping • Bills\n• Entertainment • Health • Other\n\n## Setup Required\n1. Create Google Sheets with 'Expenses' sheet\n2. Headers: Date | Category | Description | Amount | Payment Method\n3. Replace SPREADSHEET_ID in nodes\n4. Connect Google Sheets OAuth2\n5. Activate workflow\n\n## Perfect For\n✅ Personal finance tracking\n✅ Mobile app integration\n✅ Family expense sharing\n✅ Small business expense logging\n\n**Includes automatic validation, error handling, and daily summaries.**"
      },
      "typeVersion": 1
    },
    {
      "id": "49605945-3d4d-497c-83f9-2518ebc4e1e9",
      "name": "Étape 1 - Saisie API",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        200,
        -220
      ],
      "parameters": {
        "color": 7,
        "width": 300,
        "height": 280,
        "content": "## Step 1: API Input\n\n**Webhook** receives expense data via POST request\n\n**Endpoint**: `/webhook/add-expense`\n**Method**: POST\n**Format**: JSON\n\n*Perfect for mobile apps, web forms, or direct API calls*"
      },
      "typeVersion": 1
    },
    {
      "id": "c02af8e8-6b84-4226-81cb-558bda710a91",
      "name": "Étape 2 - Validation des Données",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        500,
        -200
      ],
      "parameters": {
        "color": 7,
        "width": 300,
        "height": 260,
        "content": "## Step 2: Data Validation\n\n**Function Node** validates and cleans data:\n• Checks amount > 0\n• Validates categories\n• Sets defaults for missing fields\n• Formats numbers properly\n\n*Ensures data consistency*"
      },
      "typeVersion": 1
    },
    {
      "id": "0ab3f049-da8f-48f0-9715-3fd5382310b8",
      "name": "Étape 3 - Stockage Google Sheets",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        800,
        -220
      ],
      "parameters": {
        "color": 7,
        "width": 300,
        "height": 280,
        "content": "## Step 3: Google Sheets Storage\n\n**Google Sheets Node** appends expense to spreadsheet\n\n**Sheet**: 'Expenses'\n**Columns**: Date | Category | Description | Amount | Payment Method\n\n*Your permanent expense database*"
      },
      "typeVersion": 1
    },
    {
      "id": "f68eeb78-bf5c-43e6-8ac2-20745b3aa54f",
      "name": "Étape 4 - Réponse API",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1140,
        -200
      ],
      "parameters": {
        "color": 7,
        "width": 300,
        "height": 260,
        "content": "## Step 4: API Response\n\n**Response Nodes** return JSON with:\n✅ Success: Expense details + confirmation\n❌ Error: Validation errors + field requirements\n\n*Immediate feedback for calling applications*"
      },
      "typeVersion": 1
    },
    {
      "id": "d1a9d5fa-b4d8-492f-b3ed-9d8789194da3",
      "name": "Automatisation du Résumé Quotidien",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1120,
        280
      ],
      "parameters": {
        "color": 6,
        "width": 500,
        "height": 250,
        "content": "## 📊 Automated Daily Summary\n\n**Cron Trigger** runs daily at 8:00 PM to:\n• Read all today's expenses from Google Sheets\n• Calculate total spending and category breakdown\n• Generate summary report\n\n**Perfect for**: Evening expense review, budget tracking, spending pattern analysis\n\n*Stay informed about your daily spending habits automatically*"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "aedb5fd0-8999-486c-af50-b440d70e1926",
  "connections": {
    "0dc9105c-6579-4bde-b831-b993ac6e1a54": {
      "main": [
        [
          {
            "node": "17662aeb-97d6-468e-b1d1-2b82a44dfbb9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "026567d0-aef6-49a8-9100-22cbac0bccae": {
      "main": [
        [
          {
            "node": "483b47d5-4b82-4e5b-9d79-fb1c2337d90a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "84af3396-544e-41fe-a8ae-5f27f912bf77": {
      "main": [
        [
          {
            "node": "71a8e380-dc27-4cdb-a4e7-388347a38939",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0a4044a1-f23e-4c5a-9383-425f0fb5cf9e": {
      "main": [
        [
          {
            "node": "84af3396-544e-41fe-a8ae-5f27f912bf77",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "483b47d5-4b82-4e5b-9d79-fb1c2337d90a": {
      "main": [
        [
          {
            "node": "f166a60d-06f0-4852-88e2-c4a05fbf39c9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "17662aeb-97d6-468e-b1d1-2b82a44dfbb9": {
      "main": [
        [
          {
            "node": "0a4044a1-f23e-4c5a-9383-425f0fb5cf9e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Intermédiaire - Productivité personnelle

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Informations sur le workflow
Niveau de difficulté
Intermédiaire
Nombre de nœuds15
Catégorie1
Types de nœuds6
Description de la difficulté

Adapté aux utilisateurs expérimentés, avec des workflows de complexité moyenne contenant 6-15 nœuds

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34