Automated Email Drip Campaigns with Gmail & Sheets

Learn how to build automated email drip campaigns using Gmail and Google Sheets. Step-by-step guide covering GMass, Apps Script, scheduling, and tracking for Australian SMBs.

Most Australian small businesses sit on a goldmine of warm contacts and never do anything consistent with them. A new enquiry comes in, you reply once, and if they do not convert immediately they fall off the radar. Meanwhile, research consistently shows that most B2B buyers need five to eight touchpoints before making a decision. If your follow-up strategy is "remember to send a second email," you are leaving revenue on the table every single week.

The solution is a drip campaign: a pre-written sequence of emails that goes out to prospects or customers automatically, spaced over days or weeks, triggered by where they are in your funnel. Done well, it feels like thoughtful, timely communication. Done poorly, it feels like spam. The difference is in the setup.

The good news for Google Workspace users is that you do not need to pay for Mailchimp, HubSpot, or ActiveCampaign to run effective drip campaigns. Gmail, Google Sheets, and either a free Marketplace add-on or a small snippet of Apps Script can handle a fully automated sequence for zero to minimal additional cost. This guide walks through the entire process from first principles.

What Is a Drip Campaign and Why Does It Matter?

A drip campaign is a sequence of automated emails sent to a contact over time, each one triggered by a schedule or a recipient action. Unlike a one-off newsletter blast, a drip campaign is designed to move a contact from cold to warm to ready to buy -- or from new customer to activated user to loyal advocate.

Common drip campaign types for Australian SMBs:

  • Onboarding drip: New customer signs up, receives a five-email welcome sequence over two weeks explaining key features, sharing resources, and inviting a check-in call
  • Lead nurture drip: Someone downloads a guide or fills in a contact form, receives a six-email sequence over 30 days building trust before a sales conversation
  • Re-engagement drip: Inactive contacts from your CRM receive a three-email reactivation sequence over two weeks before being archived
  • Post-purchase drip: Customer completes a purchase, receives a four-email sequence covering product tips, a review request, and a referral offer
  • Event follow-up drip: Webinar attendees receive a three-email post-event sequence with the recording, key takeaways, and a related offer

The power of drip campaigns lies in consistency. Once built, the sequence runs without manual effort. A prospect who enquires at 9pm on a Sunday gets the same high-quality follow-up as one who calls on a Tuesday morning.

For most Australian SMBs, GMass is the fastest and most capable path to a Gmail-based drip campaign. GMass is a Chrome extension that installs directly into Gmail and connects to Google Sheets. It handles sequences, scheduling, follow-up logic, and tracking without requiring any coding.

Step 1: Install GMass and Connect Your Sheet

  1. Visit gmass.co and install the Chrome extension. You will see a GMass button appear next to the standard Send button in Gmail's compose window.
  2. Create a new Google Sheet. Add these columns as a minimum:
Email FirstName Company Stage EmailsSent LastSent
sarah@example.com.au Sarah Mitchell Plumbing Lead 0
james@example.com.au James BluePeak Consulting Lead 0
  1. Add every contact you want to enrol in the sequence. The Stage, EmailsSent, and LastSent columns are for your own tracking -- GMass manages its own send log internally.

Step 2: Draft Your Sequence Emails in Gmail

GMass treats each email in your sequence as a separate Gmail draft. Draft each one in Gmail using your personalisation fields:

  • Email 1 (Day 0): Introduction or welcome -- establish context and set expectations
  • Email 2 (Day 3): Value delivery -- share a relevant resource, insight, or case study
  • Email 3 (Day 7): Social proof -- a customer story or specific outcome relevant to their industry
  • Email 4 (Day 14): Soft CTA -- invite a conversation or offer a low-friction next step
  • Email 5 (Day 21): Last touch -- a brief, direct check-in before pausing contact

Use GMass personalisation fields in each draft. For example:

Hi {{FirstName}},

I wanted to reach out specifically to {{Company}} because we have worked with a number of businesses in your sector over the past two years.

I thought you might find this guide useful -- it covers the three most common gaps we see in how Australian businesses handle their client communication workflows.

