Owner stays blocked from an email, and the cleaning cancelled five minutes later
Owners ask for a stay at their own home through a form. Make reads the notification email, works out whether it is a new block, an edit or a cancellation, applies it in the property-management system and tells the owner.
Where this applies
Property managers, and any business that turns emailed requests into booking, calendar or reservation changes.
- polling interval
- 5 min
- runs, no errors recorded
- 8,657
- tries to catch the cleaning task
- 3
The problem
Some requests reach a business as an automated email from a form tool rather than as data: a request to block a property's calendar, say. Someone has to read it, find the record in the system, check the dates are free, make the change and reply.
Edits and cancellations arrive the same way, with old and new values side by side, and the system being changed often creates side effects of its own, such as a task for a visit that is not going to happen.
What we built
An AI parser on a short lead
A Gmail trigger polls every five minutes. An OpenAI chat model at temperature zero, in JSON mode, turns each email into an action (new, edit, cancel or notification) plus the listing, owner, dates, whether a post-stay clean is wanted and any notes. The prompt is defensive: anything without the intake fields, or carrying the footer of a notification, is classed as a notification; it must never default to new; two dates side by side mean old then new; and an unchanged date is copied into both.
Never reprocess its own mail
The system's own confirmations arrive in the same mailbox, so two layers stop it acting on them: a subject filter that drops confirmation, reminder and cancellation wording, and the parser's notification class. Without both, a confirmation could be read as a new request.
Reconcile against the live calendar
There is no local ledger. For a new block the scenario reads the listing's calendar for the days strictly between check-in and check-out (so back-to-back stays are allowed) and creates the owner stay only if no day is unavailable. An edit looks up the reservation on the old dates; a cancel looks up the dates. A conflict goes to Slack, to the owner and to the admin team.
One token, many readers
A small scheduled scenario requests an access token with the client-credentials grant every thirty days and overwrites a single record in a Make data store. The owner-block scenario reads that record on each run and passes the token on to the cleaning scenario, so nothing authenticates per run and parent and child always use the same token.
Cancel the clean, with patience
The property-management system creates the cleaning task asynchronously, so the cancel-cleaning scenario waits five minutes before it looks, and tries up to three times at five-minute intervals. It is called fire-and-forget, so a slow or failed attempt never delays the owner's confirmation.
Every exception goes to a person
Nearly every module has an error handler that writes a row to an error log (message, listing, owner, dates and execution id), posts a Slack alert and rolls back. Slack-only steps are set to ignore failures, so a failed notification does not stop the work.
The outcome
Across the three scenarios: 8,657 runs and 10,236 operations, with no errors recorded.
The live scenario polls every five minutes, so most runs are one-operation empty polls; when emails arrive it runs three to 142 operations in six to eighteen seconds.
The cancel-cleaning scenario has run 16 times, each as a child of an owner-block run, each taking about five minutes because of its wait.
Owners get a confirmation email, with or without a vacate-by line, and staff get a Slack message for every outcome, including the ones that need a human.
Where it stops
There is no stored key for a request, so de-duplication rests on the mail trigger's position and a re-sent email would be processed again. An edit acts on the first reservation found on the old dates and, as built, does not re-check that the new dates are free. The token refresher keeps the previous token if a refresh fails and nothing alerts until a later call fails. Cancelling a clean sets the task to pending rather than deleting it.
Built with
- Make.com
- OpenAI
- Gmail
- Airtable
- Slack
- Make data store
Patterns used
- AI as parser, not decider
- Token in a data store
- Wait and retry
- Error log, alert, roll back
Page copy drafted with AI assistance. Skofi is accountable for it. Editorial policy
Have something shaped like this?
If any part of the above resembles a problem you are living with, a short call is the fastest way to find out whether it is the same problem underneath.
What happens on the call
- 15 minutes, no deck
- We map the process on the call
- A written scope, or an honest no