AutomationFlowsEmail & Gmail › Automate Email Follow-ups with Gmail & Google Sheets Using Multi-stage Sequences

Automate Email Follow-ups with Gmail & Google Sheets Using Multi-stage Sequences

ByXavier Tai @xaviertai on n8n.io

Automatically sends timed follow-up emails to leads based on a 4-stage sequence (Day 1, 3, 7, 14), updates tracking automatically, and calculates next follow-up dates. Set it once, add leads, and never manually track follow-ups again. Converts cold leads into warm opportunities…

Cron / scheduled trigger★★★★☆ complexity17 nodesGoogle SheetsGmail
Email & Gmail Trigger: Cron / scheduled Nodes: 17 Complexity: ★★★★☆ Added:

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

This workflow follows the Gmail → Google Sheets 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": "IkA19lqk3SYh3jDa",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Daily Follow-Up System with Multi-Stage Sequences",
  "tags": [],
  "nodes": [
    {
      "id": "8d075e52-b287-42cd-b875-13e9db056ffc",
      "name": "Daily at 9 AM",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -608,
        128
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 9 * * *"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "5fbc9862-fee7-4a3d-a12f-c75e200cd1e0",
      "name": "Read All Follow-Up Leads",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -320,
        128
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Follow-Up Tracker"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "f06c504b-931d-45a7-9e4a-f451cbfd1c74",
      "name": "Filter Today's Follow-Ups",
      "type": "n8n-nodes-base.filter",
      "position": [
        64,
        144
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "check-date-match",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json['Next Follow-Up Date'] }}",
              "rightValue": "={{ $now.format('yyyy-MM-dd') }}"
            },
            {
              "id": "check-active-status",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json['Status'] }}",
              "rightValue": "Active"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "f636570a-a769-4bab-a5b1-8bab12c95936",
      "name": "Process One at a Time",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        400,
        144
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "b9b6cdf6-705e-4ca6-a0f1-be0ce3f81846",
      "name": "Route by Follow-Up Stage",
      "type": "n8n-nodes-base.switch",
      "position": [
        -624,
        720
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "Day 1",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "5b6a152e-50c8-4580-af1a-fcfcb5d2dd21",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json['Stage'] }}",
                    "rightValue": "Day 1"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Day 3",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "bc2bb080-5308-4dfb-89e5-c4995b8e8158",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json['Stage'] }}",
                    "rightValue": "Day 3"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Day 7",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "e8dd580d-ba10-4c09-a075-6fda7b931cca",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json['Stage'] }}",
                    "rightValue": "Day 7"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Day 14",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "93af264b-4acd-4951-b7cd-a3c3a0d166c5",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json['Stage'] }}",
                    "rightValue": "Day 14"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "94ea2fb4-1c48-4b53-a4e2-12a247598f94",
      "name": "Send Day 1 Follow-Up",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -320,
        480
      ],
      "parameters": {
        "sendTo": "={{ $json['Email'] }}",
        "message": "=<p>Hi {{ $json['Name'].split(' ')[0] }},</p>\n\n<p>I wanted to follow up on our conversation about <strong>{{ $json['Project/Interest'] }}</strong>.</p>\n\n<p>I know things can get busy, so I'm reaching out to see if you had a chance to think about our discussion. Is this still something you'd like to move forward with?</p>\n\n<p><strong>Quick reminder of what we discussed:</strong></p>\n<ul>\n<li>Timeline: {{ $json['Timeline'] || 'Flexible' }}</li>\n<li>Next step: {{ $json['Next Step'] || 'Schedule a call' }}</li>\n</ul>\n\n<p>If you're still interested, simply reply to this email or <a href=\"YOUR_CALENDAR_LINK\">book a time on my calendar</a> that works for you.</p>\n\n<p>No pressure - if timing isn't right, just let me know!</p>\n\n<p>Best,<br>Your Name</p>",
        "options": {},
        "subject": "Quick Follow-Up - {{ $json['Name'] }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "2b6551c3-a614-495b-a00b-e95be20d774f",
      "name": "Send Day 3 Follow-Up",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -320,
        656
      ],
      "parameters": {
        "sendTo": "={{ $json['Email'] }}",
        "message": "=<p>Hi {{ $json['Name'].split(' ')[0] }},</p>\n\n<p>I was putting together some resources and thought of you! Since we discussed <strong>{{ $json['Project/Interest'] }}</strong>, I wanted to share something that might be helpful.</p>\n\n<p>\ud83d\udcc4 <strong><a href=\"YOUR_RESOURCE_LINK\">Here's a guide/case study/resource</a></strong> that addresses exactly what we talked about.</p>\n\n<p>I've seen this approach work really well for [similar clients/projects], and thought it might give you some ideas as you're thinking through next steps.</p>\n\n<p>If you'd like to discuss how this could apply to your situation specifically, I'm happy to jump on a quick 15-minute call this week.</p>\n\n<p><a href=\"YOUR_CALENDAR_LINK\">Grab a time here \u2192</a></p>\n\n<p>Hope this helps!</p>\n\n<p>Best,<br>Your Name</p>",
        "options": {},
        "subject": "Thought You'd Find This Helpful - {{ $json['Name'] }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "14e055f7-79ad-469d-a7ee-34414d75406f",
      "name": "Send Day 7 Follow-Up",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -320,
        848
      ],
      "parameters": {
        "sendTo": "={{ $json['Email'] }}",
        "message": "=<p>Hi {{ $json['Name'].split(' ')[0] }},</p>\n\n<p>I wanted to reach out one more time about <strong>{{ $json['Project/Interest'] }}</strong>.</p>\n\n<p>I haven't heard back from you, which is totally fine - I know priorities shift and timing isn't always perfect.</p>\n\n<p><strong>Here's my thinking:</strong></p>\n<ul>\n<li>If you're still interested, I'd love to chat and see how we can move this forward</li>\n<li>If timing isn't right, no problem at all - just let me know and I'll check back in a few months</li>\n<li>If this isn't a priority anymore, that's completely understandable</li>\n</ul>\n\n<p>Just reply with \"Still interested,\" \"Maybe later,\" or \"Not right now\" and I'll know where things stand.</p>\n\n<p>Either way, thanks for considering working together!</p>\n\n<p>Best,<br>Your Name</p>",
        "options": {},
        "subject": "Last Check-In - {{ $json['Name'] }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "df6840e0-319a-4a7c-81f0-cb80971d2554",
      "name": "Send Day 14 Final Follow-Up",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -320,
        1040
      ],
      "parameters": {
        "sendTo": "={{ $json['Email'] }}",
        "message": "=<p>Hi {{ $json['Name'].split(' ')[0] }},</p>\n\n<p>This will be my last email about <strong>{{ $json['Project/Interest'] }}</strong> - I don't want to crowd your inbox!</p>\n\n<p>I genuinely enjoyed our initial conversation and would love to work together if the timing ever becomes right.</p>\n\n<p><strong>Here's what I'm leaving open for you:</strong></p>\n<ul>\n<li>My calendar link: <a href=\"YOUR_CALENDAR_LINK\">Book anytime</a></li>\n<li>Direct email: Just reply to this thread</li>\n<li>No questions asked - I'll pick up right where we left off</li>\n</ul>\n\n<p>If circumstances change or you have questions down the road, please don't hesitate to reach out. I'm here whenever you need.</p>\n\n<p>Wishing you all the best with {{ $json['Project/Interest'] }} and everything else!</p>\n\n<p>Best,<br>Your Name</p>\n\n<p style=\"font-size: 11px; color: #666;\"><em>P.S. I'll remove you from this follow-up sequence, but feel free to reach out anytime in the future.</em></p>",
        "options": {},
        "subject": "Final Note - Leaving This Open for You"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "68c62208-ed32-4a69-a99f-e8db094d3a4c",
      "name": "Update Last Sent Date",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        64,
        752
      ],
      "parameters": {
        "columns": {
          "value": {
            "Email": "={{ $json['Email'] }}",
            "Last Sent Date": "={{ $now.format('yyyy-MM-dd') }}"
          },
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Email"
          ]
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Follow-Up Tracker"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "321778a9-d503-4a77-bbac-4c7c2b9e34bd",
      "name": "Calculate Next Follow-Up",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        400,
        752
      ],
      "parameters": {
        "columns": {
          "value": {
            "Email": "={{ $json['Email'] }}",
            "Stage": "={{ $json['Stage'] === 'Day 1' ? 'Day 3' : $json['Stage'] === 'Day 3' ? 'Day 7' : $json['Stage'] === 'Day 7' ? 'Day 14' : 'Complete' }}",
            "Status": "={{ $json['Stage'] === 'Day 14' ? 'Completed' : 'Active' }}",
            "Next Follow-Up Date": "={{ $now.plus({ days: $json['Stage'] === 'Day 1' ? 2 : $json['Stage'] === 'Day 3' ? 4 : $json['Stage'] === 'Day 7' ? 7 : 0 }).format('yyyy-MM-dd') }}"
          },
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Email"
          ]
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Follow-Up Tracker"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "d0a52a65-4899-4943-ac7f-85ac1001581b",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1856,
        -32
      ],
      "parameters": {
        "color": 7,
        "width": 576,
        "height": 1280,
        "content": "# \ud83d\udd04 Daily Follow-Up System with Multi-Stage Sequences\n\n## What It Does\nAutomatically sends timed follow-up emails to leads based on a 4-stage sequence (Day 1, 3, 7, 14), updates tracking automatically, and calculates next follow-up dates. Set it once, add leads, and never manually track follow-ups again. Converts cold leads into warm opportunities through consistent, professional touchpoints.\n\n## How It Works\n1. **Schedule Trigger** \u2192 Runs daily at 9 AM\n2. **Read Tracker Sheet** \u2192 Gets all leads from Follow-Up Tracker\n3. **Filter Today's Follow-Ups** \u2192 Only processes leads where \"Next Follow-Up Date\" = Today\n4. **Process Individually** \u2192 Handles each lead one at a time (prevents rate limits)\n5. **Route by Stage** \u2192 Sends appropriate email based on Day 1/3/7/14 stage\n6. **Send Stage Email** \u2192 4 different templates for each follow-up milestone\n7. **Update Last Sent** \u2192 Records when email was sent\n8. **Calculate Next Date** \u2192 Automatically schedules next follow-up (or marks complete)\n\n---\n\n## \ud83d\ude80 SETUP INSTRUCTIONS\n\n### Step 1: Create Follow-Up Tracker Sheet\n- Create Google Sheet with tab \"Follow-Up Tracker\"\n- Add columns: `Name | Email | Project/Interest | Timeline | Next Step | Stage | Next Follow-Up Date | Last Sent Date | Status`\n- Populate with leads: Set Stage = \"Day 1\", Status = \"Active\", Next Follow-Up Date = desired start date\n- Update `YOUR_GOOGLE_SHEET_ID` in nodes 2, 7, and 8\n\n### Step 2: Configure Email Templates\n- Edit nodes 6-9 with your email templates\n- Replace `YOUR_CALENDAR_LINK` with your actual booking link (Calendly, etc.)\n- Replace `YOUR_RESOURCE_LINK` in Day 3 email with relevant content\n- Customize sender name/signature in all templates\n\n### Step 3: Setup Gmail Connection\n- Add Gmail OAuth2 credentials to all email nodes\n- Test workflow with one test lead first\n- Monitor Gmail sending limits (500/day for free accounts)\n\n### Step 4: Test the Sequence\n- Add one test lead with Next Follow-Up Date = today\n- Manually execute workflow to verify email sends\n- Check that Google Sheet updates correctly\n- Verify next stage is calculated properly"
      },
      "typeVersion": 1
    },
    {
      "id": "d3cf7fe8-01d9-4815-b183-674e24489234",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -672,
        -32
      ],
      "parameters": {
        "color": 4,
        "width": 608,
        "height": 368,
        "content": "## Step 1: Start Daily Follow-Up Run\nPurpose: Trigger the workflow every morning and load all leads that are part of the follow-up sequence."
      },
      "typeVersion": 1
    },
    {
      "id": "2c0fc58e-a357-4ae8-b298-0e49d8f00707",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        -32
      ],
      "parameters": {
        "color": 6,
        "width": 640,
        "height": 368,
        "content": "## Step 2: Select And Queue Today's Leads\nPurpose: Filter only active leads scheduled for follow-up today and queue them to be processed one by one.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "973d3182-409b-4383-8430-2fb2f6e164d8",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -672,
        352
      ],
      "parameters": {
        "color": 5,
        "width": 608,
        "height": 896,
        "content": "## Step 3: Send Stage-Specific Follow-Up Email\nPurpose: Route each lead to the correct follow-up stage and send the appropriate email template for that day in the sequence."
      },
      "typeVersion": 1
    },
    {
      "id": "729333d1-5e9e-4505-83ac-7ff5c6210731",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        352
      ],
      "parameters": {
        "color": 3,
        "width": 640,
        "height": 896,
        "content": "## Step 4: Update Timeline And Next Follow-Up\nPurpose: Log when the last follow-up was sent and calculate the next follow-up date and stage status in the tracker.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "051e1ca3-186f-4062-ba38-ef7af1eec8b7",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1264,
        -32
      ],
      "parameters": {
        "color": 7,
        "width": 576,
        "height": 1280,
        "content": "## \ud83d\udd27 Customization Options\n\n- **Change Timing**: Modify intervals in node 8 (currently 2, 4, 7 days between stages)\n- **Add More Stages**: Add new Switch outputs and email templates (e.g., Day 21, Day 30)\n- **Different Sequences**: Create multiple sheets for different lead types/products\n- **Business Hours Only**: Add time-based IF node before email sending\n- **Add SMS**: Insert Twilio node for high-value leads at certain stages\n\n---\n\n## \ud83d\udea8 Troubleshooting\n\n- **Emails not sending**: Verify today's date matches \"Next Follow-Up Date\" format (yyyy-MM-dd)\n- **Wrong stage email**: Check Stage column values exactly match Switch conditions (\"Day 1\" not \"day 1\")\n- **Not updating sheet**: Confirm Email column is unique identifier and exists in both read/update operations\n- **Skipping leads**: Ensure Status = \"Active\" (not \"active\" or other variations)\n- **Duplicate emails**: Workflow only processes if Next Follow-Up Date = exactly today\n\n---\n\n## \ud83d\udca1 Enhancement Ideas\n\n- Track email opens using tracking pixels or email service API\n- Add \"Responded\" status that automatically pauses sequence when lead replies\n- Create separate sequences for different products/services\n- Send Slack notification when lead reaches Day 14 (final stage)\n- Generate weekly report of follow-up completion rates\n- Add \"Snooze\" functionality to pause sequence for X days"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "aa85d07e-f8da-4d04-9c0c-d3d93c5226f7",
  "connections": {
    "Daily at 9 AM": {
      "main": [
        [
          {
            "node": "Read All Follow-Up Leads",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Day 1 Follow-Up": {
      "main": [
        [
          {
            "node": "Update Last Sent Date",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Day 3 Follow-Up": {
      "main": [
        [
          {
            "node": "Update Last Sent Date",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Day 7 Follow-Up": {
      "main": [
        [
          {
            "node": "Update Last Sent Date",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process One at a Time": {
      "main": [
        [
          {
            "node": "Route by Follow-Up Stage",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Update Last Sent Date": {
      "main": [
        [
          {
            "node": "Calculate Next Follow-Up",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read All Follow-Up Leads": {
      "main": [
        [
          {
            "node": "Filter Today's Follow-Ups",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Route by Follow-Up Stage": {
      "main": [
        [
          {
            "node": "Send Day 1 Follow-Up",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send Day 3 Follow-Up",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send Day 7 Follow-Up",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send Day 14 Final Follow-Up",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Today's Follow-Ups": {
      "main": [
        [
          {
            "node": "Process One at a Time",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Day 14 Final Follow-Up": {
      "main": [
        [
          {
            "node": "Update Last Sent Date",
            "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

Automatically sends timed follow-up emails to leads based on a 4-stage sequence (Day 1, 3, 7, 14), updates tracking automatically, and calculates next follow-up dates. Set it once, add leads, and never manually track follow-ups again. Converts cold leads into warm opportunities…

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

More Email & Gmail workflows → · Browse all categories →

Related workflows

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

Email & Gmail

Automatically extract structured information from emails using AI-powered document analysis. This workflow processes emails from specified domains, classifies them by type, and extracts structured dat

Gmail, HTTP Request, AWS S3 +1
Email & Gmail

This weekly workflow helps you stay on top of SEO visibility losses by automatically detecting when your previously strong keywords fall out of Google’s top 10 results.

N8N Nodes Dataforseo, Google Sheets, Gmail
Email & Gmail

What This Flow Does

Gmail, Google Sheets, HTTP Request +1
Email & Gmail

This n8n workflow sends personalized outreach emails automatically while enforcing strict safety rules such as email validation, spam checks, daily limits, and human-like delays.

Google Drive, Google Sheets, Gmail
Email & Gmail

This n8n template allows you to automatically monitor your company's budget by comparing live Bexio accounting data against targets defined in Google Sheets, sending automated weekly email reports. It

Google Sheets, HTTP Request, Gmail