Skip to content
Back to Resources
Guide

Which Meetings Never Produced a Follow Up: Reporting Across Google Calendar and HubSpot

Skopx Team
August 5, 2026
11 min read

It is Monday, 9:40am. The VP of Sales has two windows open. On the left, Google Calendar in week view, scrolled back seven days: a grid of external meetings, most of them accepted, a few of them tentative, three of them with the little "guests" icon showing four or five people from the same company domain. On the right, HubSpot, filtered to deals owned by her team with a close date this quarter.

She is not looking for a number. She is looking for the meetings on the left that produced nothing on the right. A discovery call last Tuesday with a logistics company, three attendees, sixty minutes. The deal is still in the same stage it was in before the call. There is no email logged after it, no note, no task. Either the rep followed up somewhere the CRM cannot see, or nobody followed up at all, and a warm conversation went cold in silence.

Her RevOps analyst has been asked for this list four times in the last year. Each time he exports meetings from HubSpot, exports events from Calendar, matches them in a spreadsheet on attendee email, and then spends the real work of the afternoon reading. Reading is the part nobody can automate away with a filter, and it is also the part that produces the answer.

What Google Calendar shows on its own

Google Calendar is an excellent record of intent. For any event it holds the title, the organiser, the start and end time, the full attendee list with each person's response status, the description, any attachments, the Meet link, and the recurrence rule. If you connect it to HubSpot with the standard integration, the two-way sync will place the event on a contact's timeline and keep the scheduling side in step. That integration is well built and worth having.

Calendar stops at the edge of the room. It knows a meeting was scheduled and who was invited. It does not know whether the meeting happened. An "accepted" RSVP is a statement made days earlier, not attendance, and the most common failure mode in pipeline hygiene is a meeting that quietly did not occur but still shows as accepted. Calendar also has no concept of a deal, an amount, a stage, or an owner in the commercial sense. Time Insights in Google Workspace will tell you how many hours a person spent in meetings and with whom, which is a real and useful report, but it aggregates time, not outcomes. There is nothing in Calendar that could rank a meeting by the size of what is at risk, because Calendar has never heard of the number.

Most importantly, Calendar has no forward view. There is no field on an event called "what happened next". Everything that happened next happened in another product.

What HubSpot shows on its own

HubSpot is an excellent record of activity that got logged. Meetings appear as engagement objects on the contact and deal timelines. Emails sent from the CRM or through the connected inbox are captured. Notes, calls, tasks, sequence enrolments, and stage changes are all timestamped and attributable. You can build a report of meetings booked and meetings completed by rep, and you can build a report of deals with no activity in N days, which is genuinely close to the question and is the report most teams reach for first.

HubSpot stops at two places, and both matter.

The first is coverage. HubSpot sees a calendar meeting when the calendar sync maps an attendee to a known contact and the rep left logging switched on. Meetings with a procurement lead who was never added as a contact, meetings booked from a personal calendar, meetings a rep unchecked because they thought it was internal: none of those exist inside HubSpot at all. So a "meetings with no follow up" report built purely in HubSpot cannot include the meetings HubSpot never learned about, which is exactly the population the VP is worried about.

The second is interpretation. HubSpot can tell you an email was sent to the contact two days after the meeting. It cannot tell you whether that email was a follow up. A sequence step firing on schedule is an email. A newsletter is an email. An out of office bounce is a logged event. The report counts them all the same, because counting is what a report does.

Why the gap is structural, not a missing feature

Look at where each half of the evidence lives, and the shape of the problem becomes obvious.

Half of the evidenceWhat it isWhere it lives
The meeting happened, with these people, at this timeA structured record with fieldsGoogle Calendar, partially mirrored into HubSpot
The deal, the stage, the amount, the ownerA structured record with fieldsHubSpot
Whether anyone actually followed up, and whether it landedA sentence somebody wroteEmail bodies, call notes, deal notes, a Slack message to the AE

The first two halves are records. Records join cleanly, and every reporting tool ever built is good at joining them. The third half is prose. It is a rep typing "left him a voicemail, he is out until the 14th" into a note field, or a prospect writing "thanks, we will circle back after the board meeting" in a reply.

That third half is why neither product is at fault. Google Calendar is not missing a follow up report. HubSpot is not missing a calendar report. The evidence that decides the question is unstructured text distributed across systems, and deciding what it means requires reading it.

