On a schedule
Welcome every new QuickBooks customer by email
Each customer you add to QuickBooks gets a welcome email from your Gmail, and is logged in a sheet so nobody is welcomed twice.
- Runs
- On a schedule
- Apps
- Google Sheets, QuickBooks
- AI
- Not needed
- Access
- accounting read; sheet editor
Send this to your assistant
Create a ClickRuntime automation: every hour, check QuickBooks for new customers, send each a welcome email from Gmail and log them in my Customers sheet so nobody gets two.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A new client relationship starts with their details going into QuickBooks, and then often nothing until the first invoice. A short welcome, with who to contact and how billing works, sets expectations, but it depends on someone remembering to send it.
Sending the welcome whenever a customer appears in QuickBooks makes it consistent, and the sheet gives a running list of every new customer and when they were welcomed.
What you get out of it
Every customer is welcomed
Nobody depends on memory, so the client who signs on a busy Friday gets the same start as everyone else.
Fewer billing questions
Explaining payment terms and contacts up front means fewer confused emails when the first invoice arrives.
A list of new customers
The sheet shows who joined and when, useful for monthly reviews and follow-up calls.
Sent from you
The email comes from your own address, so replies reach you directly.
How it works
What happens, step by step
Every hour, ClickRuntime asks QuickBooks for customers created since its last check.
It skips anyone already listed in your Customers sheet.
It sends each new customer a welcome email from your Gmail address.
It adds them to the sheet with the date they were welcomed.
Before it runs live
- Connect your Google Sheets account and pick the spreadsheets it may use
- Connect QuickBooks
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Act only on the items that match your own rules, and skip the rest
- Add an AI step, for example to summarize, sort or draft a reply
- Add another app, for example also send it to Slack
- Combine it with other Google Sheets and QuickBooks steps into one automation
Under the hood
The code that runs this automation
import base64
from datetime import date
from email.message import EmailMessage
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from clickruntime import on_trigger, credentials, http, state, report_fetched
SHEET_ID = "your-spreadsheet-id"
API = "https://quickbooks.api.intuit.com/v3/company/1234567890" # your QuickBooks company id
def qb(method, path, **kw):
r = http.request(method, API + path, params={"minorversion": 73, **kw.pop("params", {})}, **kw, headers={"Accept": "application/json", "Authorization": "Bearer " + credentials.connection("quickbooks", "company")})
return r.raise_for_status() or r.json()
@on_trigger
def run(event):
since = state.get("since") or str(date.today())
found = qb("GET", "/query", params={"query": f"select * from Customer where MetaData.CreateTime > '{since}'"})["QueryResponse"].get("Customer", [])
sheets = build("sheets", "v4", credentials=Credentials(credentials.connection("google", "work")), cache_discovery=False).spreadsheets()
logged = {r[0] for r in sheets.values().get(spreadsheetId=SHEET_ID, range="Customers!A2:A").execute().get("values", []) if r}
new = [c for c in found if c["Id"] not in logged]
report_fetched(len(new))
if not new:
return {"summary": "Nothing new"}
gmail = build("gmail", "v1", credentials=Credentials(credentials.connection("google", "work")), cache_discovery=False)
for c in new:
if c.get("PrimaryEmailAddr"):
msg = EmailMessage()
msg["To"], msg["Subject"] = c["PrimaryEmailAddr"]["Address"], f"Welcome to Northwind, {c['DisplayName']}"
msg.set_content(f"Hi {c.get('GivenName') or c['DisplayName']},\n\nWelcome aboard. Invoices are due within 30 days; reply to this email with any questions.")
gmail.users().messages().send(userId="me", body={"raw": base64.urlsafe_b64encode(msg.as_bytes()).decode()}).execute()
sheets.values().append(spreadsheetId=SHEET_ID, range="Customers!A:C", valueInputOption="RAW", body={"values": [[c["Id"], c["DisplayName"], str(date.today())] for c in new]}).execute()
state.set("since", max(c["MetaData"]["CreateTime"] for c in new))
return {"welcomed": len(new)}FAQ
Common questions
Where does the email address come from?
Can I write my own welcome message?
What if I import lots of old customers at once?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Turn rows in a billing sheet into QuickBooks invoices
Each new row in your billing sheet becomes a QuickBooks invoice, and the invoice number is written back into the row.
See how it worksAdd expenses from a sheet into QuickBooks
Expenses your team lists in a Google Sheet are added to QuickBooks within the hour and marked as uploaded.
See how it worksLog emailed supplier invoices in a sheet and create bills once approved
Supplier invoices from your inbox are logged as rows in your payables sheet, and each one becomes a QuickBooks bill when you mark it Approved.
See how it worksKeep exploring
Set up “Welcome every new QuickBooks customer by email” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.