Skip to content

Reach Out

An open rate is
not a visit.

Most restaurant marketing is one message to everybody, scored on how many phones lit up. Habitu builds the audience from what a guest actually did, holds the send back when a frequency cap, a quiet-hours window or a consent setting says no, and reports return visits in the fourteen days after the message landed.

01Trigger.

Guest behaviour defines who the message is for. A location's own numbers can be what starts it.

02Compose.

Write it against a live phone preview that redraws as you type, per channel.

03Throttle.

Frequency caps, quiet hours and per-channel consent decide who actually gets it.

04Measure.

Return visits in the fourteen days after the message landed. Not opens.

What is a restaurant re-engagement campaign?

A re-engagement campaign is a message sent to guests who have stopped coming, or are on their way to stopping, giving them a reason to return. It differs from a newsletter in three ways: the audience is defined by behaviour rather than by everyone on the list, the send is capped so nobody is pestered, and it is judged on return visits rather than on opens.

Segment
A live audience defined by conditions on behaviour, not a static list. Habitu recompiles it in the database each time, so the count you see is the audience that resolves, before caps and consent take their cut.
Frequency cap
The most messages one guest may receive per day and per week. Checked on the server against the delivery ledger before any provider is called.
Quiet hours
A window in your brand's timezone when nothing dispatches. A campaign that lands inside it is deferred and re-fires when the window closes.
Attribution window
The fourteen days after a guest was actually reached. The first visit a reached guest makes inside it is credited to the campaign, carrying the value of the order behind it.

Audience

Start from what a guest did, not from a list.

A blast treats a weekly regular and someone who has not been in since February as the same person, and learns nothing about either. Habitu builds the audience from conditions on real behaviour: recency, frequency, tier, points, average spend, lifetime spend. Those compile against live guest data every time you look.

Twenty-three conditions, five groups

Activity, engagement, loyalty, spending and profile. Days since last visit, visits in the last 30 days, tier, points balance, average spend, lifetime spend, birthday month.

Counted by the database

The audience number comes from a single server-side query over live data, not from a total cached on a saved list. Edit a condition and it moves before you commit.

Save it or spend it once

An audience can become a named segment you reuse, or be used for this campaign only and never appear again.

A struggling location can start one

When a site's visits fall against its own prior month, or its enrolment rate sits below the brand average, that signal opens the builder from the location screen with the campaign already written for that situation: name, copy, channels and a behavioural audience of lapsed or newly-joined guests, ready for you to narrow before you send.

HABITU.Your brand Search…⌘K
AudienceCompiled live
Days since last visit> 45
Visits in last 30 days= 0
Lifetime visits≥ 4
Total redemptions= 0
Guests matching right now412

The count is one server-side query over live guest data, not a number cached on a saved list. Change a condition and it moves before you send.

Composing

See the phone before your guest does.

The message is written against a live phone preview that redraws as you type, so the thing you approve is the thing that arrives. Each channel carries its own character budget, and the composer flags copy that overruns the one you picked rather than letting a provider truncate it in front of a guest.

Two live channels, named plainly

In-app inbox and email dispatch today. Push and SMS can be composed and previewed, and WhatsApp can be previewed, but their dispatch is not live yet, and we will not pretend otherwise on a pricing page.

Length checked per channel

160 characters for SMS, 178 for a push body, 240 in the in-app inbox, long form for email. Overrun is shown while you write it.

Your own template library

A message that worked can be saved to the brand's template list with a label, and picked up by whoever builds the next campaign.

The offer is a real promotion

A campaign attaches a promotion rather than describing one, and the entitlement lands on every targeted guest before a single message goes out. If the grant fails, the send stops. Announcing an offer nobody can redeem is worse than sending nothing.

A guest's phone showing a campaign message arriving as a notification over the brand's app: “Rewards are here! Kumiko, your free Tuna Poke Bowl is waiting. Tap in today to claim it!”

The composer previews the message on a phone as you type, and checks the body against each channel’s real character budget as you write it.

Guardrails

Most of this feature is the brakes.

Marketing tools are usually sold on how fast they reach everyone. The interesting part of a send is everything that stops it: a guest who already heard from you twice this week, a message that would arrive at three in the morning, a channel someone never opted into, a schedule a manager cancelled an hour ago. All four are decided on the server, after the button and before the provider.

Caps counted before you send

Set a maximum per guest per week, and see how many of your guests across the brand are already over it. The number recomputes as you change the cap.

Quiet hours defer, not drop

A send inside the window is held with a next-attempt time in your brand's timezone and dispatched when the window closes. Nothing is lost and nobody is woken.

Consent resolved per channel

Promotional email is on by default for a brand's own members; SMS and push require an express opt-in. Every email carries a one-click unsubscribe honoured at the next gate.

Sent once, or not at all

Each recipient is claimed in a ledger before the provider is called, so a send interrupted halfway resumes without anyone receiving the message twice.

