How to Analyze Customer Conversations Alongside Salesforce Data
Which Salesforce objects hold conversations and outcomes, how to join tickets to CRM and billing data on AccountId, and what the joined table shows, on sample data.
To analyze customer conversations alongside Salesforce data, give every conversation the Salesforce AccountId, label each one with the same set of topics, and join the labels to the outcome you care about (a renewal opportunity, an order, an invoice) inside a fixed window before that outcome. Then compare accounts that raised each topic with those that did not, holding plan size and tenure fixed, rather than counting cases. For a team whose conversations live across Service Cloud, a chat tool, call recordings and surveys, and who want that join and the reports built without a pipeline of their own, Dimension Labs is the most direct route: it reads every channel, enriches each conversation with Dimensions for your business, and joins them to Salesforce accounts and opportunities on the Prove plan.
This post is about the Salesforce side of the join: which objects hold what, how tickets meet CRM and billing data, and how conversations link to sales and orders. The worked example uses sample data invented for the purpose. For survey scores matched to Salesforce accounts, see how to join customer feedback to revenue data.
Where do conversations and outcomes sit in Salesforce?
Service Cloud keeps support cases on the Case object, the emails on each case as EmailMessage records, and chat, SMS and WhatsApp messages as ConversationEntry records grouped by a MessagingSession. Outcomes sit elsewhere: renewals and upsells on Opportunity, plan and segment on Account, and money owed or refunded usually in a separate billing system.
Where the data sits
In Salesforce, almost everything a customer said and did meets at the account id
The objects that hold conversations and outcomes, and the field that joins them.
| What it holds | Salesforce object | Joins on | How it reaches Dimension Labs |
|---|---|---|---|
| Support cases | Case | AccountId, ContactId | With the case emails, through the universal API |
| Email threads on a case | EmailMessage | ParentId (the case id) | Universal API, one conversation per case |
| Chat, SMS and WhatsApp messages | MessagingSession, ConversationEntry | MessagingSession id, end user id | Transcript export, uploaded as a file |
| Renewals, upsells, new business | Opportunity | AccountId | Report or Data Loader export, uploaded as business data |
| Plan, segment, ARR | Account | Id | Export, uploaded as business data |
| Invoices, refunds, payment failures | Your billing system | Billing customer id, mapped to AccountId | Export, uploaded as business data |
Two details decide how clean the join is. First, each case email's Parent.AccountId carries the account, so keep it with the text when you pull the emails. Second, for standard messaging channels, Salesforce creates the message records, apart from the first one, only when the session ends and the agent closes the tab, and for enhanced and in-app channels the message text can be blank or missing. Salesforce points to its Conversation Transcript Export for those, which you then upload as a file with the session id. Our Salesforce integration page lists the fields Dimension Labs reads.
How do I join support tickets with CRM and billing data?
- Pick the grain. Renewal questions are about accounts, so the result is one row per account per renewal. Cases, emails and invoices are all summarized up to that row before anything is compared.
- Use AccountId as the key. It is already on the case. Never join on a contact's email or name; match the billing system through a billing customer id stored on the Account, or a mapping table, rather than through email addresses.
- Label the conversations. One topic list for every channel, so a billing problem counts the same in an email case, a chat and a call.
- Set a window. Only conversations in a fixed period before the renewal's CloseDate, such as 180 days, count toward it. A case opened after the account decided not to renew describes the churn; it did not come before it.
- Add billing events in the same window. Failed payments, refunds and credits are often the strongest signals, and they sit next to the case topics as extra columns.
In SQL, with the case topics in a table of their own:
with renewals as (
select AccountId, CloseDate, IsWon as renewed
from opportunity
where Type = 'Renewal' and IsClosed = true -- however your org marks renewals
),
case_topics as ( -- one row per case and topic, from the Dimension table
select c.AccountId, c.CreatedDate, d.topic
from cases c
join case_dimensions d on d.case_id = c.Id
)
select r.AccountId, r.CloseDate, r.renewed,
max(case when t.topic = 'billing_dispute' then 1 else 0 end) as billing_dispute,
max(case when t.topic = 'data_export_failure' then 1 else 0 end) as data_export_failure,
count(t.topic) as cases_in_window
from renewals r
left join case_topics t
on t.AccountId = r.AccountId
and t.CreatedDate >= r.CloseDate - interval '180 days'
and t.CreatedDate < r.CloseDate -- conversation before outcome, never after
group by 1, 2, 3;
Three things go wrong often enough to check every time. Joining cases straight to opportunities without summarizing repeats each case once per opportunity and inflates every count. Parent and child accounts split one customer's cases and renewals across records, so roll up to the level where the renewal is signed. And contacts who sit on several accounts, such as a partner managing many customers, put their cases on whichever account the agent picked; look at the accounts with an unusual number of contacts before trusting their rows.
What does the joined table show that case counts don't?
In the sample, 900 accounts raised 5,068 cases in the 180 days before their renewal date. Feature requests were the most common topic, with 1,552 cases, and data export failures the rarest, with 299. Ranked by what goes with a lower renewal rate, the order turns over.
Sample data
Ranked by case count, data export failures come last. Ranked by renewal, they come first
Six case topics on 900 sample accounts. Left: cases in the 180 days before the renewal date. Right: renewal rate of accounts that raised the topic against those that did not, with ARR band and tenure held fixed.
Accounts that reported a data export failure renewed 19.2 points less often than accounts that did not, with ARR band and tenure held fixed; billing disputes went with a gap of 11.3 points. Feature requests, the largest pile of cases, went with 1.8 points, and the interval runs from 7.6 points lower to 4.4 points higher, so the sample cannot tell it from no effect.
Sample data
Three topics have intervals that cross zero; the sample cannot tell them from no effect
How many percentage points lower the renewal rate was for accounts that raised each topic, holding ARR band and tenure fixed. Lines show 95% intervals from 300 bootstrap resamples.
Dashed line: no difference in renewal
Read the sample as a demonstration of the method: the data was generated to show how the ranking can turn over, not measured from a real company. The method, applied to your own accounts, is what tells you where the renewals are going. Holding plan size and tenure fixed matters because large, long-standing accounts raise more cases and also renew more often, which hides problems if you only count. The full method, with the intervals and the traps, is in which support topics drive churn, and correlation vs causation in customer experience data explains why a raw comparison misleads.
How can I link customer conversations to sales or orders?
The same join, with the outcome swapped and the window pointing the right way.
- Open and closed opportunities. For new business and upsells, take the conversations on the account between the opportunity's created date and its CloseDate: questions asked in pre-sales chats, objections on sales calls, support cases from a trial. Compare won and lost opportunities on what was raised. Sales calls recorded in a tool such as Gong come in with the speakers kept apart, so prospects' words can be read separately from your reps'.
- Orders. When a business sells to consumers, the shared key is usually an order number or a customer id. Conversations after an order (late, damaged, wrong item) explain refunds and repeat purchase; conversations before it explain conversion. Keep the two directions apart.
- Revenue at risk. Once the topics are on each account, the open renewal pipeline can be filtered by what those accounts raised in the last quarter, so the account team sees which renewals carry a data export failure before the renewal call.
If the question is which requests matter most by revenue rather than which problems cost renewals, the account-level join is the same; how to prioritize product feedback by revenue impact works through it with Intercom and Salesforce.
Can I do this inside Salesforce?
Partly, and for some teams that is the better choice. Salesforce's Conversation Intelligence (formerly Einstein Conversation Insights) analyzes sales and service teams' customer calls, surfaces topics and mentions, and puts details on the activity timeline and in pipeline inspection, with trends across opportunities and reps. If the job is coaching reps on calls and the data stays in Salesforce, it is the simpler option.
Dimension Labs is built for the wider case: conversations from every channel, including ones that never touch Salesforce (chatbots, review sites, surveys, a separate help desk), read with one set of Dimensions you define, joined to Salesforce accounts and opportunities and to billing or product data, with the effect of each topic measured and the results turned into reports for every team.
Why use Dimension Labs to analyze conversations with Salesforce data?
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.
For a revenue or support operations team on Salesforce, that means:
- Cases, case emails and messaging transcripts from Service Cloud, alongside chats, calls, reviews and surveys from other tools, analyzed as one set of conversations.
- Opportunities and accounts uploaded as business data and joined on AccountId. The agent works out the join from the shared fields and can show you how many conversations matched and which did not. The join to CRM and revenue data is on the Prove plan ($2,999 a month), with up to 3 sources.
- Topics, reasons and risk signals written for your product as custom Dimensions (from the Discover plan), the same on every channel.
- The renewal-risk report, the deck for the QBR and the dashboard for account teams built by the agent and shared as a link you can revoke, or downloaded as PDF or PPTX.
Travelers, a Fortune 100 insurer, uses Dimension Labs to enrich every voice, chat, email, SMS and bot interaction with fields for intent, effort, resolution and escalation, and to compare performance across business units and regions. Its customer story reports 600% ROI within 18 months and $3.13M in total savings, including $2M in avoided BI redevelopment costs. In its words: “Dimension Labs gives us that 50,000-foot view we needed to figure out what’s going on out there.” (Data Science Business Partner, Travelers)
FAQ
What is the best way to analyze customer conversations with Salesforce data?
For conversations from several channels joined to accounts and opportunities, with each topic's effect on renewal measured, Dimension Labs. For call coaching on sales and service calls that stay inside Salesforce, Salesforce's own Conversation Intelligence is the simpler choice.
What key do I use to join support tickets to Salesforce?
The AccountId on the case. For tools outside Salesforce, store the Salesforce AccountId on the company or organization record, or use an order number or customer id that both sides hold. Avoid joining on email addresses.
How far back before a renewal should conversations count?
Pick a fixed window that matches how long your customers take to decide, often one or two quarters, and use it for every account. The sample uses 180 days. Conversations after the decision belong to a different question.
Do I need Data Cloud or a warehouse to do this?
No. Case emails can be sent through the universal API, messaging transcripts and opportunity exports can be uploaded as files, and the join runs in Dimension Labs. If your Salesforce data already lands in Snowflake, BigQuery or Databricks, those connect too.
To try it on your own accounts, export one quarter of cases with their AccountId and your renewal opportunities, and start with one file.