Google Sheets to WhatsApp, sales forecasts delivered
You’ve got sales data in a sheet, but turning it into a forecast you actually trust is where things fall apart. The cleanup takes forever, the “forecast” is usually a guess, and by the time you share it, it’s already old. This is Sheets WhatsApp forecasts automation that stops that cycle.
If you’re a business owner, you want a quick pulse before you make a call. Sales leaders feel it when leadership asks for “next month’s outlook” right now. And honestly, ops folks get dragged into it too because someone has to pull the numbers.
This workflow pulls your Google Sheets history, runs real forecasting methods, turns the result into plain-English insights, then sends you a chart and briefing on WhatsApp. You’ll see what it does, what you need, and how to tailor it.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: Google Sheets to WhatsApp, sales forecasts delivered
flowchart LR
subgraph sg0["Monthly Schedule Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Monthly Schedule", pos: "b", h: 48 }
n1@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Workflow Configuration", pos: "b", h: 48 }
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Forecast Engine"]
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Data Cleaning"]
n5@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model1", pos: "b", h: 48 }
n10@{ icon: "mdi:database", form: "rounded", label: "Get Sales Data", pos: "b", h: 48 }
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>QuickChart"]
n12@{ icon: "mdi:cog", form: "rounded", label: "Upsert Latest Forecast", pos: "b", h: 48 }
n16@{ icon: "mdi:robot", form: "rounded", label: "Analyst AI Agent", pos: "b", h: 48 }
n17@{ icon: "mdi:swap-vertical", form: "rounded", label: "Format AI Output", pos: "b", h: 48 }
n19["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Combine Data for Chart"]
n20["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/whatsapp.svg' width='40' height='40' /></div><br/>Send WhatsApp Report"]
n21["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Prepare Chart Config"]
n11 --> n12
n11 --> n20
n4 --> n19
n4 --> n3
n10 --> n4
n3 --> n16
n16 --> n17
n17 --> n19
n0 --> n2
n5 -.-> n16
n21 --> n11
n19 --> n21
n2 --> n10
n1 -.-> n16
end
subgraph sg1["WhatsApp Flow"]
direction LR
n6@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model2", pos: "b", h: 48 }
n7@{ icon: "mdi:robot", form: "rounded", label: "Q&A AI Agent", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-vertical", form: "rounded", label: "Normalize Whatsapp Input", pos: "b", h: 48 }
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/whatsapp.svg' width='40' height='40' /></div><br/>Q&A Message"]
n13@{ icon: "mdi:cog", form: "rounded", label: "Get Latest Forecast", pos: "b", h: 48 }
n14["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Parsing Input"]
n15["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/whatsapp.svg' width='40' height='40' /></div><br/>WhatsApp Trigger"]
n18@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Text Messages", pos: "b", h: 48 }
n22@{ icon: "mdi:memory", form: "rounded", label: "Simple Memory", pos: "b", h: 48 }
n7 --> n9
n14 --> n7
n22 -.-> n7
n15 --> n18
n6 -.-> n7
n13 --> n14
n18 --> n8
n8 --> n13
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0,n15 trigger
class n1,n16,n7 ai
class n5,n6 aiModel
class n22 ai
class n18 decision
class n10 database
class n11 api
class n3,n4,n21,n14 code
classDef customIcon fill:none,stroke:none
class n3,n4,n11,n19,n20,n21,n9,n14,n15 customIcon
Why This Matters: Forecasting That’s Always “Later”
Most sales forecasts don’t fail because people are careless. They fail because the process is fragile. Someone exports numbers, someone else “fixes” the sheet, and the person making the decision gets a screenshot with no context. Then questions start. “Is this seasonal?” “Is that dip a one-off?” “How confident are we?” You end up rebuilding the same report again, usually at the worst possible time, and small data issues quietly snowball into bad calls.
It adds up fast. Here’s where it breaks down in real life.
- Copying Google Sheets data into a separate forecasting file creates version chaos, so you never know which “final” is final.
- Manual cleanup (missing months, text numbers, odd formats) turns into a recurring chore that eats an hour when you can least spare it.
- Most quick-and-dirty forecasts have no backtesting, which means you don’t get a real confidence signal when the model is wrong.
- Sharing the outcome is awkward: charts get lost in email threads, dashboards require logins, and leadership still asks for a WhatsApp summary.
What You’ll Build: A Forecasting “Briefing” That Messages You
This workflow behaves like a small virtual forecast team that runs in the background. On a schedule (monthly), it grabs your historical sales from Google Sheets and cleans the records into a consistent time series. Then the forecast engine runs seven different statistical approaches, backtests them against your own history, and selects the one with the lowest error. Next, an AI Agent reads that mathematical output and translates it into an executive-ready explanation, including confidence scores based on the error margins. Finally, it renders a trend chart as a PNG and pushes both the chart and the briefing to you on WhatsApp, so you can forward it or make decisions immediately.
The same workflow also supports follow-up questions. If you message the bot on WhatsApp, it retrieves the latest saved forecast state and answers like an on-demand analyst, comparing the forecast to historical actuals so the response is grounded in your data.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Say you update and share a forecast once a month. Manually, it’s usually 30 minutes to pull data, about an hour to clean it and rebuild the chart, then another 20 minutes writing a summary and sending it around, so roughly 2 hours total. With this workflow, you spend about 10 minutes once mapping your Sheet ID and checking the WhatsApp recipient. After that, the monthly run lands in WhatsApp with the PNG chart and briefing automatically, and follow-up Q&A is just a message.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for your Year/Month/Sales history table.
- WhatsApp to receive the report and ask questions.
- OpenAI API key (get it from your OpenAI platform dashboard)
Skill level: Intermediate. You will connect credentials, map a Sheet ID, and sanity-check a few fields, but you won’t be writing an app.
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
A monthly schedule kicks it off. The workflow starts from a scheduled trigger, so you can have it run on the first day of the month, after close, or whenever your team normally checks pipeline and revenue direction.
Google Sheets is pulled and cleaned. It reads your sheet (Year, Month, Sales), then a cleansing step normalizes the records so missing values and odd formats don’t poison the forecast.
The forecast is computed and explained. A code-based forecast engine tests multiple statistical methods, backtests them, and chooses the winner. Then the AI Agent turns the output into a business narrative with confidence scores, using the OpenAI chat model plus short-term conversation memory for consistency.
A chart and briefing are delivered to WhatsApp. The workflow builds a chart configuration, calls a chart-rendering service by HTTP request to generate a PNG, stores the latest forecast JSON in a data table, and sends the chart and summary to WhatsApp. A second path listens for inbound WhatsApp messages and replies with Q&A based on that saved “latest forecast” state.
You can easily modify the schedule and the report format to match your cadence and tone. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
Set the monthly schedule and initialize workflow settings before any data retrieval begins.
- Open Scheduled Monthly Start and set the rule to run monthly with Trigger At Hour set to
9. - Open Workflow Settings Map and confirm spreadsheetId is
SalesSheetand sheetName isSales. - Ensure Workflow Settings Map keeps Include Other Fields enabled.
Step 2: Connect Google Sheets
Retrieve the monthly sales history from Google Sheets for cleaning and forecasting.
- Open Retrieve Sales Sheet and select your file in Document and the tab in Sheet Name.
- Set Authentication to
serviceAccount. - Credential Required: Connect your
googleApicredentials.
Step 3: Clean and Forecast Sales Data
Clean incoming rows and compute the forecast, then generate executive insights.
- Verify Cleanse Sales Records keeps the mapping from
MonthlySalestoSalesand buildsperiodasYYYY-MM. - Confirm the parallel execution: Cleanse Sales Records outputs to both Merge Chart Inputs and Forecast Computation in parallel.
- Review Forecast Computation to ensure the forecasting logic remains intact for your monthly dataset.
- Open Insight Analyst Agent and keep Has Output Parser enabled; it uses Structured Result Parser as the output parser and Primary Chat Model as the language model.
- Credential Required: Connect your
openAiApicredentials in Primary Chat Model (used by Insight Analyst Agent). - In Format Executive Output, confirm summaryReport is set to
{{ $json.output.reasoning }}.
Step 4: Build and Render the Forecast Chart
Merge the forecast with clean data, build the chart configuration, and render the image.
- Ensure Merge Chart Inputs is set to Mode
combineand Combine BycombineByPosition. - Open Build Chart Config and confirm it appends the forecast period and builds the line chart configuration.
- Configure Chart Rendering Request with URL
https://quickchart.io/chartand MethodPOST. - Set the chart body parameter chart to
{{ JSON.stringify($json.chartConfig) }}, and confirm format ispng, width is1200, and height is600. - Note the parallel execution: Chart Rendering Request outputs to both Store Latest Forecast and WhatsApp Report Dispatch in parallel.
chart, the WhatsApp image send in WhatsApp Report Dispatch will fail.Step 5: Configure WhatsApp Q&A and Security Gate
Handle incoming WhatsApp questions, validate the sender, and generate AI responses from stored forecast history.
- Open Incoming WhatsApp Trigger and ensure it listens for updates set to
messages. - Credential Required: Connect your
whatsAppTriggerApicredentials in Incoming WhatsApp Trigger. - In Validate Text Sender, set the condition to compare
{{ $json.messages[0].from }}equals16727551224. - Open Normalize WhatsApp Payload and keep chatInput set to the extraction expression for WhatsApp message body.
- In Retrieve Latest Forecast, confirm the filter uses key equals
latest. - In Parse History Payload, keep the normalization logic to map
year,month, andsalescorrectly. - Open Forecast Q&A Agent and confirm the prompt text is
{{ $('Normalize WhatsApp Payload').item.json.chatInput }}. - Credential Required: Connect your
openAiApicredentials in Secondary Chat Model (used by Forecast Q&A Agent). - Confirm Conversation Memory is connected as AI memory to Forecast Q&A Agent; update credentials on the parent model, not the memory node.
- Open Send Q&A Reply and set Text Body to
{{ $json.output }}. - Credential Required: Connect your
whatsAppApicredentials in Send Q&A Reply.
[YOUR_ID] placeholders in Send Q&A Reply and WhatsApp Report Dispatch with valid WhatsApp phone number IDs and recipient numbers.Step 6: Configure Data Storage and Report Dispatch
Store the latest forecast and send the chart report via WhatsApp.
- Open Store Latest Forecast and confirm Operation is
upsertwith key set tolatest. - Verify the stored fields use expressions: historySales uses
{{ JSON.stringify($items("Retrieve Sales Sheet").map(i => ({ year: i.json.Year, month: i.json.Month, sales: i.json.MonthlySales }))) }}, forecastSales uses{{ $json.output.forecastedSales }}, summaryReport uses{{ $json.summaryReport }}, and forecastPeriod uses{{ $json.output.forecastHorizon }}. - Open WhatsApp Report Dispatch and set Message Type to
imageand Media Property Name tochart. - Ensure WhatsApp Report Dispatch uses mediaCaption set to
{{ $json.summaryReport }}. - Credential Required: Connect your
whatsAppApicredentials in WhatsApp Report Dispatch.
Step 7: Test and Activate Your Workflow
Run end-to-end tests for both the scheduled report and the WhatsApp Q&A paths, then activate for production.
- Click Execute Workflow to test the scheduled path starting at Scheduled Monthly Start.
- Confirm that Chart Rendering Request returns a
chartfile and that Store Latest Forecast upserts the latest record. - Send a test WhatsApp message to trigger Incoming WhatsApp Trigger and verify Send Q&A Reply returns an AI response.
- When all tests pass, toggle the workflow to Active for monthly production runs.
Troubleshooting Tips
- Google Sheets credentials can expire or need specific permissions. If things break, check the connected Google account access to the target Sheet (and that the Sheet ID in your configuration node matches the right file) first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Quick Answers
About 30 minutes if your credentials and sheet are ready.
No. You’ll mostly connect accounts and map your Google Sheet fields. The forecast logic is already built into the workflow.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API costs, which are usually a few cents per run for a simple monthly report.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and you should. You can change the schedule trigger to weekly, swap the Google Sheets input for a different sheet, and adjust the “Format Executive Output” step to match your leadership style. If you want the Q&A to behave differently, tweak the “Forecast Q&A Agent” prompt so it answers in your terminology (pipeline vs. bookings, revenue vs. MRR). You can also replace the chart renderer call by editing the “Chart Rendering Request” node.
Usually it’s credentials or sender validation. Start by checking the WhatsApp Trigger and “Validate Text Sender” step to confirm the inbound number is allowed, then re-authenticate the WhatsApp credential used by “Send Q&A Reply” and “WhatsApp Report Dispatch.” If the workflow sends nothing but shows green checks, it can also be a formatting problem in the normalized payload, so review the “Normalize WhatsApp Payload” mapping.
For a monthly forecast message, volume is basically a non-issue.
Often, yes, because this workflow isn’t just “move data from A to B.” You’re doing data cleansing, running code-based forecasting, generating a chart via HTTP, storing state in a table, and supporting two-way WhatsApp Q&A with memory, which is the kind of multi-branch logic that gets awkward (and expensive) in simpler tools. n8n also gives you a self-host option, so you’re not paying per tiny step when you expand the workflow. Zapier or Make can still be fine if you only want a basic “send me a sheet snapshot” alert. If you want help picking the right stack, Talk to an automation expert.
You get a forecast you can defend, delivered somewhere you’ll actually read it. Set it up once, then let the workflow do the monthly chasing.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.