Product & Company Updates

Signals: The combination we didn't look at

Mustafa Savaş Founder CEO, Kimola
Nov 04, 2026 - min read
Signals: The combination we didn't look at

At Kimola, every piece of feedback goes through Dimensions, which asks it more than ten questions: who is speaking, at which stage of the experience, in what context, what motivates them, what hurts, what they need and don't get, what they would use instead. Add sentiment and content classification, and every review ends up classified across twelve layers.

That depth is the point. But it came with a side effect we didn't see coming. Take ten thousand reviews, twelve layers, and the columns of the file you uploaded, like product, brand, platform or country, and the number of ways to slice the data quickly runs into thousands. Somewhere in there is the finding that matters. Is one topic far more negative on one platform than on the others? Do people who buy for a family member talk about an unmet need that people buying for themselves rarely mention? Which pain point has quietly grown over the last two months?

We started to feel a very specific kind of anxiety, and so did our customers: what if there's a combination I didn't look at? Several of them asked us for something that would simply tell them. Honestly, we wanted it for ourselves too.

That was the moment building Signals stopped feeling optional. Getting it right took longer than we expected, and the way there is the part I want to tell.

Our first attempt: Ranking

Our first approach treated the problem as a ranking problem. We weighted clusters of classifications using the Wilson score, looked at how the most prominent clusters interacted with each other, and dropped clusters that repeated one another based on their vector similarity. For the final ranking, the score that decided what mattered most, we also asked LLMs for an opinion and let it count for part of the result. Then we had an LLM turn what survived into readable text.

The first results were exciting. They read well and sounded plausible. But the longer we lived with them, the more two things bothered us.

The first was that we were only crossing our own classifications with each other. The columns our customers uploaded didn't take part at all. We hadn't even considered them. Yet some of the most important information lived right there, and if Kimola was going to detect a real signal, it had to include the data our customers brought with them.

The second was that we couldn't catch the outliers we were really after. The Wilson score answers a useful question: how confident can I be in this proportion? It doesn't ask the question that matters here: compared to what? It also favours large, stable groups, so it mostly confirmed what was already obvious. And the share of the score we left to LLMs, small as it was, was enough to undermine the determinism we wanted. The same data could tell a slightly different story on a different day.

There was a third problem we only saw clearly later. The fear of the combination you didn't look at has a twin: what if the one I'm looking at is a coincidence? Test thousands of combinations and some will look remarkable by pure chance. A ranking does nothing about that. It just puts the lucky ones at the top. We had built something that eased the first fear and quietly made the second one worse.

So we didn't ship it, and we started again.

The decisions behind Signals

What came out of the second round was less a better algorithm than a handful of decisions. Each one meant giving something up.

The columns you upload are part of the research. We built an approach that reads every column in your file, starting from its name and then looking at its contents and data type, to decide whether it can serve as a group to compare. A column needs between 2 and 50 distinct values, needs to be at least half filled, and can't behave like an ID. Columns that simply mirror sentiment, like a star rating, are left out, because "one-star reviews are more negative" is not an insight. Hierarchy is respected too: when products sit inside brands, a product is compared with its own brand's other products, not with the whole market. If your file has no useful columns at all, Kimola's context dimensions (who, when, where, with whom, instead of what) step in as groups.

Test, don't rank. Every group is tested against every topic and dimension on three questions. Is this mentioned more, or noticeably less, here than elsewhere? Is it more negative here, after accounting for how negative this group is in general? Has its share changed recently compared with before? Each test runs within comparable groups of reviews, similar in sentiment and in how much they say, because negative reviews tend to be longer and touch more topics. Without that, a product with many complaints would look "over" on almost everything. Combinations with too little data aren't tested at all, effects that rest on a handful of reviews are scaled down, and all tests are corrected together so that the false discovery rate stays at 5% or below.

Statistics finds, AI explains. The engine decides what is a finding. A language model only writes the card for a finding the engine has already proven, and the first line of its instructions says exactly that. It can't add findings, compute new numbers, give advice, or suggest reasons customers didn't give. The numbers reach it already formatted, and its quotes come from candidates the engine selected. If the quotes don't actually support the claim, the model flags it and the card is hidden. Same data, same signals, same order, same text.

Silence is an answer. When nothing clears the bar, Signals doesn't fill the page with the best of a weak lot. It tells you how many reviews and comparisons it tested, that it would rather show nothing than show what might be chance, and what would help: more reviews, or descriptive columns like product, brand, platform or country.