Step 3: Configure the GMass Sequence

  1. Open your first draft and click the settings arrow next to the GMass button.
  2. Under Emails, connect your Google Sheet. Select the sheet and the email column.
  3. Under Schedule, set Sending Rate to stagger sends naturally -- 200 per day is a safe starting point for a Workspace account.
  4. Under Follow-ups, click Add a Follow-Up Stage. Configure each stage:
  5. Set the delay in days between each email
  6. Select Send if not replied (this prevents follow-ups to people who have already responded)
  7. Add the content for each follow-up step directly in GMass, or reference your saved Gmail drafts
  8. Enable Open Tracking and Click Tracking for reporting.
  9. Click GMass to launch the campaign. The initial email goes immediately; follow-ups schedule automatically.

Critical setting: Tick the box labelled Reply to any in thread stops follow-ups. This ensures that when a prospect replies to email two, they do not receive emails three, four, and five. Nothing damages a relationship faster than a tone-deaf automated email after a genuine conversation has started.

Pricing in AUD

GMass pricing as of late 2025:

Plan USD/month AUD/month (approx.)
Free $0 $0 (50 emails/day)
Standard $25 ~$39
Premium $35 ~$55
Professional $55 ~$86

For a solo operator or small team running a lead nurture sequence to under 500 contacts, the Standard plan at around AUD $39/month handles everything you need. The Premium plan adds multi-device support and A/B testing for subject lines -- worth it if you are running ongoing outreach at higher volumes.

Building a Drip Campaign with Google Apps Script (Free, Fully Custom)

If you want complete control -- no third-party tools, no per-month fees, all data staying within Google's ecosystem -- Apps Script delivers a capable drip campaign engine with about 60 lines of code and a time-based trigger.

The Spreadsheet Structure

Your Sheet is the database. Set it up with these columns:

Column Purpose
Email Recipient email address
FirstName Personalisation field
Company Personalisation field
EnrolDate Date the contact entered the sequence
Stage Current stage (1, 2, 3, 4, or "Complete")
LastSent Timestamp of the last email sent
Status "Active", "Replied", "Unsubscribed", or "Complete"

Mark new contacts with Stage = 1 and Status = Active. The script reads this data, determines which contacts are due for their next email, sends it, and updates the sheet.

The Apps Script

  1. Open your Google Sheet and go to Extensions > Apps Script.
  2. Delete any existing code and paste the following:
function runDripCampaign() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var headers = data[0];

  var emailCol   = headers.indexOf("Email");
  var nameCol    = headers.indexOf("FirstName");
  var companyCol = headers.indexOf("Company");
  var enrollCol  = headers.indexOf("EnrolDate");
  var stageCol   = headers.indexOf("Stage");
  var lastSentCol= headers.indexOf("LastSent");
  var statusCol  = headers.indexOf("Status");

  // Delay in days between each stage
  var delays = [0, 3, 7, 14, 21];

  var now = new Date();

  for (var i = 1; i < data.length; i++) {
    var status = data[i][statusCol];
    var stage  = data[i][stageCol];

    // Skip contacts who have replied, unsubscribed, or completed the sequence
    if (status !== "Active" || stage === "Complete") continue;

    var stageNum  = parseInt(stage, 10);
    var lastSent  = data[i][lastSentCol];
    var enrollDate= new Date(data[i][enrollCol]);

    // Determine whether this contact is due for their next email
    var daysSinceEnrol = Math.floor((now - enrollDate) / (1000 * 60 * 60 * 24));
    var requiredDelay  = delays[stageNum - 1] || 999;

    if (daysSinceEnrol < requiredDelay) continue;

    // Build and send the email for this stage
    var email    = data[i][emailCol];
    var name     = data[i][nameCol];
    var company  = data[i][companyCol];

    var subject, body;
    switch (stageNum) {
      case 1:
        subject = "Quick intro from Cloud Geeks, " + name;
        body    = buildEmail1(name, company);
        break;
      case 2:
        subject = "A resource for " + company;
        body    = buildEmail2(name, company);
        break;
      case 3:
        subject = "How similar businesses use this approach";
        body    = buildEmail3(name, company);
        break;
      case 4:
        subject = name + " — worth a quick conversation?";
        body    = buildEmail4(name, company);
        break;
      case 5:
        subject = "Last one from me, " + name;
        body    = buildEmail5(name, company);
        break;
      default:
        sheet.getRange(i + 1, stageCol + 1).setValue("Complete");
        continue;
    }

    try {
      GmailApp.sendEmail(email, subject, body, {
        name: "Ash Ganda — Cloud Geeks"
      });

      // Update the sheet
      var nextStage = (stageNum < 5) ? (stageNum + 1) : "Complete";
      sheet.getRange(i + 1, stageCol + 1).setValue(nextStage);
      sheet.getRange(i + 1, lastSentCol + 1).setValue(now);
      if (nextStage === "Complete") {
        sheet.getRange(i + 1, statusCol + 1).setValue("Complete");
      }

      Utilities.sleep(2000); // 2-second pause between sends
    } catch (e) {
      sheet.getRange(i + 1, statusCol + 1).setValue("Error: " + e.message);
    }
  }
}

