CONTACTCOACH

Filtering mishits without lying to yourself

A few thin or fat shots in a session can drag a club's average carry down by several yards and blow its dispersion ellipse up well past what the club actually does. ContactCoach flags likely mishits per club using thresholds it computes from your own data, then grays those shots out in the shot table and hides them from the range plot — it never deletes them. You decide what actually gets excluded from your stats.

How does ContactCoach decide what's a mishit?

Mishit detection is opt-in per club: nothing gets flagged until you flip "mishits" on for that club, and it's off by default. Once it's on, two checks run side by side. The first is the same for every club: smash factor is basically how efficiently you transferred energy from the clubhead into the ball, and any full shot struck reasonably well should clear 1.0 easily. Anything above 0 but below 1.0 gets flagged — that's a strong, monitor-independent sign of a poor strike no matter what club made it. The second check is about distance, and it's tailored to each club individually — it compares that shot's carry against a threshold built from that specific club's own shots this session, not some universal number.

How is the adaptive threshold computed?

Picture grading on a curve, but only using the top half of the class: for each club with at least 8 valid-carry shots, ContactCoach takes that club's carries, sorts them from longest to shortest, and keeps only the top half — your better strikes with that club, this session. It finds the average and typical spread of just that top half, then draws the "you're clearly having an off day" line a fair distance below that average. The exact multiplier is in the box below.

For the nerds 🤓

computeAdaptiveThresholds sorts each club's valid carries descending, keeps the top half (rounding down for odd counts), and computes the mean and population standard deviation of that top half:

threshold = mean(topHalf) - 1.5 * stddev(topHalf)

Anchoring on the better-performing half matters: if the mishits themselves were included when computing the mean and spread, a session with several bad strikes would drag the threshold down and stop catching exactly the shots it's meant to catch.

Clubs with fewer than 8 valid-carry shots don't have enough data for a threshold ContactCoach trusts, so their adaptive threshold sits out and ContactCoach falls back to the smash-factor check alone for that club — carry-based flagging simply doesn't switch on until there's enough of a sample.

You can also set your own per-club minimum carry by hand; when you do, your number replaces the adaptive threshold for the distance check, though the smash-factor check keeps running underneath it either way.

What happens to a flagged shot — is it deleted?

No — a flagged shot never leaves the underlying data. In the shot table it's grayed out and marked with an eye-slash icon, so every one of its numbers is still right there to read; on the range plot it disappears from view entirely, so the dispersion pattern you're looking at reflects only the unflagged shots. Flip mishit filtering back off for that club and every flagged shot returns everywhere — table and range plot alike — instantly, no re-upload needed. (That eye-slash icon runs its own separate, manual hide list — clicking it hides a shot from the range plot, but it doesn't un-flag a mishit; those are two different switches.) This all matters because "mishit" is a judgment call, not a fact: a low smash factor is a strong tell, but you're the one who actually knows whether a shot was a genuine bad strike, a deliberate punch shot, or just a bad reading off the monitor. ContactCoach's job is to point at the candidates, not make the call for you.

Why not just silently drop outliers?

Silently dropping shots — even the obvious-looking mishits — throws away information you might want later: how often you actually mis-strike a given club, whether a cluster of "mishits" is really a swing flaw worth coaching, or whether the launch monitor itself just had a bad read that day. Graying out instead of deleting keeps your whole session intact and checkable while still giving you a clean, mishit-free view for stats and dispersion whenever you want one. It also keeps the adaptive threshold itself honest — since flagged shots never actually leave the data, the grayed rows in the shot table always show you exactly which shots got excluded, full numbers and all, so you can judge for yourself whether the call was right.

Try it

Load a session with a rough day mixed in at /, or click "Explore a sample session" on that page, then toggle mishits on for one club and watch the ellipse and stats panel tighten up as the grayed-out shots drop out of the calculation. The dispersion ellipses guide covers how much a few outliers can distort that ellipse before you filter them.