Weekly
Send your newsletter to everyone in a subscriber sheet
AI drafts your newsletter, you approve it, and it goes to every subscriber in your sheet through SendGrid, with each send logged.
- Runs
- Weekly
- Apps
- Google Sheets, SendGrid
- AI
- Yes, uses the built-in AI allowance
- Access
- sheet read; Mail Send
Send this to your assistant
Create a ClickRuntime automation: every Monday, draft this week's newsletter from my notes and email it to me for approval. Once I approve, send it through SendGrid to everyone in my Subscribers sheet and log each send.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A local bakery collects email addresses at the counter in a shared sheet. The owner means to send a weekly note about new bakes and opening hours, but writing it and sending it to a growing list takes an evening they don't have.
Each Monday a draft is written from the owner's short notes and emailed to them first. Once they approve, it goes out through SendGrid to everyone in the sheet in batches, and every send is logged so nobody is missed or emailed twice.
What you get out of it
A newsletter that goes out every week
A draft waiting in your inbox makes it far easier to send than starting from a blank page.
You approve every issue
Nothing reaches subscribers until you've read it and said yes.
Reliable delivery to the whole list
SendGrid handles volume and sender reputation, and sending in batches keeps you within its limits.
The sheet stays your list
Add or remove people in the sheet as you always have; each issue goes to whoever is on it that day.
How it works
What happens, step by step
Every Monday, ClickRuntime reads this week's notes and AI writes a newsletter draft.
The draft is emailed to you for approval, and nothing goes to subscribers until you approve.
Once approved, it is sent through SendGrid to everyone in your subscriber sheet, in batches.
Each send is logged, so if a run is interrupted no one gets the issue twice.
Before it runs live
- Connect your Google Sheets account and pick the spreadsheets it may use
- Connect SendGrid
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
- Run it at a different time, more or less often, or only on weekdays
- Change what the AI looks for, or how it writes the result
- Add another app, for example also send it to Slack
- Combine it with other Google Sheets and SendGrid steps into one automation
Under the hood
The code that runs this automation
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from clickruntime import on_trigger, credentials, http, ai, state, notify
SHEET_ID = "your-spreadsheet-id"
@on_trigger
def run(event):
values = build("sheets", "v4", credentials=Credentials(credentials.connection("google", "work")), cache_discovery=False).spreadsheets().values()
draft = state.get("draft")
if not draft:
notes = values.get(spreadsheetId=SHEET_ID, range="Notes!A2:A").execute().get("values", [])
text = ai.generate("Write a short, warm weekly newsletter from these notes:\n" + "\n".join(r[0] for r in notes if r),
max_output_tokens=700).text
state.set("draft", {"text": text, "approved": False, "sent": []})
notify.email_me("Newsletter draft for approval", text + "\n\nReply via your approval link to send.")
return {"status": "awaiting approval"}
if not draft["approved"]:
return {"status": "still waiting"}
emails = [r[0] for r in values.get(spreadsheetId=SHEET_ID, range="Subscribers!A2:A").execute().get("values", []) if r]
todo = [e for e in emails if e not in draft["sent"]][:500]
key = credentials.secret("SENDGRID_API_KEY")
for email in todo:
http.post("https://api.sendgrid.com/v3/mail/send", headers={"Authorization": f"Bearer {key}"},
json={"from": {"email": "news@northwind-bakery.example"}, "subject": "This week at Northwind Bakery",
"personalizations": [{"to": [{"email": email}]}], "content": [{"type": "text/plain", "value": draft["text"]}]})
draft["sent"].append(email)
state.set("draft", draft if len(draft["sent"]) < len(emails) else None)
return {"sent": len(todo)}FAQ
Common questions
How do I give it notes for the issue?
How do I approve the draft?
What happens if the send stops halfway?
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
Send a personalised email sequence to leads in a sheet
Each lead in your sheet gets a short, personal sequence of emails through SendGrid, and the sheet shows who is at which step.
See how it worksEmail the team a weekly metrics report from a sheet
Every Monday your team gets an email with last week's numbers from your sheet, the change from the week before, and a short summary.
See how it worksScreen applicants in a sheet and email each one
Every new applicant in your sheet is scored against the job, the score is written back, and they get the right email.
See how it worksKeep exploring
Set up “Send your newsletter to everyone in a subscriber sheet” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.