function buildEmail1(name, company) {
  return "Hi " + name + ",\n\n"
    + "I wanted to introduce myself. I'm Ash from Cloud Geeks — "
    + "we help Australian businesses get more out of their Google Workspace setup.\n\n"
    + "I noticed " + company + " is using Workspace and thought there might be some "
    + "quick wins we could help you unlock — particularly around email, automation, "
    + "and team workflows.\n\n"
    + "No pitch here — I'll share some practical resources over the next few weeks "
    + "and you can let me know if any of it is relevant.\n\n"
    + "Cheers,\nAsh Ganda\nCloud Geeks | insights.cloudgeeks.com.au\n\n"
    + "To unsubscribe from this sequence, reply with 'Unsubscribe'.";
}

function buildEmail2(name, company) {
  return "Hi " + name + ",\n\n"
    + "Following on from my earlier email — here is something that might be "
    + "useful for " + company + ".\n\n"
    + "We put together a short guide on the five Google Workspace automations "
    + "that save our clients the most time. Things like auto-filing emails, "
    + "scheduling follow-ups, and building approval workflows without any code.\n\n"
    + "https://insights.cloudgeeks.com.au/blog/google-workspace-workflows-save-time\n\n"
    + "Let me know if you have questions about any of it.\n\n"
    + "Ash\n\n"
    + "To unsubscribe, reply with 'Unsubscribe'.";
}

function buildEmail3(name, company) {
  return "Hi " + name + ",\n\n"
    + "Quick one this week — I wanted to share a case study that might resonate "
    + "with " + company + ".\n\n"
    + "One of our clients, a 15-person professional services firm in Brisbane, "
    + "was spending around 6 hours per week manually following up on client enquiries. "
    + "We set up a Gmail + Sheets drip sequence for them — similar to what I am "
    + "describing in these emails — and cut that to under 30 minutes. "
    + "Same quality of follow-up, almost no manual effort.\n\n"
    + "Happy to walk through how they did it if that sounds relevant.\n\n"
    + "Ash\n\n"
    + "To unsubscribe, reply with 'Unsubscribe'.";
}

function buildEmail4(name, company) {
  return "Hi " + name + ",\n\n"
    + "I have been sharing a few resources over the past couple of weeks — "
    + "wanted to check in and see if any of it has been useful for " + company + ".\n\n"
    + "If it makes sense to have a 20-minute call to talk through your current "
    + "setup and where automation might help, I am happy to make time. "
    + "No obligation — just a straight conversation.\n\n"
    + "You can grab a time here: https://insights.cloudgeeks.com.au/contact\n\n"
    + "Ash\n\n"
    + "To unsubscribe, reply with 'Unsubscribe'.";
}

