Give Calendly no-shows an owner and a next step
A Calendly no-show creates a follow-up task on the matching HubSpot contact, giving the sales owner the meeting context and reschedule link in one place.
Integrations used in this example
Put the missed meeting beside the contact record
Calendly starts the automation when someone marks an invitee as a no-show. It searches HubSpot for the invitee's email. If exactly one contact matches, it creates a task for the follow-up owner you choose, attaches the task to that contact, and includes the Calendly event and reschedule links.
If the email has no HubSpot match or more than one, Slack asks a teammate to review it. Nobody receives an automatic reschedule email from this example. The owner checks earlier conversations and decides whether another invitation makes sense.
The team reported about a 30% no-show rate even after buying Calendly for reminders and asking prospects to accept meeting invitations.Source: A sales team's meeting no-show problem on Reddit
What you'll tell the agent
- The Calendly organization whose no-show marks should start the automation.
- The HubSpot owner who receives follow-up tasks and the task-to-contact association type ID.
- The Slack conversation for emails that cannot be matched to one contact.
- Account authorization.
The agent will create the project and ask you for these details. When Automate.ax asks you to connect an account, authorize the integrations you want this workflow to use.
The agent will set up the Automate.ax project, ask you to connect Calendly, HubSpot, and a paid Slack workspace, and help find the organization URL and HubSpot association type.
The automation
The Calendly no-show event supplies the invitee email and reschedule URL. A unique HubSpot match gets an associated task; missing or ambiguous matches go to Slack.
import { automation, t } from "automate.ax"
import { calendly } from "automate.ax/calendly"
import { hubspot } from "automate.ax/hubspot"
import { slack } from "automate.ax/slack"
export default automation(
"Assign a follow-up task for Calendly no-shows",
{
parameters: [
{
label: "Calendly organization URL",
name: "organizationUri",
type: "url",
},
{
label: "HubSpot follow-up owner ID",
name: "followUpOwnerId",
type: "text",
},
{
label: "HubSpot task-to-contact association type ID",
name: "taskContactAssociationTypeId",
type: "number",
},
{
label: "Slack review conversation ID",
name: "reviewConversationId",
type: "text",
},
],
},
({ parameters }) => {
const noShow = calendly.onInviteeNoShowCreated({
organizationUri: parameters.organizationUri,
scope: "organization",
})
const search = hubspot.searchContacts({
filterGroups: [
{
filters: [
{
propertyName: "email",
operator: "EQ",
value: noShow.payload.email,
},
],
},
],
limit: 2,
})
const match = search.transform(noShow, (page, event) => ({
email: event.payload.email,
name: event.payload.name,
rescheduleUrl: event.payload.rescheduleUrl,
eventUrl: event.payload.scheduledEvent.uri,
markedAt: event.payload.noShow?.createdAt ?? event.payload.createdAt,
contacts: page.records,
hasMore: page.pageInfo.after !== undefined,
}))
const ambiguous = match.filter(
({ contacts, hasMore }) => contacts.length !== 1 || hasMore,
)
slack.sendMessage({
conversation: parameters.reviewConversationId,
text: t`Review Calendly no-show for ${ambiguous.email}: ${ambiguous.contacts.transform((contacts) => contacts.length)} HubSpot contacts matched. Event: ${ambiguous.eventUrl}. No contact task was created.`.transform(
escapeSlackText,
),
})
const resolved = match.filter(
({ contacts, hasMore }) => contacts.length === 1 && !hasMore,
)
hubspot.createTask({
timestamp: resolved.markedAt.transform((value) => new Date(value)),
ownerId: parameters.followUpOwnerId,
subject: t`Review no-show follow-up for ${resolved.name}`,
body: t`Invitee: ${resolved.email}\nCalendly event: ${resolved.eventUrl}\nReschedule link: ${resolved.rescheduleUrl}\nCheck prior contact history before reaching out.`,
taskType: "TODO",
associations: [
{
toRecordId: resolved.contacts.transform(
(contacts) => contacts[0]!.id,
),
types: [
{
associationCategory: "HUBSPOT_DEFINED",
associationTypeId: parameters.taskContactAssociationTypeId,
},
],
},
],
})
},
)
/** Keeps provider text from becoming Slack mentions or control markup. */
function escapeSlackText(text: string) {
return text
.replaceAll("&", "&")
.replaceAll("<", "<")
.replaceAll(">", ">")
}
What a run looks like
Example input
A rep marks a Calendly meeting with lee@example.com as a no-show, and one HubSpot contact has that email.
Expected result
The configured owner gets a HubSpot task on Lee's contact record with the meeting and reschedule links. No email is sent to Lee.
Set it up
- Copy the setup prompt at the top into your coding agent.
- Choose the Calendly organization and the HubSpot owner responsible for missed meetings. The agent can help find the organization URL and owner ID.
- Authorize Calendly, HubSpot, and Slack. Ask the agent to find the correct HubSpot task-to-contact association type for your portal.
- Test with a disposable Calendly event that is not connected to Meta ad tracking. Mark the invitee as a no-show and inspect the resulting task or Slack review message.
Check the result
Mark an untracked disposable invitee as a no-show. Confirm that one matching HubSpot contact gets one task with the correct reschedule link. Test an unmatched email and confirm Slack receives a review message instead of a task.
Where this workflow stops
- This starts after someone marks an invitee as a no-show in Calendly. It does not detect attendance on a video call or prevent a no-show.
- Matching uses the invitee's email and requires exactly one HubSpot contact. A booking under another email goes to review.
- The task goes to one configured HubSpot owner, regardless of who hosted the meeting. Change the assignment rule if different hosts should own their own tasks.
- A repeated no-show mark or event may create another task. The owner should check the contact's task history before reaching out.
Common questions
Will it send a reschedule email automatically?
No. The HubSpot task contains Calendly's reschedule link so the owner can decide how to follow up.
What if the invitee is not in HubSpot?
Slack gets the email and Calendly event link for review. The automation does not create a contact from a no-show.