How to Combine Customer Reviews With POS Sales by Location
Map each review to your POS store number, join by store and quarter, divide by transactions, and compare each store with itself. Worked through on 2,616 public reviews and a labelled sample POS file.
To combine customer reviews with POS sales by location, give every review the same store id your POS uses, count reviews and tag their problems by store and by quarter (months are usually too thin), join that to POS transactions, sales and channel mix for the same store and period, and then compare each store with itself over time rather than ranking stores against each other. Divide reviews by transactions so busy stores are not punished for being busy. For a chain that wants this run on every location, with reviews, surveys and support conversations read the same way and joined to POS data, Dimension Labs does the full job: it tags every review with Dimensions built for your business, joins them to your sales by store, and builds the report for each region.
The review side below is real: 2,616 public Google reviews of 24 metro Atlanta locations of a quick-service chicken chain, January 2025 to June 2026. The POS side is a sample file made up for this post, because no chain's sales are public. Every chart says which is which.
How do I match reviews to POS store numbers?
Build a mapping table once: one row per location, with the review site's location id, the address and the POS store number. Google Business Profile reviews carry a location id when you pull them through the API, and that id is what lets you join reviews to store data. If you work from an export with only an address, as this data does, map the address to the store number by hand and check it: relocated stores, a second unit in the same mall and a new opening under an old listing are the usual mismatches.
The POS file needs the same store number and one row per store per period: transactions, net sales and, if you can, the split by channel (drive-thru, dine-in, carry-out, delivery). Keep it at one grain, use plain numbers and one date format, and put the store id in every row.
Should I join by month or by quarter?
By quarter, for most chains. In this data the median restaurant gets 6 reviews a month, and 33.6% of store-months have fewer than five.
Public Google reviews
A third of store-months have fewer than five reviews to set against that month's sales
Reviews per restaurant per month across 24 restaurants, January 2025 to May 2026 (408 store-months).
A month with six reviews, two of them bad, has a 95% interval of 9.7% to 70% for the share of bad reviews, which is too wide to set against a month's sales. At the quarter level the median store has 17.5 reviews, and the intervals narrow enough to work with. For larger chains a rolling three-month window does the same job. The thinness is a reason to read reviews together with the other channels you hold, such as surveys and support contacts, which Dimension Labs reads with the same Dimensions, so each store-quarter rests on more voices.
How do I compare review topics with sales by channel?
Match like with like. Google lets reviewers say how they ordered, and in this data the gap is large: 69% of delivery reviews and 30.4% of take-out reviews are one or two stars, against 9.8% of dine-in reviews.
Public Google reviews
Take-out and delivery reviews are far more often negative than dine-in reviews
Share of one- and two-star reviews, by the order type the reviewer selected on Google.
So a store whose sales are shifting toward drive-thru, carry-out or delivery will see its review mix get worse even if nothing changed inside the restaurant. The POS channel split tells you whether that is happening. Compare take-out reviews with take-out and drive-thru transactions, and dine-in reviews with dine-in transactions, and you separate a channel shift from a store getting worse. Only about 57% of reviewers chose an order type here, so for the rest the review text itself (“the drive-thru line”, “my DoorDash order”) is what places a review in a channel; tagging the channel from the text is exactly the kind of field a Dimension handles.
The same matching works for problems. Reviews that say the service was slow can be checked against the speed-of-service or drive-thru timer data many restaurants already keep, store by store. When the two agree, you can trust the review topic as a signal for the stores where no timer data exists.
What does a joined row look like?
Public reviews joined to a sample POS file
Divided by transactions, review counts become rates you can compare across busy and quiet stores
One row per store and quarter (Q1 2026). Review counts are real public reviews; the POS store numbers and transaction counts are sample values made up for this post. Rates are per 10,000 transactions.
| Store | Reviews (1 to 2 star) | Transactions | Reviews per 10k | Bad per 10k |
|---|---|---|---|---|
| Store A POS ST-0117 | 23 (7) | 61,200 | 3.8 | 1.1 |
| Store B POS ST-0142 | 25 (6) | 54,800 | 4.6 | 1.1 |
| Store C POS ST-0209 | 6 (2) | 38,900 | 1.5 | 0.5 |
Dividing by transactions changes the picture. In the sample, Store A had 23 reviews in the quarter and Store B 25; per 10,000 transactions Store B draws more reviews (4.6 against 3.8), while the two draw bad reviews at about the same rate (1.1 each). A raw count of bad reviews mostly measures how busy a store is. The rate per transaction measures how often a visit goes badly enough to write about.
How do I tell whether reviews are moving sales?
Compare each store with itself. Stores differ in location, size and traffic in ways a review cannot explain, so a chart of sales against rating across stores mostly shows which stores sit on busy roads. Instead, build a panel of store-quarters and ask whether a store's sales in the next quarter fall after its share of bad reviews rises, with season held fixed. Three rules keep it honest:
- Outcome after the reviews. Use next quarter's transactions, not this quarter's, so the reviews come before the sales they are meant to explain.
- Store and quarter held fixed. Store terms remove what is permanent about each location; quarter terms remove the season and chain-wide events such as a promotion.
- Weight by review count. A store-quarter with 40 reviews should count for more than one with 4.
import pandas as pd, statsmodels.formula.api as smf
reviews = pd.read_csv("reviews_tagged.csv", parse_dates=["published_at"]) # one row per review, with store_id and topic flags
pos = pd.read_csv("pos_by_store_quarter.csv") # store_id, quarter, transactions, net_sales
reviews["quarter"] = reviews.published_at.dt.to_period("Q").astype(str)
r = (reviews.groupby(["store_id", "quarter"])
.agg(n_reviews=("stars", "size"),
bad_share=("stars", lambda s: (s <= 2).mean()),
slow_share=("mentions_slow_service", "mean"))
.reset_index())
panel = pos.merge(r, on=["store_id", "quarter"], how="left")
panel = panel.sort_values(["store_id", "quarter"])
panel["tx_next"] = panel.groupby("store_id").transactions.shift(-1) # outcome: the NEXT quarter
# Each store compared with itself over time; season held fixed by the quarter term.
m = smf.wls("np.log(tx_next) ~ bad_share + C(store_id) + C(quarter)",
data=panel.dropna(), weights=panel.dropna().n_reviews).fit()
print(m.params["bad_share"], m.conf_int().loc["bad_share"].tolist())
With 24 stores and five full quarters, the interval on that estimate will be wide; more locations and a longer window narrow it, and a topic-level model (slow service, wrong orders, staff) tells you which problem to fix rather than whether reviews matter in general. For splitting a down quarter into traffic, price, weather and experience, see same-store sales down: was it traffic, price or experience? For putting a fair margin of error on each location's score before comparing them, see how to compare NPS across locations. When feedback carries a customer id rather than a store, the join runs at the customer level instead; how to join customer feedback to revenue data covers the keys.
Once reviews and sales sit in one table by store, it becomes the base of a customer world model: what customers said at each location and what they did next, which is what you need to judge a change at one store before rolling it out to the rest.
Which tools combine reviews with POS data?
Which tool fits
Most tools hold one side of the join well; the work is in connecting them
Kinds of tools teams use to put reviews next to POS sales, and when each is the better choice.
| Kind of tool | Best for | What the join takes |
|---|---|---|
| Dimension Labs (analytics agent) | Chains that want reviews, surveys and support conversations read with one set of Dimensions, joined to POS data by store, with effects measured and a report for every region | Upload the POS export as business data with a store id; the agent joins it to reviews on that id (Prove plan and up) |
| Your POS system's reporting | Sales, traffic, ticket and channel mix by store, daypart and item | Reviews have to be brought in from elsewhere |
| Review and reputation platforms | Collecting reviews from many sites, replying to them and tracking ratings by location | Sales come from an export, matched to locations by hand or by a location id |
| A BI tool with a hand-built join | Teams with an analyst and a warehouse who want full control of the model | Someone builds and maintains the review tagging, the store mapping and the panel |
A POS system's own reports are the better choice when the question is only about sales, traffic and items. A reputation platform is the better choice when the job is replying to reviews and watching ratings across many sites. A BI tool fits a team with an analyst and a warehouse who want to build the join themselves. For a wider comparison of review tools for many locations, see which tools analyze reviews across many locations.
Why do multi-location operators use Dimension Labs for this join?
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 an operator with dozens or hundreds of stores:
- Google reviews, other review sites, guest surveys and support conversations read together, so each store-quarter rests on every voice you have, not one site.
- POS exports uploaded by store id and joined to the reviews. Business data is queryable within about a minute of upload, and the join to POS, CRM and revenue data, with effects and confidence intervals, is on the Prove plan ($2,999 a month) and up.
- Every review tagged with the same problems and the same channel field, with custom Dimensions for your menu, formats and service model from the Discover plan.
- A report for each region or each store's operator, built by the agent, run on a schedule from an analysis plan, and shared as a link you can revoke or as a PDF.
To see what the per-store output looks like, our Home Depot Atlanta review analysis compares 24 stores on public reviews, from 14.7% one- and two-star reviews at the best store to 32.8% at the worst, with a caution on the stores with few reviews. With your POS data joined, the same report shows which of those problems go with lost sales.
FAQ
What is the best way to combine customer reviews with POS sales data?
For a chain that wants reviews and other feedback tagged the same way at every location, joined to POS sales by store and turned into regional reports, Dimension Labs. If you only need sales by store, your POS reporting is enough; if you only need to manage reviews, a reputation platform is the simpler choice.
Can I join reviews to individual transactions?
Rarely. Public reviews do not carry an order number, so the join is by store and period. If your receipts invite guests to a survey with the check number, that survey can be joined to the transaction itself.
How many reviews does a store need?
Enough per period that the share of bad reviews has a usable interval. In this data the median restaurant had 17.5 reviews a quarter. Stores with fewer should be pooled over a longer window or read alongside survey responses.
Does the review date match the visit date?
Not exactly. Most reviews are posted soon after a visit, but some come days or weeks later. A quarterly join absorbs most of that lag; a weekly one does not.
To try it on your stores, export a year of reviews with a location id and a POS file by store and quarter, and start with one file.