HiLucyHelp Center

Welcome Package — Multi-step Check-in Welcome

HiLucy Team·Updated 2026-04-27·5 min read

The welcome package is what your guest sees the moment their reservation arrives. Instead of a single "welcome" message, you can author an ordered sequence of WhatsApp messages — each from a different template, with its own delay — that pace out the information so guests aren't overwhelmed.

A common shape: greet on arrival, share Wi-Fi 30 seconds later, drop a local guide 5 minutes later, offer an upsell 30 minutes later. Each step is independently editable, can be reordered, disabled without deleting, and previewed against sample guest data.

Where to find it

Manager dashboard → gear icon (Settings) → Welcome package sub-tab. The editor is per-listing — pick a listing from the search box and the package loads.

Authoring a step

Each step has four things to set:

  1. Template — pick from the catalog of pre-approved Meta templates. v1 includes:
    • Check-in welcome (image header) — branded greeting card with image and a check-in CTA. Best as Step 1.
    • Hotel check-in (text only) — lighter follow-up without the image.
    • Info card with CTA — header + body + button. Use for Wi-Fi, local guides, upsells.
  2. Send timingImmediate, +30s, +2m, +5m, +30m, +1h, or a custom number of seconds. Step 1 should usually be immediate; later steps stagger.
  3. Placeholders — every template exposes its own fields (guest name, body line, image URL, etc.). Type {{ in any field to insert a token (see below).
  4. Enabled toggle — turn a step off without losing the authored content.

Drag the ↑ / ↓ buttons to reorder. Duplicate clones a step (handy when the same template is used twice with different timing). Send this step only fires the single step to a phone for spot-checking.

Tokens — pulling guest, listing, and reservation data

Tokens render real values into your text at send time. They use {{namespace.field}} syntax. Type {{ in any text field and an autocomplete popover groups them by namespace:

  • guest.*first_name, last_name, full_name, phone_last4
  • listing.*hotel_name, title, address, welcome_image_url, thumbnail_url, wifi_ssid, wifi_password
  • reservation.*check_in_date, check_out_date, nights
  • system.*arrival_token (the URL button payload — Meta concatenates this with the registered URL prefix), now_local

Tokens are case-sensitive and must be exact — {{guest.first_name}}, not {{Guest.firstName}}. Unknown tokens render as empty strings (with a warning logged on the server).

Example body: Hi {{guest.first_name}}, welcome to {{listing.hotel_name}}! Your room is ready. At send: Hi Andrea, welcome to KAN Hotel Tulum! Your room is ready.

To include literal braces, escape with a backslash: \{{guest.first_name}} renders as the literal string {{guest.first_name}}.

Live preview

The right pane stacks every enabled step as a WhatsApp bubble in arrival-time order. Each bubble has a timing strip ("+0s", "+30s", "+5m") so you can see at a glance how the conversation will feel. Edits anywhere update the preview within ~250ms — useful when fine-tuning copy.

Send a test

Click Send test package in the sticky footer. Enter a phone number (with country code), toggle Compress delays if you want all steps to arrive within a few seconds (rather than waiting through the real timing), and hit send. Per-step results stream back — sent / failed, plus the WhatsApp message ID for traceability.

The test fires real Meta API calls but uses a synthetic arrival token so the URL button leads nowhere harmful. Rate-limited to 5 sends per listing per 5 minutes to prevent loops.

How sends actually fire on arrival

When a real reservation transitions to arrived:

  1. The Cloudbeds sync emits an arrival event
  2. The arrival handler resolves the listing and primary guest
  3. Step 1 fires immediately; later steps queue on WordPress cron at their scheduled offset
  4. Each cron tick re-loads the package, so config changes you make during the wait are honored
  5. Per-step idempotency prevents duplicate sends if the arrival event ever fires twice

If a step's required placeholder is empty (e.g. no welcome image set), that step is skipped with a log line — the rest of the package still fires.

Migration from the legacy single welcome message

The first time you save a package on a listing, the legacy welcome-message fields (body, post line) are retired and become Step 1 of your new package. Listings you haven't touched yet keep using the old single-message path — it's a zero-flag-day rollout, you migrate as you author.

Best practices

  • Step 1 should be immediate and have an image — that's the bubble guests notice, and Meta requires a header image on the lead guest_check_in template.
  • Don't stack three info cards at +0s — they arrive simultaneously and create a wall. Stagger by 30s+ so each lands in its own attention window.
  • Use {{system.arrival_token}} for URL buttons — anything else fails Meta's URL-suffix validation. The editor enforces this with an allowed-token whitelist.
  • Test with compressed delays first — verifies the chain works in seconds. Then send a non-compressed test to feel the pacing.
  • Keep the welcome line under 1 line — guests skim WhatsApp. Use the call-to-action line for the verb.

What's not in v1

  • Event-triggered steps (fire on guest reply, Wi-Fi connect, etc.) — only time-based delays for now
  • Global default packages that listings inherit — per-listing only
  • Post-stay or promotional drips — strictly arrival-window in v1
  • Multi-language packages — language is resolved per guest from their existing locale

If any of these would unlock a workflow for you, mention it in onboarding and we'll prioritize.

Was this article helpful?

Related Articles