Google Sheets + Google Apps Script + Gmail. Fully automated. Sends Day 0, Day 3, and Day 7 emails without touching anything.
Go to sheets.google.com β New Sheet β name it Party Rental Outreach. Add a tab called Leads. Set up these exact columns in row 1:
| Column | Header Name | What Goes Here |
|---|---|---|
| A | First Name | Owner's first name (or "Owner" if unknown) |
| B | Business Name | Full business name |
| C | Their email address | |
| D | City | City they're based in |
| E | Status | See status guide below |
| F | Day0 Date | Auto-filled by script |
| G | Day3 Date | Auto-filled by script |
| H | Day7 Date | Auto-filled by script |
| I | Notes | Anything you want to remember |
Status values to use:
Copy the entire script below and paste it into the Apps Script editor.
// βββββββββββββββββββββββββββββββββββββββββββββββ
// PARTY UP MARKETING β Automated Cold Outreach
// Paste into Google Apps Script (Extensions menu)
// βββββββββββββββββββββββββββββββββββββββββββββββ
var SHEET_NAME = 'Leads';
var MAX_PER_RUN = 20;
var YOUR_NAME = 'Anthony Whitner';
var YOUR_PHONE = '(313) 205-3355';
var YOUR_SITE = 'partyupmarketing.com';
// Column positions (must match your sheet exactly)
var COL_FIRST = 1; // A - First Name
var COL_BIZ = 2; // B - Business Name
var COL_EMAIL = 3; // C - Email
var COL_CITY = 4; // D - City
var COL_STATUS = 5; // E - Status
var COL_D0 = 6; // F - Day0 Date
var COL_D3 = 7; // G - Day3 Date
var COL_D7 = 8; // H - Day7 Date
function runOutreach() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(SHEET_NAME);
if (!sheet) { Logger.log('Sheet not found: ' + SHEET_NAME); return; }
var data = sheet.getDataRange().getValues();
var today = new Date();
var sent = 0;
for (var i = 1; i < data.length; i++) {
if (sent >= MAX_PER_RUN) break;
var row = i + 1;
var first = data[i][COL_FIRST - 1] || 'there';
var biz = data[i][COL_BIZ - 1] || 'your business';
var email = String(data[i][COL_EMAIL - 1] || '').trim();
var city = data[i][COL_CITY - 1] || 'your area';
var status = String(data[i][COL_STATUS - 1] || '').trim();
var d0Date = data[i][COL_D0 - 1];
var d3Date = data[i][COL_D3 - 1];
// Skip invalid or finished rows
if (!email || !email.includes('@')) continue;
if (['Replied','Opted-Out','Done','Day7-Sent'].indexOf(status) > -1) continue;
var dSinceD0 = d0Date ? daysBetween(new Date(d0Date), today) : 0;
var dSinceD3 = d3Date ? daysBetween(new Date(d3Date), today) : 0;
if (status === 'Send') {
var subj = 'I built a free marketing system for '
+ city + ' party rental businesses';
sendEmail(email, subj, day0(first, biz, city));
sheet.getRange(row, COL_STATUS).setValue('Day0-Sent');
sheet.getRange(row, COL_D0).setValue(today);
sent++;
Utilities.sleep(1500);
} else if (status === 'Day0-Sent' && dSinceD0 >= 3) {
var subj = 'Quick question about ' + biz;
sendEmail(email, subj, day3(first, biz));
sheet.getRange(row, COL_STATUS).setValue('Day3-Sent');
sheet.getRange(row, COL_D3).setValue(today);
sent++;
Utilities.sleep(1500);
} else if (status === 'Day3-Sent' && dSinceD3 >= 4) {
var subj = 'Last note β Party Up Marketing';
sendEmail(email, subj, day7(first));
sheet.getRange(row, COL_STATUS).setValue('Day7-Sent');
sheet.getRange(row, COL_D7).setValue(today);
sent++;
Utilities.sleep(1500);
}
}
Logger.log('Done. Emails sent this run: ' + sent);
}
function sendEmail(to, subject, body) {
try {
GmailApp.sendEmail(to, subject, body, {
name: YOUR_NAME + ' β Party Up Marketing'
});
} catch(e) {
Logger.log('Error sending to ' + to + ': ' + e.message);
}
}
function daysBetween(d1, d2) {
return Math.floor(Math.abs(d2 - d1) / 86400000);
}
// ββ EMAIL TEMPLATES βββββββββββββββββββββββββββββ
function day0(first, biz, city) {
return 'Hi ' + first + ',\n\n'
+ 'I found ' + biz + ' while looking for party rental businesses in '
+ city + '. I run a game truck in Maryland and also help party rental '
+ 'businesses grow through Party Up Marketing.\n\n'
+ 'I built a pre-made AI marketing system specifically for bounce house, '
+ 'game truck, and photo booth businesses. It handles:\n\n'
+ '- Automated follow-up texts after every quote\n'
+ '- AI phone agent that answers calls 24/7\n'
+ '- Google review requests after every event\n'
+ '- Social media posting on autopilot\n'
+ '- Seasonal booking campaigns\n\n'
+ 'I also put together 5 free SMS templates your business can start '
+ 'using today:\nlaunchaigroup.com/party-rental-texts.html\n\n'
+ 'Would you be open to a quick 15-minute call this week? No pitch β '
+ 'just showing you whatβs there.\n\n'
+ 'Anthony Whitner\n'
+ 'Party Up Marketing\n'
+ YOUR_SITE + '\n'
+ YOUR_PHONE + '\n\n'
+ 'Reply STOP to opt out of future emails.';
}
function day3(first, biz) {
return 'Hey ' + first + ',\n\n'
+ 'Just following up on my note about Party Up Marketing.\n\n'
+ 'Quick question β is the off-season a challenge for ' + biz + '? '
+ 'Most party rental businesses I talk to say fall and winter are the hardest.\n\n'
+ 'I put together a free playbook on keeping bookings coming in during '
+ 'the slow season:\nlaunchaigroup.com/party-rental-off-season.html\n\n'
+ 'Worth a look even if the full system isnβt a fit.\n\n'
+ 'Anthony\nParty Up Marketing β ' + YOUR_SITE;
}
function day7(first) {
return 'Hey ' + first + ',\n\n'
+ 'Last note from me β I know youβre busy running events.\n\n'
+ 'Leaving you with something free: 5 SMS templates for party rental '
+ 'businesses that improve quote follow-up and review requests.\n\n'
+ 'No email required:\nlaunchaigroup.com/party-rental-texts.html\n\n'
+ 'If you ever want to see what a full AI marketing system looks like '
+ 'for your business, just reply or call ' + YOUR_PHONE + '.\n\n'
+ 'Anthony Whitner\nParty Up Marketing β ' + YOUR_SITE + '\n\n'
+ 'Reply STOP to opt out.';
}
This makes the script run automatically every morning without you doing anything.
Do this once to build your initial list. Repeat weekly to keep it growing.
When someone replies to an email, do this: