Docs Product page Dashboard
Docs Admin Connect

Connect

v1.1.36

Run your site from your phone, and wire it into everything else. Pair a device by QR code for one inbox covering chats, form entries, callbacks, bookings and event tickets — with push notifications, a door scanner, and outbound webhooks to Make, Zapier or your own CRM.

Included in every plan Updated September 2026

Overview

Connect is the bridge between your WordPress site and the WPStack mobile app — and the module that sends your data anywhere else you want it.

It does two jobs. First, it puts your site in your pocket: pair a phone once and every enquiry, booking and message lands in a single inbox you can act on — reply to a chat, confirm an appointment, call someone back, scan a ticket at the door. Second, it posts those same events outward to Make, Zapier, n8n or your own CRM, so the rest of your stack hears about them without anyone copying anything.

Nothing writes back inConnect is deliberately one-way for integrations. The webhook engine registers no REST routes and no AJAX handlers at all — there is no inbound surface, and no API key for an outsider to hold. The mobile app is the only thing that can change data, and only through a session token you can revoke from the Devices screen at any time.
  • One inbox — chats, form entries, callbacks, bookings and event registrations in a single list.
  • Push notifications when something new arrives.
  • Act, don't just read — reply, confirm, reschedule, call back, check in.
  • A door scanner for event tickets, with undo.
  • 17 webhook events across four modules, signed and one-way.
  • Multi-site — pair several sites to one phone and switch between them.

Requirements & compatibility

RequirementDetail
WordPress6.0+ (6.5+ recommended)
PHP7.4+ (8.1+ recommended)
HTTPSRequired. The app refuses to pair with a site served over plain HTTP.
REST APIMust be reachable. Security plugins that block /wp-json/ will stop pairing.
WP-CronUsed to deliver webhooks out of the request. A site with cron disabled will not send them.
The appiOS via the App Store. Free — the licence lives on the site, not the phone.
Connect shows what you already ownA tab only appears if that module is installed and active. A site running only Booking sees only bookings — Connect never invents a section for something you do not have.

Pairing a device

One scan, or one copy-paste. No account to create on the phone.

1

Open WPStack → Connect

The Pair Device screen shows a QR code and a pair token.

2

Scan it with the app

Install WPStack from the App Store, tap Add site, and point the camera at the code.

3

Or type it instead

The same screen prints your site address and token as copyable text. Typing them takes the identical path — the QR is only a transport, so a phone with no camera access works exactly the same.

4

Done

The device appears under Connect → Devices, with its name and last-seen time.

How many devices?

PlanDevices
Starter2
Pro5
Agency999
Re-pairing does not use a second slotPair the same device name again — after reinstalling the app, say — and it reuses the existing slot and keeps its push registration. You only consume a slot with a genuinely new device.
What the site actually storesOnly a hash of the session token. The plaintext is returned to the phone once, at pairing, and never stored. Revoking a device deletes its row, which invalidates that token immediately — useful if a phone is lost.

The inbox

Everything that needs you, in one place, with the counts that matter.

SectionWhat you can do from the phone
ChatRead a conversation, reply, and close it. A live typing indicator runs both ways, so the visitor sees you typing and you see them.
CallbacksSee the number and the page it came from, tap to dial, and mark it called or no-answer.
BookingsConfirm, reschedule against real availability, archive, or create a booking from scratch. Today is shown as a 30-minute agenda with a live red line at the current time.
FormsBrowse entries by form, see which still need a reply, read every submitted field, and reply by email — sent by the site, not the phone.
EventsSee registrations per event, how many tickets are scanned, and open the door scanner.
The badge is work, not noveltyEach tab counts what is still outstanding, and clears only when you act — close the chat, archive the entry, mark the callback called. Bookings counts today's remaining appointments and falls on its own as the day passes. Looking at a tab never clears it.

Choosing which sections appear

Under WPStack → Connect → Settings.

Connect lists every section this site can show, derived from the modules actually running, with a switch for each. Turn one off and it disappears from the app for every paired device.

Chat is read per channel, not per moduleThe chat bubble can run WhatsApp-only, with no live chat and no call-me-back. So the Chat tab needs live chat switched on, and Callbacks needs the phone channel switched on — they come from one module but are independently usable, and Connect treats them that way.
New modules appear automaticallyA section you have never configured counts as on. Activate Events and its tab shows up without a second opt-in; only an explicit switch-off hides anything.

The ticket scanner

Check people in at the door with the phone you already have.

Open an event and tap Scan tickets, or use the scan button on the Events tab to accept any ticket for any event. Point the camera at a ticket QR code and it checks in, with a distinct vibration for accepted, already-scanned and invalid.

  • Two modes — check in instantly, or show the ticket first and confirm. Pick whichever suits your door; the choice is remembered per device.
  • Wrong-event warning — a valid ticket for a different event is flagged rather than silently accepted.
  • Undo — a mistaken scan is reversible on the spot.
  • A running count of how many you have scanned this session.
Re-scanning is not a check-inScanning an already-scanned ticket tells you when it was first used and changes nothing. Only a genuine state change counts, so your scanned total and the registration.checked_in webhook can both be trusted.

Push notifications

Every paired device is notified when a booking is made, a form is submitted, a callback is requested, a visitor sends a chat message, or someone registers for an event. Tapping the notification opens the right section.