function buildEmail5(name, company) {
  return "Hi " + name + ",\n\n"
    + "This is my last email in this sequence — I do not want to clutter "
    + "your inbox if the timing is not right.\n\n"
    + "If you ever want to revisit how " + company + " is using Google Workspace, "
    + "or if you have questions about any of the resources I shared, "
    + "you know where to find me.\n\n"
    + "Wishing you and the team a productive quarter ahead.\n\n"
    + "Ash Ganda\nCloud Geeks | insights.cloudgeeks.com.au\n\n"
    + "To unsubscribe, reply with 'Unsubscribe'.";
}
  1. Click Save (name the project "Drip Campaign"), then click Run > runDripCampaign. Google will prompt you to authorise access to Gmail and Sheets. Review and approve.

Setting Up the Automatic Trigger

Running the function manually works for testing, but you need it to run automatically every morning:

  1. In the Apps Script editor, click the clock icon (Triggers) in the left sidebar.
  2. Click Add Trigger.
  3. Set Function to run to runDripCampaign.
  4. Set Event source to Time-driven.
  5. Set Type of time-based trigger to Day timer.
  6. Set the time to between 7:00 AM and 8:00 AM (AEST).
  7. Click Save.

The trigger now runs every morning. It checks every active contact in the sheet, calculates whether they are due for their next email based on the delay schedule, and sends only to those whose timing has come. Contacts who have already completed the sequence or have been marked as unsubscribed are skipped.

Using Google Sheets as Your Campaign Database

Whether you use GMass or Apps Script, Google Sheets is the backbone of your campaign. A well-structured sheet gives you a real-time view of where every contact sits in your funnel.

Tracking Columns to Add

Beyond the basic contact information, add these columns to give yourself useful campaign intelligence:

Column Values Purpose
Source "Website form", "Cold list", "Event" Track which channel each contact came from
Stage 1–5 or "Complete" Current position in the sequence
Status "Active", "Replied", "Unsubscribed", "Complete" Lifecycle state
EnrolDate Date When they entered the sequence
LastSent Date/time When the last email fired
OpenedEmail1 TRUE/FALSE Manual or GMass-tracked open data
RepliedDate Date When they first replied
Notes Free text Manual notes from any follow-up conversations

Managing Unsubscribes

Every commercial email you send must include a functional unsubscribe mechanism under Australia's Spam Act 2003. For Apps Script campaigns, the simplest approach is to ask recipients to reply with the word "Unsubscribe." Each morning, before running the drip function, check your Gmail sent folder replies and manually update the Status column to "Unsubscribed" for any contacts who have opted out.

For a more automated approach, create a public Google Form with a single field for the recipient's email address, add the form link to every email as the unsubscribe mechanism, and use a Sheet formula or Apps Script trigger to check Form responses and update contact status automatically.

Conditional Formatting for At-a-Glance Management