Nothing is switched on because it seems like a good idea. Every new method started switched off and was turned on only after it proved useful across many real reports. Trends got a list of their own once we measured that meaningful changes almost never made it to the top when mixed with differences. The consistency check started scaling with the size of the data once we saw that a fixed threshold made almost every finding in a small report look inconsistent.

That last decision is also why this announcement comes later than we hoped. We didn't want to announce Signals until we trusted it ourselves.

Under the hood

For those who want the details: each test is a Mantel–Haenszel test stratified by review sentiment, review richness (tag density, in three bands) and up to two unrelated columns. A combination is tested only when it meets the Mantel–Fleiss criterion. Effect sizes (log odds ratios) are shrunk toward zero with a prior, so large effects on little data shrink and well-supported ones hold. All tests are corrected together with Benjamini–Hochberg at a 5% false discovery rate, and an effect-size floor removes differences that are significant but too small to matter. Signals are ranked by the absolute shrunken log odds ratio multiplied by the log of the excess review count, so both the strength of a difference and the number of customers it touches count. Absences, findings that echo the group's own name, context-dimension groups and inconsistent findings are down-weighted, and trends driven purely by a change in total volume are hidden by default.

What you'll see in your report

Signals runs automatically when a report is created, right after classification. There's nothing to set up.

The strip at the top. Every Signals page opens with two numbers: how many combinations were tested and in how many seconds, and how many reviews went into the analysis. Exact duplicates and incentivized reviews ("received this for free", "in exchange for my honest review") are removed before any testing, and the page says how many were left out. In some datasets that's a meaningful share, and you should know it.

Differences and Trends. Differences, up to 30, show where a topic is talked about more, less, or more negatively in one group than in the others. Trends, up to 20, show what has changed recently, with the periods being compared written right above the list. The period adjusts to your data: quarters, months, weeks, or days for a two-week dataset.

The card. Each signal is a card with a ring chart: the outer ring is the group, the inner ring is what it's compared with, and the gap between them is the story. The title, twelve words at most, names what customers are actually experiencing, not the tag behind it. Two sentences follow. The first says what is happening, where, and how it compares, as in "X% of reviews on one platform mention it, compared with Y% on the others." The second says what's special about it: which product drives it, where it reverses, what comes with it. Then two or three quotes in customers' own words.

Why this is shown. Open it and you get the evidence behind the card: what it was compared with, the raw numbers and how many more reviews than expected ("2.3×"), and how consistent the finding is across comparable groups of reviews. When a brand-level difference is really carried by one product, the card shows it as brand → product, which is usually where the fix belongs. Contrast shows where the same topic goes the other way, and related tags show what customers mention alongside it. One click on Open in Tables takes you to the raw reviews behind it.

Your team's memory. Every card can be marked Known, New & important, Unimportant or Artifact, with an optional note. The mark is tied to the finding itself, so when a report is re-generated, the same finding keeps it.

On the Overview. The strongest signals also appear on your report's Overview, with direction, lift, group and consistency at a glance.

Where it works best

Signals gets more useful the more your data can say where a review came from. Columns like product, brand, model, platform, store, country, channel or customer type turn findings into addresses: not "customers complain about delivery" but "on this platform, because of this product, 2.3 times more than elsewhere." That also tells you which team should pick it up. A date column switches on Trends. A file with no columns still works, through Kimola's context dimensions and the report's own trend over time.

Signals is generated once, when the report is created. If you delete records or add a dataset, you can re-generate it from the current data in a minute or two.

Try it, and tell me what you think

We built Signals because we were afraid of missing something. What we learned on the way is that the cure for that fear can't be more things to look at. It has to be fewer things, each one you can defend in a meeting. I hope it gives you the same quiet we've been enjoying since we started using it ourselves.

The easiest way to see it is to open a Kimola account. Every new account comes with sample reports, and Signals is already waiting in them, no upload needed.

Along the way, our Signals articles in the support center will guide you, from what a signal is to how to review the ones your reports find.

If you try it, or even if you've only read this far, I'd love to hear from you: what it got right, what it missed, what you wish it did. Write to me on X. Signals exists to make all of our lives a little easier, and the best ideas for where it goes next will probably come from the people using it.

Subscribe to Our Newsletter!

Stay up-to-date with the latest product features and company news.

Get Started for Free!

Turn customer feedback into structured market research in 30+ languages—no AI training needed.

Create a Free Account No credit card · No commitment