Silence usually means permissionsIf notifications stop, check that the app has notification permission on the phone, that the device still appears under Connect → Devices, and that the section is switched on in Connect → Settings. A revoked device receives nothing.

Webhooks & integrations

Send what happens on your site straight to Make, Zapier, n8n or your own CRM.

Under WPStack → Connect → Integrations, paste the URL your automation tool generated, pick the module, tick the events it should receive, and press Send test so the receiver can learn the field structure. Add as many endpoints as you like — each one gets its own event list and its own signing secret.

The 17 events

ModuleEvents
Bookingbooking.created · booking.status_changed · booking.rescheduled · booking.deleted
Eventsregistration.created · registration.status_changed · registration.deleted · registration.checked_in · registration.checkin_undone
Formsform.submitted · form.entry_deleted
Chat & callbackschat.started · chat.message · chat.closed · callback.created · callback.status_changed · callback.deleted
Only what you own is offeredA module you do not run is not listed. You cannot subscribe an endpoint to an event that could never fire.

What a delivery looks like

json
{
  "event": "booking.created",
  "site": "https://example.com",
  "occurred_at": "2026-09-03T09:15:00+00:00",
  "data": {
    "id": 412,
    "client_name": "Sam Devlin",
    "client_email": "[email protected]",
    "service": "Consultation",
    "date": "2026-09-14",
    "time": "10:00",
    "status": "confirmed"
  }
}
HeaderValue
X-WPStack-EventThe event name, so one endpoint can route several.
X-WPStack-SiteWhich site sent it — useful when several point at one scenario.
X-WPStack-Attempt1 on the first try, 2 on the retry.
X-WPStack-Signaturesha256=…, an HMAC of the exact body. Only sent when you set a signing secret.
Every field is always presentMake and Zapier learn the shape from your first test delivery. WPStack always sends the same keys — empty rather than missing — so a booking with no phone number will never break a scenario you have already mapped.
Verify the signature if the data mattersCompute hash_hmac('sha256', $raw_body, $your_secret) and compare it to the header. Without that check, anyone who learns the URL can post to it — the secret is what proves a delivery really came from your site.

When something fails

Delivery happens outside the visitor's request, so a slow endpoint never delays a booking. A failure is retried once after a minute, then recorded. The Integrations screen keeps the last 50 deliveries with their status codes, and each endpoint shows its own health — delivered, failing, paused, or listening for nothing.

For developers

Every webhook is a WordPress action first, so you can handle it in code without Connect at all.

These fire from the modules themselves, on every path — the website, wp-admin and the mobile app. The full table with argument signatures is rendered at the bottom of the Integrations screen, kept in sync with the code that fires them.

HookTypeDescription
wpstack_booking_createdaction$booking_id
wpstack_booking_status_changedaction$booking_id, $new, $old
wpstack_events_ticket_checked_inaction$ticket, $user_id — only a real check-in; re-scans do not fire.
wpsf_entry_createdaction$entry_id, $form_id, $data
wpsc_callback_createdaction$callback_id, $phone
wpsc_new_chat_messageaction$session_id, $message, $sender, $session — visitor messages only.
Two prefixes, on purposeBooking and Events use wpstack_*; Forms uses wpsf_* and Chat uses wpsc_*. The latter two predate the convention and already ship to live sites, so renaming them would silently break anyone building on them. New hooks follow whichever prefix their own module already uses.
php
add_action( 'wpstack_booking_status_changed', function ( $booking_id, $new, $old ) {
    if ( 'cancelled' !== $new ) {
        return;
    }
    // …free a resource, notify a colleague, write to your own table…
}, 10, 3 );
Pass the argument countThe 4th parameter of add_action() is how many arguments your callback receives. Leave it off and WordPress hands you only the first.

Security

What the module can and cannot do, stated plainly.

  • One public route. Pairing is the only endpoint open without a token, and it is rate-limited against guessing.
  • Session tokens are stored hashed. The plaintext exists on the phone and nowhere else.
  • Webhooks are outbound only. No REST route, no AJAX handler, no way in.
  • Signing secrets are encrypted at rest and never written into scheduled-task arguments, where any plugin could read them.
  • Replies cannot be redirected. When you answer a form entry from the app, the recipient is resolved on the server from the stored entry — the phone never supplies an address, so a stolen token cannot turn your site into a spam relay.
  • Revocation is immediate. Removing a device from the Devices screen invalidates its token on the next request.
If a phone goes missingOpen WPStack → Connect → Devices and revoke it — or use Clear all devices and re-pair the ones you still have. No password change is needed, because the app never held your WordPress password.

Frequently asked questions

No. Pairing is the whole login. The licence lives on the site, and the app simply holds a token for each site you have paired.

Yes. Pair as many as your plan allows and switch between them from the site name at the top of the app. Each site keeps its own inbox and its own settings.

No. The app talks directly to your own site over HTTPS. The only outside call is to Apple's push service, which carries a short title and the site address so the app knows where to open — never the content of a message.

No. Any URL that accepts a POST works, including your own script. Make and Zapier are simply the easiest way to turn one into an action without writing code.

No. Webhooks are one-way by design — the module exposes no inbound endpoint at all. That rules out some two-way sync scenarios, and it is a deliberate trade for having no attackable surface.

The delivery is retried once after a minute, then recorded as failed in the log with its status code. Nothing is queued indefinitely and nothing on your site is delayed.

iOS first. The site side is identical either way, so nothing you configure now will need redoing.

Was this page helpful?