Google Sheets + OpenAI: call sentiment scores done
Listening to calls all day isn’t the worst part. It’s the messy follow-up: jumping between transcripts, trying to “score” tone consistently, then realizing your notes don’t match what someone else would’ve written.
QA managers feel it first, because calibration becomes a weekly debate. But support leads and ops-minded founders end up in the same spot, too. This call sentiment automation turns a Google Sheet of transcripts into consistent, comparable QA fields you can actually act on.
You’ll see how the workflow reads each row, asks OpenAI for structured scoring across key categories, then writes clean fields back into the sheet for filtering, coaching, and trend tracking.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets + OpenAI: call sentiment scores done
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n2@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n3@{ icon: "mdi:database", form: "rounded", label: "Get All Transcript", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Send only Transcript Field", pos: "b", h: 48 }
n5@{ icon: "mdi:robot", form: "rounded", label: "Analysis Transcript", pos: "b", h: 48 }
n6@{ icon: "mdi:robot", form: "rounded", label: "Structured Output", pos: "b", h: 48 }
n7@{ icon: "mdi:database", form: "rounded", label: "Store Analysis Transcript", pos: "b", h: 48 }
n1 --> n4
n2 --> n3
n0 -.-> n5
n6 -.-> n5
n3 --> n1
n5 --> n7
n7 --> n1
n4 --> n5
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 n2 trigger
class n5,n6 ai
class n0 aiModel
class n3,n7 database
The Problem: Manual call reviews don’t scale
When every call “should be reviewed,” what that really means is: a handful get reviewed, the rest become a vague feeling that things are fine. Manual QA breaks down as soon as volume rises, or when you have multiple reviewers with different standards. One person flags a greeting as “cold,” another calls it “neutral,” and suddenly coaching turns into arguing about opinions. And if your transcripts live in Google Sheets, you end up copying snippets into notes, chasing columns, and losing any chance at clean reporting.
It adds up fast. Here’s where the friction compounds.
- Reviewing even 20 transcripts a week can eat about 3 to 5 hours of focused time.
- Scores drift between reviewers, so “agent friendliness” means something different every week.
- Coaching gets delayed because the insights are trapped in free-text notes.
- You can’t reliably filter by “issue resolved” or “bad closing” if those fields aren’t consistently filled.
The Solution: Automated sentiment scoring inside Google Sheets
This workflow watches a Google Sheet that contains call transcripts (plus agent name and customer name), then analyzes each call with OpenAI using a structured prompt. Instead of producing a blob of text, it returns clean, predictable fields: greeting sentiment, agent friendliness, problem-solving sentiment, customer sentiment, closing sentiment, whether the issue was resolved, plus an overall call rating. n8n loops through every row, maps the transcript into the AI step, parses the response into structured JSON, and writes the results back into new columns in the same sheet. That means your “QA form” becomes the spreadsheet you already use, just upgraded with consistent scoring.
The workflow starts on a schedule, pulls all transcripts from Google Sheets, and processes them in batches. OpenAI scores each transcript across the same categories every time. Finally, n8n updates the original row, so your team can sort, filter, and coach without rewriting anything.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say your team logs 50 calls a week into a Google Sheet. If a reviewer spends about 6 minutes reading each transcript and filling a few QA fields, that’s roughly 5 hours a week, and it still won’t be perfectly consistent. With this workflow, you trigger it on a schedule, let it run in the background for a bit, and your sheet is updated automatically with the sentiment fields and a final rating. You still review the lowest-rated calls, but now you’re reviewing with a shortlist instead of a guess.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store transcripts and QA fields
- OpenAI to score sentiment and resolution status
- OpenAI API key (get it from the OpenAI API dashboard)
Skill level: Beginner. You’ll connect accounts, confirm sheet columns, and paste in your API key.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A scheduled run kicks it off. n8n starts on a timer (daily or weekly is common) so new transcripts get scored without someone remembering to press a button.
Your sheet is pulled, then processed in batches. The workflow retrieves all rows from Google Sheets and loops through them. Batching matters when the sheet grows, because you don’t want one giant run to time out.
OpenAI scores the transcript using a structured prompt. The transcript text is mapped into the AI step, which returns specific fields like greeting sentiment, customer sentiment, “issue resolved,” and an overall rating.
Results go straight back into Google Sheets. The structured JSON is parsed and used to update the same row, adding new columns for each category so you can filter and coach immediately.
You can easily modify the scoring categories to match your QA rubric (or the rating scale) based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Trigger
Set the workflow to run automatically on a daily schedule using the existing trigger node.
- Add or open Scheduled Automation Trigger.
- Set the schedule rule to run at
triggerAtHour: 19under the interval configuration. - Connect Scheduled Automation Trigger to Retrieve All Transcripts to match the workflow flow.
Step 2: Connect Google Sheets
Configure the read and update operations for the transcript sheet.
- Open Retrieve All Transcripts and set Document to
[YOUR_ID]and Sheet toSheet1(gid=0). - Under Filters, keep the lookup column set to
Status. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials to Retrieve All Transcripts. - Open Update Transcript Analysis and confirm Operation is set to
updatewith the same Document and Sheet settings. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials to Update Transcript Analysis.
⚠️ Common Pitfall: Ensure the sheet contains a Full Transcript column because it’s used as the matching column in Update Transcript Analysis.
Step 3: Set Up the Record Loop and Field Mapping
Loop through each transcript row and map the transcript text for analysis.
- Confirm Retrieve All Transcripts outputs to Iterate Through Records.
- Open Iterate Through Records to keep default batch settings for sequential processing.
- In Map Transcript Field, set the assignment for Full Transcript to
={{ $json["Full Transcript"] }}. - Verify the loop connection: Update Transcript Analysis outputs back to Iterate Through Records.
Step 4: Configure AI Sentiment Analysis and Structured Output
Use the AI agent to analyze each transcript and return a structured JSON response.
- Open OpenAI Dialogue Model and set the model to
gpt-4o-mini. - Credential Required: Connect your
openAiApicredentials to OpenAI Dialogue Model. - Open Analyze Transcript Sentiment and set Text to
={{ $json["Full Transcript"] }}. - In Analyze Transcript Sentiment, keep Prompt Type as
defineand confirm System Message contains the provided sentiment rubric. - Open Structured JSON Output and keep the JSON Schema Example as provided for consistent output structure.
- Ensure Structured JSON Output is connected as the output parser to Analyze Transcript Sentiment. Credentials should be added to OpenAI Dialogue Model, not to Structured JSON Output.
⚠️ Common Pitfall: If the AI output is not valid JSON, the update step will fail. Keep the structured output schema unchanged unless you also update the Google Sheets column mapping.
Step 5: Configure Output Mapping in Google Sheets
Write the AI-generated sentiment fields back to the transcript sheet.
- In Update Transcript Analysis, map Status to
Done. - Set Agent Name to
={{ $json.output["Agent Name"] }}and Customer Name to={{ $json.output["Customer Name"] }}. - Set Total Rating to
={{( Number($json.output["Greeting Sentiment"]) + Number($json.output["Closing Sentiment"]) + Number($json.output["Problem Solving"]) + Number($json.output["Agent Friendliness"]))/4}}. - Map Full Transcript to
={{ $('Iterate Through Records').item.json['Full Transcript'] }}so the update matches the correct row. - Map the remaining sentiment fields using the exact expressions from the node:
Greeting Sentiment,Closing Sentiment,Problem Solving,Agent Friendliness,Customer Sentiment,Issue Resolved, andConversations Topics.
Full Transcript so each row updates correctly instead of creating duplicates.Step 6: Test and Activate Your Workflow
Run a manual test to validate data flow and confirm the workflow is ready for scheduling.
- Click Execute Workflow to trigger Scheduled Automation Trigger manually.
- Watch Iterate Through Records process each transcript and verify Analyze Transcript Sentiment returns a structured JSON output.
- Confirm Update Transcript Analysis updates the correct rows and writes values like
Status: Doneand the sentiment scores. - When testing is successful, toggle the workflow to Active to enable scheduled runs.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check the n8n credential settings and your Google account access scope 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.
Frequently Asked Questions
About 30 minutes if your sheet is ready.
No. You’ll connect Google Sheets and OpenAI, then confirm which columns contain the transcript and names.
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 usage (usually a few dollars a month unless you’re processing thousands of transcripts).
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 probably should. You can adjust the prompt in the Analyze Transcript Sentiment AI step so the categories match your scorecard (for example, add “policy compliance” or “next steps confirmed”). You can also change the Structured JSON Output parser to enforce your exact field names and allowed values. Common customizations include scoring on a 1–5 scale, adding topic labels, and flagging calls that need a manager review.
Usually it’s a permissions issue or an expired Google authorization. Reconnect the Google Sheets credential in n8n, then confirm the sheet is shared with the same Google account and the workflow is pointing at the right spreadsheet and tab. If it fails only on updates, check that the workflow has the row ID (or matching key) it needs to write back to the correct row.
Hundreds per run is realistic for most teams, and it scales up from there if you batch it and your OpenAI limits allow it.
Often, yes, if you want structured fields, batching, and more control over how the AI output is validated. n8n is comfortable with loops and “process every row” jobs, which is exactly what transcript QA looks like in real life. It’s also easier to keep costs predictable when you’re running lots of executions, especially if you self-host. Zapier or Make can still be fine for lightweight use, like scoring a handful of transcripts a day, but you may hit limits faster. Talk to an automation expert if you want help choosing.
Once this is running, your spreadsheet becomes a QA system that doesn’t get tired or inconsistent. You focus on coaching and patterns. The workflow handles the repetitive scoring.
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.