Every 15 minutes
Draft answers to RFP questionnaires
When an RFP arrives by email, answers are drafted from your company details and saved as a Gmail reply for you to check.
- Runs
- Every 15 minutes
- Apps
- Gmail, Slack
- AI
- Yes, uses the built-in AI allowance
- Access
- Gmail gmail.modify; Slack chat:write
Send this to your assistant
Create a ClickRuntime automation: when an email arrives with 'RFP' in the subject and an attachment, draft an answer to each question using our company details, save it as a Gmail draft reply, and tell #sales in Slack.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
Responding to a request for proposal, or a customer security questionnaire sent as an attachment, eats days. A sales engineer receives a 60-question document, hunts through old answers for the same questions and copies them into a new file. The deadline is two weeks away, so nothing starts until the last minute, and the early part of the window is wasted.
Every 15 minutes the inbox is checked for matching emails with an attachment. The questions are extracted, ClickRuntime's built-in AI drafts an answer to each, and a draft reply is saved in Gmail. A Slack message tells the team the draft is ready, so someone can review it that same day.
Sales and pre-sales teams, security and compliance leads, and consultancies that respond to many RFPs benefit most. It also suits any team that handles customer questionnaires often.
What you get out of it
Deadlines are met with room to spare
Having every question answered in draft form on day one leaves the remaining time for review and refinement, instead of a frantic rush in the final 48 hours. Reviewers are also less stressed and less error-prone with time in hand.
Experts review instead of retyping
A subject matter expert corrects an existing answer in minutes, which is much faster than writing from a blank page, so their limited availability covers more of the document. Their expertise is applied to accuracy instead of typing.
The team knows immediately
The Slack note tells everyone an RFP arrived and who has the draft, so the start of the response is coordinated and nobody finds out from the customer's reminder. Starting together avoids last-minute surprises for everyone involved.
More bids can be pursued
Cutting the effort of each response means a small team can reply to opportunities it would previously have skipped, which widens the sales pipeline. More proposals mean more chances of winning new customers.
Nothing goes out unchecked
The reply is saved as a draft, not sent, so a person must read and approve the answers before they reach the prospect, which matters where accuracy is contractual. The responsibility for accuracy stays with your own people.
How it works
What happens, step by step
Every 15 minutes, ClickRuntime checks Gmail for emails with "RFP" in the subject and an attachment, skipping any it has already handled.
It reads the attached questionnaire and pulls out the questions.
AI drafts an answer to each question using the company details you provide.
The answers are saved as a draft reply in Gmail for you to check, and a note in your #sales Slack channel tells you it is ready.
Before it runs live
- Connect Google through your own Google app (a one-time, 10-minute setup), so it works with your own Gmail
- Connect Slack, then invite the app to the channel (type /invite @ClickRuntime there)
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
- Change what the AI looks for, or how it writes the result
- Add another app, for example also send it to Google Sheets
- Combine it with other Gmail and Slack steps into one automation
Under the hood
The code that runs this automation
import base64
from email.message import EmailMessage
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from clickruntime import on_trigger, credentials, state, ai, notify, report_fetched
COMPANY = "Acme Ltd: 40 staff, ISO 27001 certified, UK and EU data hosting, 24/7 support, founded 2015."
@on_trigger
def run(event):
gmail = build("gmail", "v1", credentials=Credentials(credentials.connection("google", "work")), cache_discovery=False)
seen = set(state.get("seen") or [])
msgs = gmail.users().messages().list(userId="me", q="subject:RFP has:attachment newer_than:2d").execute().get("messages", [])
new = [m for m in msgs if m["id"] not in seen]
report_fetched(len(new))
if not new:
return {"new": 0}
for m in new:
msg = gmail.users().messages().get(userId="me", id=m["id"]).execute()
h = {x["name"]: x["value"] for x in msg["payload"]["headers"]}
part = next(p for p in msg["payload"].get("parts", []) if p.get("filename", "").endswith((".txt", ".md", ".csv")))
att = gmail.users().messages().attachments().get(userId="me", messageId=m["id"], id=part["body"]["attachmentId"]).execute()
questions = base64.urlsafe_b64decode(att["data"]).decode(errors="ignore")[:15000]
answers = ai.generate(questions, max_output_tokens=2000,
system=f"Answer each RFP question in turn, numbered, using only these facts: {COMPANY}").text
draft = EmailMessage()
draft["To"], draft["Subject"] = h["From"], "Re: " + h["Subject"]
draft.set_content(answers)
gmail.users().drafts().create(userId="me", body={"message": {
"raw": base64.urlsafe_b64encode(draft.as_bytes()).decode(), "threadId": msg["threadId"]}}).execute()
notify.slack(f"📄 Drafted RFP answers for {h['Subject']} from {h['From']}. Check Gmail drafts.", channel="#sales")
state.set("seen", [m["id"] for m in msgs])
return {"drafted": len(new)}FAQ
Common questions
What file formats can it read?
How does it know an email is an RFP?
Will the AI use my company's earlier answers?
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
Get your important emails in Slack
New mail is sorted and labelled for you, and the urgent ones are posted to Slack with a one-line summary.
See how it worksGet a quick summary of every CV you receive
When a CV arrives by email, your hiring channel gets a short profile of the candidate.
See how it worksSend support emails to your team in Slack
Every new support email is summarised with a priority and posted to your support channel.
See how it worksKeep exploring
Set up “Draft answers to RFP questionnaires” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.