Metric

What is meetings booked, and how do you measure it in Metabase?

Meetings booked counts the qualified meetings your outbound generates — the clearest leading indicator of pipeline from a sales-engagement motion. It's simple to state but easy to inflate, so the value is in counting it consistently. Measure it in Metabase from engagement data synced into a database (Outreach, Salesloft, Apollo, and others).

TL;DR — Count distinct meetings, decide whether "booked" or "held" is the unit, exclude cancellations and no-shows from held, and attribute to one rep and one sequence to avoid double-counting.

How is meetings booked defined?

The count is simple; the qualifiers are where teams disagree:

  • Booked — a meeting was scheduled. Good for measuring outbound activity and momentum.
  • Held — the meeting actually happened. Closer to real pipeline, because it excludes no-shows and cancellations.

Both are valid. Report a held rate (held ÷ booked) alongside the raw count so a spike in bookings that never happen doesn't look like success.

What counts as a meeting?

  • Decide the unit: distinct prospects with a meeting, or distinct meeting events. Reschedules should not create a second meeting.
  • Attribute each meeting to one rep and one sequence so team totals add up.
  • Exclude internal meetings and non-sales calendar events with an explicit filter or meeting type.

What data does meetings booked need?

  • A meetings table with a booked_at timestamp.
  • A status to separate booked, held, canceled, and no-show.
  • A person/prospect key and an owner to attribute and de-duplicate.
  • Segmentation columns: rep, sequence, segment, and source.

SQL patterns

Meetings booked by month (distinct people)PostgreSQL
SELECT
  date_trunc('month', mt.booked_at) AS month,
  COUNT(DISTINCT mt.person_id)      AS meetings_booked
FROM modeled_meetings mt
WHERE mt.booked_at >= CURRENT_DATE - INTERVAL '12 months'
  AND mt.status <> 'canceled'
GROUP BY 1
ORDER BY 1;
Held rate by repPostgreSQL
SELECT
  u.name AS rep,
  COUNT(*)                                         AS booked,
  COUNT(*) FILTER (WHERE mt.status = 'held')       AS held,
  ROUND(
    100.0 * COUNT(*) FILTER (WHERE mt.status = 'held')
      / NULLIF(COUNT(*), 0),
    1
  ) AS held_rate_pct
FROM modeled_meetings mt
JOIN modeled_users u ON u.id = mt.user_id
WHERE mt.booked_at >= CURRENT_DATE - INTERVAL '90 days'
GROUP BY u.name
ORDER BY booked DESC;

Pitfalls

Counting no-shows as meetings.→ Booked and held are different. A rep who books many meetings that never happen isn't producing pipeline — track a held rate.
Double-counting reschedules.→ A rescheduled meeting is still one meeting. Count distinct meetings or distinct prospects, not calendar events.
Ambiguous attribution.→ If a meeting is credited to two reps or two sequences, team totals won't reconcile. Attribute to one of each.
Including internal calendar events.→ Non-sales meetings leak in unless you filter by meeting type or a booking source.

Where this metric applies

Analytics

Metrics

FAQ

Should I report meetings booked or meetings held?
Report both. Booked shows outbound momentum; held is closer to real pipeline because it excludes no-shows and cancellations. A held rate (held ÷ booked) keeps booking inflation honest.
How do I avoid double-counting reschedules?
Count distinct meetings or distinct prospects rather than calendar events, and treat a rescheduled meeting as the same meeting.
How should meetings be attributed?
Attribute each meeting to one rep and one sequence so team and channel totals reconcile. Ambiguous attribution is the most common reason totals don't add up.