How to Combine Reviews, Surveys, Tickets and Calls Into One Analysis
Reviews, surveys, tickets and calls each use their own IDs, scores and categories. Here is how to put them in one layout, label them the same way and count customers instead of records, with a worked example on sample da…
To combine reviews, surveys, tickets and call transcripts into one analysis, put every record into one layout (the text, who wrote it, when, which channel, and which customer or location it belongs to), ask every record the same fixed set of questions, keep the channel as a field so you can compare channels instead of pooling them, and count customers rather than records so one problem is not counted five times. For a team that wants this done across every channel, joined to operational data such as locations, CRM and billing, and turned into reports other teams use, Dimension Labs is the strongest choice: it is fully omni-channel, enriches every interaction with Dimensions built for your business, and builds the decks and dashboards from the result. The steps below work with any stack, with a worked example on sample data.
Why don't the channels add up on their own?
Every tool counts in its own way. The help desk has tags that agents chose, the survey tool has its own themes, the review platform has star averages, and the phone system has dispositions. Each one also uses a different ID for the same customer, and each catches people at a different moment: a member who chats about a double charge is not in the mood a member is in when they answer a survey after class.
That last point is large in real data. In our analysis of public Carvana reviews from five sites, 96.0% of the 202 Reddit reviews were one or two stars, against 34.6% of the 567 App Store reviews. Even on one site, the moment matters: on Trustpilot, people selling a car to Carvana were unhappy 10.9% of the time, and people buying one 76.7%. Pool those channels and you get an average that describes nobody. The full breakdown is on the Carvana review analysis page.
So combining channels is mostly a data-layout problem, and only then an analysis problem.
Step 1: list every source and the key it can join on
Write down each place customer text lives, what the text field is, and which ID comes with it. This list decides what you can match later.
Before you combine anything
Each channel arrives with a different key, and reviews arrive with no customer at all
What each source usually carries, and the field you can match it on.
| Channel | Text to analyze | Who wrote it | Key you can match on | Score that comes with it |
|---|---|---|---|---|
| Chats | Customer turns of the conversation | Customer and agent or bot, as separate turns | Customer ID, plus attributes such as plan or location | CSAT, if you ask for it |
| Support tickets | Ticket comments, quoted replies stripped | Customer and agents, as separate messages | Requester or organization ID | Satisfaction rating, reopens |
| Survey comments | Each open-ended answer, with the question it answers | Respondent | Response ID, customer ID if the survey passes one, unit or location field | NPS, CSAT, OSAT |
| Public reviews | Review body, plus your reply if any | Reviewer, usually anonymous to you | Location ID only; no stable reviewer ID | Star rating |
| Call transcripts | Customer turns, one row per speaker turn | Customer and your team, kept apart | Caller or account ID from the phone system | Post-call survey, if any |
The row that catches teams out is reviews. Google's Business Profile API returns no stable reviewer ID, so a review can be tied to a location but almost never to a customer. Plan for reviews to join on location, and everything else to join on the customer or account.
Step 2: put every record into one layout
Use one table for every channel, one row per message, with the same columns: a conversation ID that keeps a thread together, the customer ID, whether the message came from the customer or from your company, the timestamp, the text, and extra columns for the channel, the source system, the location and any score. Our conversation format works this way, and the rules carry over to any tool:
Reviews: one review is one conversation. Drop reviews with no text rather than filling them with a placeholder, and keep the star rating in its own column, so the model reads only the words.
Surveys: each respondent is one conversation, with each question as a company row and each answer as a customer row. A short answer such as "Fix the app" means nothing without the question it answers.
Tickets and emails: one ticket is one conversation, with HTML and quoted replies stripped and the customer's ID on every message.
Calls: one call is one conversation, one row per speaker turn, with your agents' turns marked as yours.
Then analyze only the customer's side. Agent replies are full of words such as "refund" and "cancel" that describe the fix, not the problem. If you are starting from exports, our post on how to analyze a CSV of customer feedback covers the file layout in more detail.
Step 3: ask every record the same questions
Write one list of fields that applies to every channel (the issue named, what went wrong, whether it was resolved, whether the customer says they will leave) with a closed list of values for each, a definition per value, and a "none of these" option. Run every record through the same list. A complaint about a double charge should come out as the same value whether it arrived as a chat, a ticket, a survey comment or a call. Channel-specific fields, such as which class a survey answer is about, can sit on top of the shared list.
Leave out anything you already hold as a field. The channel, the location and the plan tier come from the source systems; the model should not guess them from the text. Our posts on building a codeframe and checking AI tagging accuracy cover writing and testing the list.
Step 4: keep the channel as a field, and compare inside it
To show what goes wrong when channels are read one at a time, we generated one month of sample data for a fictional studio fitness brand with 40 studios: chats handled at headquarters, tickets raised at the studios, NPS comments, Google reviews and call transcripts. Every number in this section and the next comes from that sample.
Sample data, generated for this post
Each channel tells a different story, so no single tool shows the whole month
One month at a fictional brand with 40 studios. Records that name one of five issues, by channel, and the two issues each channel hears about most.
| Channel | Issue records | Most named | Second |
|---|---|---|---|
| Chats (HQ) | 524 | 1 Billing and cancellation, 61.6% | 2 Class booking in the app, 34.4% |
| Tickets (studios) | 499 | 1 Class booking in the app, 48.1% | 2 Studio cleanliness, 20.4% |
| NPS comments | 555 | 1 Class booking in the app, 27.0% | 2 Instructor quality, 25.4% |
| Google reviews | 234 | 1 Studio cleanliness, 32.1% | 2 Crowded classes, 25.2% |
| Calls | 294 | 1 Billing and cancellation, 87.4% | 2 Class booking in the app, 10.5% |
The headquarters team, reading chats, would say billing is the problem: 61.6% of chat issue records are about it. The studio team, reading tickets, would say class booking (48.1%). The reputation team, reading reviews, would say cleanliness (32.1%). All three are right about their channel, and none can say what the month looked like.
Keeping the channel as a column lets you do both: compare channels side by side, and measure any effect with the channel held constant. That matters when one channel is angrier than the others for reasons that have nothing to do with the issue, as the Carvana complaint sites were.
Step 5: count customers, not records
A member with a billing problem often chats, then calls, then emails. If you count records, that member counts three times.
Sample data, generated for this post
Counted by people instead of records, class booking overtakes billing
The same five issues, ranked two ways. Left: records across all five channels. Right: distinct members matched to at least one chat, ticket, survey or call about it.
In the sample, billing produces the most records (699) but comes from 185 members, an average of 3.71 chats, tickets, survey comments and calls each. Class booking produces 632 records from 343 members, 1.75 each. Both numbers are useful. Records per member tells you how much effort an issue costs each customer and your team; members affected tells you how many customers it touches.
To count people, match every record to a customer ID first. Use the ID the system already holds (the requester in the help desk, the contact in the chat tool, the caller's account), never a raw email address; if email is the only shared key, hash it the same way on both sides. Reviews stay at location level.
Step 6: join the result to operational data
Once every record carries a customer or location ID, it can sit next to the rest of the business: a studio list with region and format, membership and billing records, class schedules, renewals. That is where the analysis moves from "what do people talk about" to "which issue goes with cancellations at which studios". The account-level version of that join is in which support topics drive churn, and the location-level version in how to analyze Google reviews across 50 or more locations.
We use Intercom at HQ, Zendesk at our studios and a separate NPS tool. How do we see one picture?
Pick the one key every source can carry, usually the studio or location ID, plus the member ID where it exists. Then:
Connect Intercom and pull its custom attributes, which can include plan and location. In Dimension Labs, Intercom is a one-click connector.
Pull Zendesk tickets with their comments and the field that records the studio (a group, an organization or a custom field). Our Zendesk post covers the export.
Export the NPS tool's responses with the studio and member columns, and reshape the wide export (one column per question) into one row per question and answer.
Pull Google reviews with each location ID, and keep a small table that maps each review location to your studio ID.
Run every record through the same Dimensions, then report by studio, by channel and by member.
If HQ and the studios code feedback differently today, keep their old tags as columns for a month and compare. Where the old tag and the new field disagree, read the record.
Our scores sit in Medallia, Power BI and Tableau. Where does the text layer go?
Upstream of the dashboards. Power BI and Tableau chart fields, so the comments are easiest to use there once they have been turned into fields. So read the survey comments, tickets and reviews into one layout, enrich them, and write the fields back to the warehouse the dashboards already read. Medallia feedback comes in through Medallia's Query API, and its unit and program fields are the keys to join on. In Dimension Labs, Dimensions can be pulled with the Export API, and Snowflake, Databricks and BigQuery export is on the Prove plan. The existing dashboards keep working, with new columns.
Which approach fits which team?
Ways to combine channels
The approaches teams use, and who each one suits
Generic approaches, not named products.
| Approach | Best for | Where it gets hard |
|---|---|---|
| Analytics agent (Dimension Labs) | Teams with feedback in several tools that need one schema, customer and location matching, operational joins and finished reports | A one-channel team with a simple question may not need it |
| Each tool's own analytics | One channel and one team, such as survey themes inside the survey tool | Categories and IDs differ from tool to tool |
| Spreadsheet and hand coding | A few hundred comments, once | Codes drift between people and months |
| BI dashboards | Scores and counts that are already structured | The text has to be turned into fields first |
| A general AI chat | A quick read of one export | Large files, repeat runs and joins to account data |
If all your text is in one survey platform and one team reads it, that platform's own text analytics is the simpler choice. If you need the channels together, the work in steps 1 to 6 has to happen somewhere.
Why does Dimension Labs fit a team whose feedback lives in five tools?
Dimension Labs is an omni-channel analytics agent for customer data. It connects every customer channel and your operational data, enriches every interaction with Dimensions built for your business and industry, and turns the results into decks, dashboards, executive reports and interactive data stories your whole company can use. Plans start at $299 a month with no demo.
It is fully omni-channel: chats, tickets, survey answers, reviews, calls and emails go into one layout, and each record keeps its channel so you can compare them.
Integration is light: Intercom connects in one click, 84 other systems have documented setups for the universal API and four no-code tools can send records too. Store lists or CRM exports go in as context files, free up to your plan's limit.
Every interaction is enriched with the same Dimensions, from the pre-built library on Explore or written for your business from Discover ($999 a month), so HQ and the studios read one set of fields.
The visual analytics layer turns the combined data into decks, dashboards and executive reports, published as links people inside or outside the company can open.
Joining what customers said to CRM and revenue outcomes, with effects and confidence intervals, is on Prove ($2,999 a month) and up.
Travelers started from conversations "in siloed systems" with "no unified schema across chat, voice, email, SMS, and bots", and now analyzes every interaction across those channels at the record level. It reports 600% ROI within 18 months and $3.13M in total savings. In the words of its Data Science Business Partner: "Dimension Labs gives us that 50,000-foot view we needed to figure out what’s going on out there." (Travelers story)
FAQ
What is the best way to analyze feedback from every channel together?
For a team that needs reviews, surveys, tickets and calls read with one schema, matched to customers and locations and turned into reports, Dimension Labs. For one channel read by one team, the source tool's own analytics is simpler. Whichever you use, check that it keeps the channel as a field and can count customers as well as records.
Can I paste everything into ChatGPT instead?
For one export and a quick read, yes. It gets harder when the files do not fit in one prompt, when you need the same categories next month, or when you need to match records to customer IDs and join them to billing or location data.
Should I weight channels differently?
Not by hand. Keep each channel as a field, report shares inside each channel, and measure effects with the channel held constant. That handles a harsh channel without guessing a weight for it.
Do I need a data warehouse first?
No. Exports and connectors are enough to start. A warehouse helps once you want the enriched fields inside the dashboards you already have.
Dimension Labs reads every channel into one layout, enriches each record with your Dimensions, matches it to customers and locations, and builds the reports. See how the platform works and the integrations, or start with one file from each channel. A monthly report built on the combined data is covered in what to put in a monthly customer insight report for executives.