A repeatable campaign machine for occupancy troughs and seasonal peaks, triggered by the calendar rather than by a panicked Tuesday meeting.
Bring your stack to a call and we will scope it against how your business actually runs.
Book a callSeasonality is the most predictable thing about a hospitality business and the thing it is worst at planning for. Everyone knows February is quiet, that the second week of January is dead, that the Thursday before a bank holiday fills itself and the Monday after does not. Everyone knows it a year in advance. And yet the response to a soft two weeks is almost always the same: somebody notices the forward book looks thin, a meeting is called, a discount is invented on the spot, and an email goes out to the whole list on Tuesday afternoon with eleven days' notice. That is not a campaign, it is a reflex.
The cost shows up in three ways. First, lead time. A leisure guest planning a weekend away needs three to six weeks; a corporate planner needs longer. An offer that lands eleven days out reaches people who have already made other plans, so it converts badly, which gets read as the offer being wrong rather than late. Second, the discount is deeper than it needed to be, because panic prices. Having left it too late to fill the trough with a reason to visit, you fill it with a price cut instead, and you train your best repeat guests to wait for one.
Third, nothing is learned. The campaign was assembled from scratch, so there is no record of what the subject line was, which segment it went to, or what it produced. Next February somebody calls the same meeting and invents the same discount. Meanwhile the peaks get no treatment at all - the periods where you could be selling earlier and at a better rate to the people who came last year are left to inbound demand, and the guests who would happily have booked a Christmas table in October are sold one in late November at the same price as everyone else.
Two pipelines, because a campaign has an internal life and an external one.
Campaign Production tracks the campaign itself, one record per campaign, moving left to right on a schedule set by the promotional calendar:
Seasonal Offer Responders tracks guests against a campaign: Offer Sent, Engaged, Inquiry, Booked, Lapsed. A guest can appear once per campaign, which is what makes attribution possible.
Contact-level, used for segmentation:
Campaign-level, on the production record:
BO handles the inbound wave that every campaign produces - the questions that arrive within minutes of a send and used to pile up unanswered. BO may:
BO must not:
One campaign, from a line on the promotional calendar to a wrap report - and one guest's path through it.
Eight workflows. The first two run the production side and are what makes this a machine rather than a template; the rest run the guest side. Build the production ones first - a beautifully automated send sequence attached to a campaign nobody briefed in time is still a late campaign.
Trigger: a daily scheduled check against the Promotional Calendar, looking for windows whose launch date minus the configured lead time falls today.
Actions in order:
Escalation: any milestone 2 days overdue notifies the owner; 5 days overdue notifies the GM; 10 days overdue flags the campaign as at risk of launching late, which is the thing this whole workflow exists to prevent.
Exit: record reaches Scheduled, or a human cancels the campaign with a reason.
Trigger: campaign record moved to Scheduled, or 48 hours before launch_date, whichever is first.
Conditions and checks - every one must pass or the launch is blocked and the owner notified:
Actions: on all checks passing, notify the owner that launch is armed. On any failure, hold the launch, list the failed checks, and create a task due 12 hours before launch. Never launch past a failed check automatically.
Exit: launch armed, or campaign postponed.
Trigger: the segment-build milestone, 7 days before launch, or manually when a campaign is re-targeted mid-window.
Inclusion logic, applied in order:
Suppression, applied last and absolutely:
Actions: write the final counts to the campaign record, per channel and per segment. If the count is below the number needed to plausibly hit inventory_cap at your historical conversion, notify the owner before launch rather than after.
Exit: segment written and counted.
Trigger: 48 hours before launch_date, for the vip-early-access and do-not-discount list only.
Actions:
Exit: launch day, at which point unbooked early-access contacts join the main sequence at step two rather than step one.
Trigger: launch_date with the QA gate passed. Record moves to Live.
Actions:
Stop conditions, applied at every step: a booking removes the contact from the entire remaining sequence immediately. An inbound reply pauses the sequence for that contact and routes to BO or a human. An unsubscribe or opt-out removes them from that channel instantly. If inventory_cap is reached, stop all remaining sends for the campaign and notify the owner - continuing to promote a full offer produces complaints, not covers.
Trigger: any reply to a campaign email or SMS, a web chat mentioning the campaign, or an Offer Inquiry submission.
Branches:
Exit: each inquiry handled once; the responder record keeps its highest-reached stage.
Trigger: campaign record enters Wrapped, which happens at booking_deadline or when inventory_cap is hit.
Actions:
Exit: record archived.
Trigger: a weekly scheduled run across all contacts, plus a run at every campaign wrap.
Actions:
Exit: runs continuously; this one never completes.
The first change is lead time, which is the change that makes everything else work. Campaigns launch six weeks out rather than eleven days out, because the calendar generates the brief rather than a thin forward book doing it. Guests receive offers while they are still deciding what to do with that two weeks.
The second change is that discounting becomes a choice rather than a default. When you are planning eight weeks ahead you have time to build a reason to visit - a menu, an event, a package, early access - and that is almost always cheaper than cutting the rate. The do-not-discount tag protects the guests who were going to come anyway, which is the group most likely to be trained into waiting for a deal by careless campaigning.
The third change is institutional memory. Every campaign leaves behind its brief, its segment definition, its copy, its landing page and its result in one record. The second year of this build is materially better than the first because the work compounds, and a new marketing hire can run February having read one record rather than interviewing three people about what usually happens.
The fourth is restraint. Fatigue scoring and the preference center mean the list gets sent to less often and more precisely. Sending less is counterintuitive and reliably produces more bookings per thousand sends, plus a list that is still there in three years.
Campaign cadence, segment size and integration work vary by business. To get a promotional calendar and campaign machine scoped for yours, book a call at bookings.appbo.io.
Every build on this page is something we configure, test and hand over with the SOPs your team needs to run it.
Book a call