Skip to Content
Enter
Skip to Menu
Enter
Skip to Footer
Enter

Building a predictive no-show model from your own CRM data (no data science degree required)

Table of contents

Building a predictive no-show model from your own CRM data (no data science degree required)

Published:
August 31, 2026

I can look at next week's calendar and tell you which demos won't happen. So can your best rep. We're reading the same details that usually don't get written down, which is why your demo no-show rate is a number you report instead of one you manage.

And it's never the obviously bad ones. The company fits, the reply was warm, the demo's on the calendar. But it got booked eleven days out, it's 8am their time, and it came off one thread that never became a conversation. Three details nobody records, and that's enough to bet against.

Turning the no-show problem into a model takes less than you'd think. You list the details that matter, score each one, and add them up. Now every meeting on the calendar gets checked the same way, not only the few someone happened to worry about.

And you can pull the data today. A year of meetings sits in your CRM labeled attended, canceled or no-show, each one next to its lead source, booking date and scheduled time. That export is the whole dataset you need.

People rarely miss a sales call because they stopped caring or suddenly healed their pain points. Al Davidson of Strategic Sales & Marketing surveyed 330 prospects who missed a sales appointment and then agreed to reschedule: 56% blamed being “overwhelmed by internal events” for missing the previous slot. So no, your prospect didn’t ghost you because they secretly hate you, and yes, they do appreciate a second chance for a chat.

Jeff Ignacio, who writes the RevOps Impact newsletter, argues you don't need a data science team to build a scoring model that works. He's right, and the reason is nothing groundbreaking: the signal sits in fields you already have.

You can build this yourself, this week. Six steps, one spreadsheet, and a number that ends up on the contact record where your reps actually look.

What a normal no-show rate looks like (and why yours is the only one that matters)

Book 100 demos and a typical team watches 13 or 14 of them evaporate. The best-run teams lose five.

Those numbers come from RevenueHero, which looked at 18 weeks of data from accounts booking 50 or more meetings a month. Median no-show rate: 13.5%. The best-performing 10% lose just 5.5%. 

RevenueHero also split a week of their bookings by industry. Zero misses across healthcare meetings. 18.1% in education.

That spread proves the numbers don't transfer. It says nothing about swings inside your own pipeline. A case study from another SaaS company's pipeline is likely their social proof, not your baseline. 

No-show benchmarks disagree with each other. Some divide misses by every booking ever made, others by the meetings that actually reached their start time. Some count a week, some a quarter. And an inbound demo request behaves nothing like a booked meeting off cold outreach, but plenty of reports mix them.

Long story short, your own baseline is the only number that tells you whether this quarter was actually bad. Booking rate tells you a meeting made it onto the calendar. Your no-show rate tells you whether anyone actually showed up, which is the half that turns a booking into pipeline. 

Pull the last 12 months and count two things: how many meetings actually reached their start time, and how many of those nobody showed up for. The second divided by the first is your rate.

Leave out anything canceled ahead of time. A cancellation is someone telling you they won't show up, which is different behavior worth tracking on its own. Counting it as a no-show only makes your number look worse than it is.

Step 1: get your meeting history out of the CRM

Bad news first, so you don't lose an hour to it. Meetings don't come out of HubSpot through the standard record export. HubSpot handles the records you'd expect: contacts, companies and deals, but meeting activities aren't among them. You have two practical ways in. The clickable one: build a meetings report in HubSpot's reporting tool, filter it to the last 12 months, and export it to CSV. The other is HubSpot's API, which is only worth the trouble if you want this refreshing on its own later. If that's you, step 6 covers it.