Use Google Sheets conditional formatting to colour-code your campaign dashboard:

  • Status = "Active": No fill (neutral)
  • Status = "Replied": Green fill (#d9ead3) -- a warm lead
  • Status = "Complete": Light grey fill (#f3f3f3) -- sequence finished
  • Status = "Unsubscribed": Red fill (#f4cccc) -- do not contact again
  • Status contains "Error": Orange fill (#ffe599) -- investigate the send error

With conditional formatting, you can scan 200 contacts at a glance and immediately see which ones need human attention.

Scheduling and Timing Best Practices

When you send drip emails matters almost as much as what you write in them.

Send timing for Australian audiences:

  • Best days: Tuesday, Wednesday, and Thursday consistently outperform Monday and Friday for B2B email in Australia
  • Best time window: 7:30 AM to 9:00 AM AEST, before the workday fills up, or 1:00 PM to 2:00 PM after lunch
  • Avoid: Sending around public holidays. A lead nurture email that lands on Boxing Day or Easter Monday is wasted

Delay spacing recommendations:

Campaign Type Email 1 Email 2 Email 3 Email 4 Email 5
Warm leads (enquired) Day 0 Day 2 Day 5 Day 10 Day 18
Cold prospects Day 0 Day 4 Day 9 Day 16 Day 25
Onboarding/new customers Day 0 Day 1 Day 4 Day 10 Day 21
Re-engagement Day 0 Day 5 Day 12

Start conservatively. A three-email sequence that feels appropriately paced will always outperform a five-email sequence that feels aggressive. You can always add a later stage; you cannot un-send a pushy email.

Tracking Engagement and Optimising Your Sequence

With GMass

GMass's reporting dashboard shows you per-campaign metrics: open rate, click rate, reply rate, bounce rate, and unsubscribe rate. Crucially, it also writes tracking data back to your Google Sheet row by row, so you can filter by Opened = TRUE and see exactly which contacts engaged with each stage.

Use this data to optimise:

  • Low open rates on Email 1: Test a different subject line using GMass's A/B testing. Try personalising with the company name rather than first name.
  • Good opens on Email 2, few on Email 3: Email 3 may be arriving too early or feel repetitive. Extend the delay or rewrite the value proposition.
  • Replies spike on Email 4 (soft CTA): This is your best-performing stage. Consider moving the CTA to Email 3 in your next campaign version.

With Apps Script

Open and click tracking requires a pixel or redirected link, which adds complexity. For most SMBs using the Apps Script approach, reply tracking is sufficient and far simpler:

function checkReplies() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data  = sheet.getDataRange().getValues();
  var headers = data[0];
  var emailCol  = headers.indexOf("Email");
  var statusCol = headers.indexOf("Status");
  var repliedCol= headers.indexOf("RepliedDate");

  for (var i = 1; i < data.length; i++) {
    if (data[i][statusCol] !== "Active") continue;

    var email   = data[i][emailCol];
    var threads = GmailApp.search('from:' + email + ' in:inbox');
    if (threads.length > 0) {
      sheet.getRange(i + 1, statusCol + 1).setValue("Replied");
      sheet.getRange(i + 1, repliedCol + 1).setValue(new Date());
    }
  }
}

Add this as a second time-based trigger running 30 minutes before your main drip trigger. It scans your inbox for replies from active contacts and marks them as "Replied" before the drip function runs -- ensuring no follow-up goes out to someone who has already responded.

Resources and Affiliate Programs

If you are building out your Google Workspace email infrastructure or want to explore tools that complement the approaches in this guide, the following resources are worth bookmarking:

  • Google Workspace Referral Program: https://referworkspace.app.goo.gl/ -- If you are not already on Google Workspace and want to set up a proper business email environment for your drip campaigns, this link gives you access to the referral programme. A correctly configured Workspace account -- with SPF, DKIM, and DMARC set up on your domain -- is the foundation that makes everything else in this guide work reliably.

Before launching any campaign, verify your domain's email authentication is in order. Go to your Google Workspace Admin Console, navigate to Apps > Google Workspace > Gmail > Authenticate email, and confirm that SPF, DKIM, and DMARC records are active. Campaigns sent from an unauthenticated domain have significantly lower inbox placement rates, regardless of whether you use GMass or Apps Script.

The Conclusion: Start Small, Automate Deliberately

Automated email drip campaigns are one of the highest-leverage activities available to an Australian SMB. A five-email sequence built once can nurture hundreds of leads simultaneously, run while you sleep, and consistently outperform sporadic manual follow-up.

The path is straightforward. Choose your approach:

  • GMass if you want the fastest setup, visual configuration, and built-in tracking at roughly AUD $39–$55 per month
  • Apps Script if you want zero ongoing cost, full data ownership, and complete control over the logic

Structure your Google Sheet as a proper campaign database with stage, status, enrol date, and reply tracking columns. Write email sequences that deliver genuine value at each stage before asking for anything. Respect the Spam Act 2003 -- include an unsubscribe mechanism in every email, honour opt-outs within five business days, and only enrol contacts who have given consent or with whom you have a legitimate existing business relationship.

Start with a three-email sequence to a list of 20 contacts. Confirm the trigger fires correctly, the personalisation renders, and replies stop the sequence. Once you are confident the system works, scale up and build additional sequences for different audience segments.

The businesses that grow most consistently are not the ones with the biggest marketing budgets. They are the ones with the most reliable follow-up systems. A Gmail-and-Sheets drip campaign is one of the most practical ways to build that consistency -- using tools your team already knows, without adding yet another subscription to your stack.


Need help configuring Google Workspace for reliable email delivery, or want a hand setting up your first drip campaign? Contact our team at insights.cloudgeeks.com.au for a free consultation.