It is also why the obvious tooling does not close it. Automation platforms like Zapier and Make are trigger based by design: something happens, then steps run. They are very good at moving a record forward the moment an event fires. But the VP's question is retrospective. She is asking about meetings that ended a week ago where the notable thing is that nothing fired. A trigger cannot fire on an absence that has already happened. BI tools have the opposite constraint. Power BI Copilot and Looker Conversational Analytics both answer questions in natural language over connected databases and modelled sources, and they do it well. But a sentence a rep typed into a deal note is not a modelled source. It is outside what the semantic layer can see, so it cannot be part of the answer no matter how the question is phrased.

What the join actually requires

The key is the attendee email address. Every external Calendar event carries the guest list. Each guest address either matches a HubSpot contact, or matches a company by domain, or matches nothing. Domain matching catches the case that pure contact matching misses: a meeting with three people at acme.com where only one is a contact still belongs to the Acme deal. Then you need a time window, typically three business days after the meeting end, and you pull every piece of activity in that window against the contacts and the associated deal.

The judgement is what counts as a follow up. This is the part that resists matching:

  • An email sent by the rep, addressed to the attendees, referring to the conversation. That is a follow up.
  • The next step of a sequence the contact was already enrolled in. That is not.
  • A note saying "sent pricing over WhatsApp, he prefers it". That is a follow up, and the email search will never find it.
  • An inbound reply from the prospect saying "we are going to pause this". That is not a follow up from your side, but it changes what should happen, and a report that just counted activity would mark this deal healthy.
  • A calendar invite for a second meeting. That is a follow up, and it lives back in Calendar rather than in HubSpot.

Every one of those calls requires reading a sentence. That is the work the analyst does with the spreadsheet open, and it is the reason the report keeps being a person's afternoon rather than a saved view.

How you would answer it with Skopx

Skopx connects to nearly 1,000 SaaS tools including Google Calendar, Gmail and HubSpot, and answers questions across them in chat with citations back to the source record. So the first version of this is a sentence, typed the way you would say it:

"List every external meeting on the sales team's calendars in the last 30 days where nobody sent a follow up email, logged a call, wrote a note or created a task within three business days. Match attendees to HubSpot contacts by email and company by domain. Ignore sequence emails and newsletters. Show the deal, stage, amount and owner, and quote the last thing anyone actually wrote."

It reads both sides, applies the judgement calls, and gives you the list with a citation on every row, so when a rep says "I did follow up", you can open the evidence rather than argue.

When the answer turns out to be something you want every Monday, you describe the view instead of the question, and Skopx builds it as an internal app: a console with one row per unfollowed meeting, sorted by deal value, showing the date, the attendees, the company, the stage, the owner, the days elapsed, and the last written evidence found. It reads live from Calendar and HubSpot each time somebody opens it. On each row there is a button, "Create a follow up task for the owner", which writes a task back to the deal in HubSpot after the person clicking it confirms. That is the only write in the whole thing.

Honest limits

This does not tell you what happened in the meeting. It tells you what happened after it, in the places you have connected, and it tells you where nothing did.

If the follow up happened somewhere Skopx cannot see, an unlogged phone call, a personal LinkedIn message, a hallway conversation at a conference, the row will show as a miss and it will be wrong. Attendance is still inferred from RSVPs, so a meeting that was accepted and then silently skipped looks the same as one that ran. Reps who keep external meetings on a personal calendar stay invisible until that calendar is connected. And permissions carry through from the source systems, so a manager sees the meetings and deals they already have access to and nothing beyond that.

The console also does not do several things by design. It stores nothing of its own, so there is no second copy of your pipeline drifting out of date. It has no forms and creates no records except through that one confirmed button. It does not run on a schedule, does not send alerts, and has no public link. It is a window over your live systems that somebody opens, reads, and acts on.

That is a narrower promise than a dashboard product makes, and it is the right one for this question. The list changes every day. What you needed was not a stored report. It was the ability to ask, on a Monday morning, which conversations you already paid for and then let go quiet.

Share this article

Skopx Team

The Skopx engineering and product team

Related Articles

Stay Updated

Get the latest insights on AI-powered code intelligence delivered to your inbox.