Pull these columns: meeting outcome, meeting start time, the date the meeting was created, the associated contact and company, whatever you use for lead source (HubSpot's own field is Original Traffic Source, though plenty of teams keep a custom one) and any engagement fields already sitting on the contact.

The outcome field is the one everything else hangs on. HubSpot ships with Scheduled, Completed, Rescheduled, No show and Canceled. Outcomes are customizable, so check what your team actually clicks before you trust the labels. A rep who marks everything Completed can easily ruin your dataset.

Prior no-shows is the variable you'll end up weighting heaviest, and it needs no property to exist. Every meeting is a row, so counting the No show rows per contact gives you their attendance history in one formula. Worth turning into a custom property eventually so reps see it on the record, but nothing to wait on today.

Keep in mind that a rate calculated on a handful of meetings is noise wearing a percentage sign. If one extra miss would swing a group by several points, that group can't tell you anything yet, so track your overall rate and a single variable until more history piles up.

Salesforce and Pipedrive work the same way, with one thing to check first. You need a field that records what actually happened at the meeting. If your CRM only marks meetings done or not done, you have to fix that first.

Step 2: clean it before you draw a single conclusion

Before an export can tell you anything, someone has to go through it and delete the rows that only muddy the picture. When we built our own campaign benchmark that meant starting at 103,075 rows and cutting it down to 96,051, because the rest contradicted itself and had no business being in there.

Cut meetings that haven't happened yet, since they have no outcome and can only dilute your rate. Cut anything still sitting on Scheduled with a date in the past, because nobody went back to record what happened, and a meeting with no verdict is not a meeting that went well. Cut duplicates. The same meeting shows up twice when someone logs it by hand and the calendar sync files it too, or when a meeting with three contacts attached comes out as three rows. Cut the internal meetings that rode along in the export.

Then decide, deliberately, what happens to the two categories that usually get waved through. Give cancellations their own bucket. Reschedules get a bucket too, because someone who moves a meeting twice is also telling you something worth catching. If you sweep these two into your no-show count, you’ll inflate your rate while burying the behavior you're trying to predict.

One catch to keep in mind before you invest two days on this. If outcomes aren't logged consistently across your team, cleaning won't save you. Get the whole team logging outcomes the same way, give it a quarter, then come back. A model built on guesses about what happened does more harm than no model at all.

Step 3: find the variables that predict a miss

This part is pivot table work, nothing fancier. Split the meetings into buckets, work out the no-show rate inside each one, then hold it against your overall rate.

Say yours sits at 14%. Meetings booked within three days come in at 8%. Meetings booked eleven days out or more come in at 23%. That gap is worth keeping.

Before you keep a variable, put it through three questions. Is the difference big enough that you'd actually do something about it? Does it hold up across a year of meetings, or did it just come out of a bad month? And are you sure this variable is causing the misses, rather than sitting next to the actual cause?

That third question is where most variables fall over. For example, when we analyzed campaign data, the campaigns running longest showed the best results. Easy to read that as proof that patience pays off, until you notice that a campaign only got to run that long when it was already working. The number was real, the arrow just pointed the other way. Fridays will try that same thing on you. If Friday meetings miss more often, it's not the Friday, but the type of people who pick them.

Variable Why it predicts a miss Where it lives
Booking gap More time for life to get in the way Create date vs meeting start time
Prior no-shows Behavior, not a proxy for it Count of No show rows per contact
Time of day 4pm beats 8am by 30% on attendance odds, weekends roughly 4x worse Meeting start time
Day of week Attendance slides as the week goes on, Friday is usually the worst Meeting start time
Lead source Inbound requests and cold-outreach bookings are not the same animal Original Traffic Source, or your own field
Company size SMB 13.2%, mid-market 15.0%, enterprise 6.8% Company properties

Sources: Gong on meeting timing and day of week, RevenueHero on company size.

Two variables worth having won't be in your CRM today. Touchpoints before the booking and reply sentiment arrive through the HeyReach HubSpot sync, which installs a property group of around 20 fields covering campaign attribution and engagement, and logs connection requests, messages and InMails onto the contact timeline. Sentiment is an automatic tag, Positive, Neutral or Negative, so it's something you read rather than something you build. One boundary worth stating plainly: the attendance label always comes from your CRM or your calendar. HeyReach has no meeting event. It supplies the engagement variables, HubSpot supplies the outcome.

Step 4: turn the rates into weights

Every variable you kept from Step 3 gets a point value. The more damage it does, the more points it's worth.

Here's how you get that number. I'll use the made-up figures, so the shape is easy to follow.

Let's say your average no-show rate is 14%. That's your baseline: what you'd expect from any booked meeting picked at random.

Now let's take one variable - how far in advance the meeting was booked. You've already split those meetings into three groups: booked within three days, booked four to ten days out, booked more than ten days out. The worst of the three would likely be the last one, and let's say those meetings miss 23% of the time.

23 (the group's no-show rate) minus 14 (the average no-show rate) is 9. So a meeting booked more than ten days out is worth 9 points.

Now do that same subtraction for every variable on your list. Each one ends up with its own point value. Only above-baseline groups earn points; everything at or below your baseline scores zero. Say yours came out like this: 

  • Booked more than ten days out: 9 points
  • Scheduled for 8am: 4 points
  • Contact has missed an appointment before: 12 points

Scoring a meeting means adding up the points it earns.

Now let's say one of your upcoming demos was booked twelve days in advance, so that's 9 points. It’s scheduled for 8am, so that's 4 points more. And this contact already missed a meeting with you last month, so that's 12. 9 plus 4 plus 12 means the meeting weighs 25 points.

Score at least ten meetings by hand before you automate anything. You're checking the scores against what you already know from practice, and if scoring looks inaccurate it probably is. Once ten meetings in a row look right, write the formula into your spreadsheet and let it score the rest.

Prior no-shows get the biggest number on the list. Everything else you're tracking (the booking gap, the time of day, the lead source, how much conversation happened before the booking) is just a hint about how someone might behave.

This system won't tell you a meeting has a 62% chance of happening, and it doesn't have to. It puts every meeting in order, worst to best, so the whole team understands what to expect, including the SDR who started last week.

This is the same shape banks use to score loan applications: sort people into groups, look at how each group generally behaved, give the risky groups points, add them up.

Last step: sort every scored meeting from highest to lowest and split the list into three equal parts. Top third high no-show risk, middle third medium, bottom third low. With 300 meetings that's 100 in each.

Your high-risk group will come out a bit bigger than a third, because anyone who's missed before goes straight in. That's fine.

One last thing, and it's where AI helps because there are no hard rules when it comes to scoring. The math is yours to do, but the second opinion is always welcome. Build a small table with one row per group - the variable, the group, how many meetings are in it, its no-show rate - paste it into Claude, Gemini or whatever LLM you use, and ask the questions a skeptical sales manager would ask. Which of these groups has too few meetings to trust? Is a nine-point gap big enough to act on, or is it inside the noise? What could explain this pattern other than the variable itself? Are any two of these measuring the same thing twice? You'll usually end up changing a variable or two. And if your engagement data already sits in HeyReach, its MCP answers these questions against live campaign data instead of a table you pasted in by hand.

Step 5: check it against meetings you already know the answer to

Right now your score is a theory. Testing it takes an afternoon.

Set aside your most recent three months of meetings. Build your points using only the older data, then score those recent meetings as if you had no idea what happened at them. Now look up what actually happened. If your high-risk group missed far more often than your low-risk group, the score works. If all three groups sit around your average, you've built a random number generator, and finding that out today saves you a quarter of misplaced confidence.

While you're in there, look at where the jump happens. If meetings scoring 20 and up missed 30% of the time while everything below them sat at 12%, that's your real line, and it might not fall exactly at the top third.

One thing to watch. The test needs enough missed appointments to mean anything. If your sample holds six no-shows, stretch the test window to six months rather than reading tea leaves. 

Your score will be wrong in one direction, and that's on purpose. It will flag meetings that would have gone ahead perfectly well, so a few reps send a confirmation message nobody needed. Cheap mistake. Losing a meeting you could have saved is the expensive one.

Three problems show up often enough to mention them. The first is a variable that looked brilliant on twelve meetings and falls apart on two hundred. The second is a group so small that its no-show rate swings every time one meeting moves. The third is sneakier. All your variables point the same way because they're all describing the same thing, which is usually the lead source: cold outreach books further out, at worse times, after fewer conversations.

Step 6: put the score where it changes behavior

A score living in a spreadsheet changes nothing. It has to sit on the contact record your sales reps already have open.

Create a custom number property in your CRM and give it a name nobody has to decode, like meeting risk score. Then have Make or n8n run on a schedule: read the sheet, write the number into HubSpot. Recalculate whenever a new demo gets booked, and refresh the weights once a month so the score keeps up with your real no-show rate.

If your engagement variables already run through HeyReach, that side doesn't wait for the timer: a fresh reply or a sentiment flip fires the rescore through its native Make, n8n, and Zapier connections the moment it lands. New bookings still come off your CRM. 

Before you plan any of this check if workflows and calculation properties both require HubSpot Professional or Enterprise, and there's a cap on how many calculation properties you get. On Starter you can still run the whole thing, you just do the math first and write the value in through the API instead of asking HubSpot to calculate it for you.

A workflow watching that property can create a task for the meeting owner, ping the channel your SDRs live in the moment a high-risk lead replies (HeyReach sends campaign replies straight to Slack), or fire a confirmation email the day before. Low scores get nothing extra, and that part matters as much as the rest.

If you'd rather ask than build, HeyReach's MCP lets you query campaign and engagement data straight from Claude. You can ask which of this week's scheduled demos came off single-touch campaigns without opening a spreadsheet at all.

What to do with a high-risk meeting

Scoring projects sometimes die right here. Everyone agrees the number is useful, but then every meeting gets the same reminder anyway.

The high-risk moves work because they ask for something back. A confirmation email that announces the meeting gets skimmed. An email that asks for a yes usually gets a reply, and that reply is more reliable than a score. If the booking gap is what pushed the meeting up your list, use that same email to offer two nearer slots alongside the one they picked. Nothing moves without them agreeing to it. You're just handing them an easier option: a demo eleven days out can become a demo the day after tomorrow, and the variable disappears instead of getting managed.

Group What it means What to do before the meeting
Low Bottom third of your own scores Your standard auto reminder, then leave it alone.
Medium Middle third One confirmation touch on the channel the relationship already lives on, asking for a yes.
High Top third, or anyone who has missed an appointment with you before Re-confirm 24 hours out, offer a nearer slot, add a message from whoever booked it.
High risk, weak fit High score on a lead that was never a great fit Send the light confirmation, but don't hold a prep slot for it. If they no-show, don't chase. Recycle instead.

That future trigger doesn't have to be a coincidence you happen to catch. Point a signal tool at HeyReach (RB2B for a return visit to your site, Trigify for engagement on your posts, an intent feed for the rest) and the moment the lead resurfaces they drop into a warm HeyReach campaign on their own timing, not a reminder you set. 

Some ideas that could work for the high-risk group:

  • At booking: confirmation email with the two alternative slots, if the gap is long
  • Three days out: one light touch on LinkedIn from the sender who owns the relationship, a comment on something they posted or a profile visit
  • 24 hours out: the message that asks for a yes, sent by the person who booked the meeting
  • Morning of: short auto reminder with the link to join the call

Most of these don't have to be manual. The LinkedIn steps are HeyReach campaign actions: the profile visit or a post reaction three days out, then the 24-hour message that asks for a yes, fired from the rep who owns the relationship. Every reply lands in one Unbox, so whoever booked the meeting never misses the yes that beats the score. 

Low-risk meetings get nothing extra. No additional reminders, no text message, no third calendar invite. No need. Just a regular automated email reminder day before or the morning of the meeting.

Calendly reports that 88% of its surveyed sales users said no-shows decreased after switching on automated reminders, and that those users cut no-show rates by 28% on average. Both numbers come from Calendly's own customers describing their own experience.

When someone misses anyway, don't escalate. Run a fixed follow-up sequence and let it run out, instead of deciding message by message how hard to chase.

The easiest way to keep it fixed is to make that sequence a HeyReach campaign that the missed contact drops into automatically, LinkedIn and email in one flow, so no one has to decide in the moment how hard to chase. 

Keeping it honest over time

Jeff Ignacio makes another great point: the model starts decaying the moment you deploy it, and that's not the model failing, it's just a business that keeps changing underneath it. 

So put maintenance on a schedule. Refresh the weights monthly. Re-run the Step 5 check once a quarter. Rebuild the thing from scratch when the motion changes, meaning a new market, a new channel, or a shift in your sales cycle that moves your buyer.

Your manager will eventually ask whether any of this reduced no-shows and the lost revenue behind them. Have an answer ready. Hold a slice of high-risk meetings out of the extra treatment for a few weeks, then compare their no-show rate against the ones that got the full sequence. Small sample, rough answer, still miles better than a feeling.

The instinct that outlasts the rep 

The pattern was already sitting in your CRM. The only real difference between an instinct and a model is that a model gets written down, gets applied to every booked meeting the same way, and stays behind when the rep whose instinct everyone swore by leaves for a better offer.

Order and a clear internal no-show policy matter more than sophistication. Label your outcomes honestly, clean the export, keep the two or three variables that hold up, turn them into weights, then treat the three groups differently. A rough score that changes what your reps do on Monday beats an elegant one nobody opens. That's the point where your demo no-show rate stops being a number you report and becomes one you manage.

HeyReach sits on both ends of this. The HubSpot sync feeds your engagement variables into the model, and the outreach side acts on the score, before the meeting and after a missed one.

Start a free trial, connect the sync, and give the model something to learn from.

HeyReach icon
Try it for free

Frequently Asked Questions

What is a good demo no-show rate?

RevenueHero puts the median at 13.5% across accounts booking 50 or more meetings a month, with the best tenth at 5.5%. Treat that as orientation, not a target. Industries and companies all count differently, so the only number that means anything is your own baseline over the last 12 months.

How do I track no-shows in HubSpot?

Use the meeting outcome field. HubSpot ships with Scheduled, Completed, Rescheduled, No show and Canceled, and you can add your own. Meetings don't come out through the standard record export, so pull them with an activity report or the engagements API.

How much CRM data do I need before I can predict no-shows?

Enough that every group you compare holds more than a handful of meetings. If one extra missed appointment swings a group by several points, you're reading noise. Until then, track your overall no-show rate and one variable rather than seven.

Why not just use HubSpot's predictive lead scoring?

It answers a different question. Likelihood to close predicts “the percentage probability of a contact closing as a customer within the next 90 days”, not whether someone turns up to their scheduled demo. It's Enterprise only, and HubSpot calls it blackbox machine learning: “it's not possible to know exactly how each input contributes to a contact's score.” A score you built yourself is one you can explain and fix.

What should I do with a meeting the model flags as high risk?

Re-confirm 24 hours out with a message that asks for a yes rather than announcing the meeting, offer a nearer slot if the booking gap is what flagged it, and send it from whoever booked the product demo. If they miss anyway, run a fixed follow-up sequence instead of chasing.