AI Receptionist & Phone Handling

The phone system for Gyms & Studios. Rebuilt for the AI era.

Heyvo summarises every call into your CRM, pulls out the actions and books members in, even when your team can't pick up.

From $125/mo · Free 1-month trial* · Cost-saving guaranteeiWe'll refund your month's subscription if you don't save time or costs using Heyvo.

LB SR JP AK MT
★★★★★
Trusted by businesses across NZ & AU

Works with your studio software

From businesses like yours

What business owners are saying

★★★★★
"We're really enjoying having Millie as our virtual AI CA at the practice. As our customers become more familiar with her, they're increasingly appreciating the ability to manage tasks like rescheduling in their own timeframe, rather than waiting for us to call back or playing telephone tag."
Back to Living
Louise
Back to Living, Wellington
★★★★★
"Between back-to-back classes we just couldn't get to the phone. Now every enquiry gets answered and new customers get booked into a trial before they've even hung up. It feels like we've added a whole front-desk person."
Hi Yoga
Rebekah
Hi Yoga, Auckland
★★★★★
"Phone admin used to eat into our day, tastings, tours, private events, all coming through at once. Heyvo's cut that right back, and customers love how easy it is to book."
Winemakers Loft
Chris
Winemakers Loft, Waiheke Island

Inside the platform

Just a few of the features

app.heyvo.ai/dashboard
LIVE

How it works

A call comes in. Two ways it gets handled.

Heyvo answers when nobody is free, and writes up the calls your team takes.

Heyvo answers

When nobody's free

Books, moves or cancels the class booking in your system Answers pricing, timetable and membership questions Transfers live, or takes a callback with the reason noted
Your team answers

A normal live call

Full transcript, plus a short written summary Any booking or change captured from the conversation Follow-up actions pulled out, nothing to write up
Either way, you get
Full transcript Written summary Booking confirmed Actions taken or flagged
Filed automatically in
Your CRM Class booking system Membership system
And if needed
SMS to the customer Email to your team

Built for gyms & studios

Heyvo handles the overflow calls, out-of-hours enquiries and gives you time back

And when your team takes the call themselves, Heyvo still writes it up. Either way you get a full transcript, a written summary and the actions taken, synced straight into your CRM or booking system.

Every call answered

Mid-class, after hours, or when the floor is busy, Heyvo answers every call.

Books straight into your system

Class times and membership details land straight in your booking platform.

Handles reschedules & cancellations

Bookings update automatically, with confirmation SMS sent instantly.

Trial and membership enquiries qualified

Goals, experience level, membership type, captured and booked on the spot.

Live calls transcribed too

When your team answers, Heyvo still captures the transcript, summary and actions.

Built for NZ & AU studios

A local team who understand class timetables and membership cycles.

Human transfer when it matters

Membership and PT enquiries go straight to your team.

Callbacks, prioritised

Ranked by intent, with a full summary attached for your team.

Synced to your CRM

Bookings, notes and follow-ups written against the customer record automatically.

Integrations

Not another booking system. Heyvo works alongside the one you already use.

From simple calendars and spreadsheets to a full class management system, Heyvo fits your existing workflow. When a customer books, reschedules, cancels or enquires, Heyvo triggers the same actions your systems already perform, and if nothing's set up to handle it, sends its own SMS or email instead.

  • Triggers your existing booking workflows
  • Sends its own SMS, email or WhatsApp if needed
  • New integrations added regularly
Your VOIP or
phone carrier
Halaxy
Pracsuite
Cliniko
Cal.com
Google Calendar
WhatsApp
Halaxy
Pracsuite
Cliniko
Cal.com
Google Calendar
WhatsApp
`}, { kind:'html', render: () => `
SMS follow-up
Sent automatically, no manual admin
To: Jane SmithJust now
Thanks for your call! You're all booked in for Saturday at 4:30pm, we can't wait to see you 🎉 Here's a link with parking info and what to bring: haweaziplines.co.nz/visit-info
Delivered
`}, { kind:'html', render: () => `
Callback queue 4
Large party booking (20+)
Due today·Corporate enquiry
High
Lost property enquiry
1 day overdue
Medium
Reschedule request
Due today
Medium
General opening hours question
Due tomorrow
Low
`}, { kind:'html', render: () => `
High-value enquiry detected, transferring to a team member
Caller+64 21 •• •• 812
ReasonParty of 24 · Corporate booking
Wait time< 30 seconds
JM
Jess Miller
Team Lead
Connected
`}, { kind:'html', render: () => `
Call taken by your team, written up automatically
Handled byFront desk, 4 min 12 sec
Caller+64 21 •• •• 447
OutcomeBooked, Saturday 2pm, group of 6
Summary

Caller asked about weekend availability for a group of six, confirmed pricing and parking, then booked Saturday 2pm. Requested a highchair for a toddler.

Actions
✓ Booking written to Momence ✓ Confirmation SMS sent • Highchair noted for the team
`}, { kind:'img', src:'assets/dashboard-analytics-v2.png' }, ]; const psLabels = ['Live Call','SMS Follow-up','Manage Callbacks','Human Transfer','Live Call Summary','Analytics']; let psIdx = 0; const psScreen = document.getElementById('psScreen'); const psTabsEl = document.getElementById('psTabs'); function psRenderTabs(){ psTabsEl.innerHTML = psViews.map((v,i)=>`
${psLabels[i]}${i===psIdx?`
`:''}
`).join(''); psTabsEl.querySelectorAll('.ps-tab').forEach(el => el.addEventListener('click', () => psGo(+el.dataset.i))); } function psRenderScreen(){ psScreen.style.opacity = 0; setTimeout(()=>{ const v = psViews[psIdx]; psScreen.innerHTML = v.kind === 'img' ? `` : v.render(); psScreen.style.transition='opacity .3s'; psScreen.style.opacity = 1; }, 120); } function psGo(i){ psIdx = i; psRenderTabs(); psRenderScreen(); psResetTimer(); } let psTimer; const psDurations = [10000, 6000, 5000, 5000, 7000, 5000]; function psResetTimer(){ clearTimeout(psTimer); psTimer = setTimeout(()=>{ psIdx=(psIdx+1)%psViews.length; psRenderTabs(); psRenderScreen(); psResetTimer(); }, psDurations[psIdx]); } if (psScreen) { psRenderTabs(); psRenderScreen(); psResetTimer(); }