HABITU.Your brand Search…⌘K
Send gateServer-side
CAP18 guests already at the weekly cap — skipped
CONSENT4 guests opted out of promotional email — skipped
QUIET HOURSWindow closed — send proceeds now
OUTBOX390 recipients claimed once each, before any provider call

Every gate runs after the button and before the message. A guest a gate stops is not sent to, and is not counted as reached.

Results

Return visits, not opens.

An open rate tells you a phone lit up. Habitu takes each guest the message actually reached, finds the first visit they made in the fourteen days after it reached them, counting from their own delivery time rather than the moment you pressed send, and carries the amount of the order behind that visit, summed from real transactions. Guests returned and revenue attributed, per campaign.

Anchored on delivery

The window starts when the message reached that guest, not when the manager pressed send. A campaign scheduled for next week therefore cannot book this week's visits as its own.

Reached means reached

The delivered count is the distinct guests present in the per-recipient ledger. Anyone skipped by a cap or a consent check is absent from it, which is the honest answer rather than a flattering one.

Attributed spend, from real orders

Each reached guest's first visit inside the window is credited to the campaign, carrying the amount of the order behind it, summed from real transactions, not inferred from an average ticket.

A result we cannot verify stays blank

When a campaign's delivery cannot be reconstructed from the send ledger, the screen leaves the count empty rather than printing a figure as fact.

HABITU.Your brand Search…⌘K
Attribution windowPer guest
ANCHORDelivered 14 Mar, 18:42 — not when Send was pressed
FIRST VISITThe first visit this guest made inside the 14 days after
ORDERThe amount of the order behind that visit, from transactions
REACHEDCounted from the delivery ledger, one row per guest

The window is anchored per guest, on when the message reached them. A guest a cap or a consent check stopped never enters the count.

Questions operators ask.

Can I send SMS or WhatsApp campaigns?

Not yet, and we would rather say so here than let you discover it after a launch. The in-app inbox and email are the live send channels today. Push and SMS can be selected, written and length-checked in the builder, and the composer will render your message as a WhatsApp chat so you can see it, but none of the three can dispatch yet. Everything around them is already built: audiences, caps, consent, attribution. Bringing a channel online is a connection rather than a rebuild.

How do I stop guests getting two campaigns in the same week?

Set a maximum number of messages per guest per week. It is enforced on the server against the delivery ledger, before any provider is called, so a guest already at the cap is skipped rather than sent to. The builder also shows how many of your guests are currently over the cap you have typed, counted across the brand, and that number recomputes as you change it.

What happens if a campaign would send in the middle of the night?

It is deferred, not dropped. A send that lands inside your brand's quiet-hours window is held with a next-attempt time computed in the brand's own timezone, and a scheduled dispatcher fires it once the window closes. Nothing is lost and nobody is woken up. The pre-send review screen also tells you before you commit, and offers to queue the campaign for the morning instead.

Can I cancel a campaign I already scheduled?

Yes, and cancelling actually stops it. The queue is checked against the campaign's own status at dispatch time, so a campaign moved back to draft or ended cannot be sent by a queued row, a retry, or a stale browser tab. This is deliberate: a send path should not depend on a screen behaving correctly.

How do you measure whether a campaign worked?

By counting visits, not opens. For each guest the message actually reached, Habitu looks for the first visit they made in the fourteen days afterwards and credits it to the campaign, with the value of the order behind it. The window is anchored on when the message reached that guest, not on when you pressed send, which matters most for scheduled campaigns, because anchoring on the button press would credit a week of visits made before anyone received anything. A guest a frequency cap or a consent check stopped is not in that count.

Can I target the guests of one location?

Partly, and it is worth being precise. A location can start a campaign: when a site's visits fall against its own prior month, or its enrolment rate sits below the brand average, that signal opens the builder from the location screen with the campaign already written for that situation. It opens on a behavioural audience, either lapsed guests or newly-joined guests, and you narrow that before you send. Filtering an audience by the branch a guest belongs to is not something we would stand behind yet: the field is in the builder, but nothing captures it at sign-up, so it would match nobody.

Do guests have to opt in before I can message them?

It depends on the channel, and the rule is applied on the server rather than left to the person building the campaign. Promotional email is on by default for a brand's own members, since that is an offer from a restaurant the guest already joined, while SMS and push require an express opt-in before anything can be dispatched. Every promotional email carries a one-click unsubscribe that email clients can action directly, and an opt-out is honoured at the next send gate.

Do I need a developer or an agency to run this?

No. The builder is one screen: pick the audience, attach the offer, write the message, choose the channels, set the cap and the send time. The audience conditions are dropdowns over your own guest data rather than a query language, and a message you are happy with can be saved to your brand's template list for the next campaign.

See it built on your own guests.

Thirty minutes, with a real audience and a real send gate. Not a slide deck.

Book a demo →