Connect
v1.1.36Run 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.
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.
- 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
| Requirement | Detail |
|---|---|
| WordPress | 6.0+ (6.5+ recommended) |
| PHP | 7.4+ (8.1+ recommended) |
| HTTPS | Required. The app refuses to pair with a site served over plain HTTP. |
| REST API | Must be reachable. Security plugins that block /wp-json/ will stop pairing. |
| WP-Cron | Used to deliver webhooks out of the request. A site with cron disabled will not send them. |
| The app | iOS via the App Store. Free — the licence lives on the site, not the phone. |
Pairing a device
One scan, or one copy-paste. No account to create on the phone.
Open WPStack → Connect
The Pair Device screen shows a QR code and a pair token.
Scan it with the app
Install WPStack from the App Store, tap Add site, and point the camera at the code.
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.
Done
The device appears under Connect → Devices, with its name and last-seen time.
How many devices?
| Plan | Devices |
|---|---|
| Starter | 2 |
| Pro | 5 |
| Agency | 999 |
The inbox
Everything that needs you, in one place, with the counts that matter.
| Section | What you can do from the phone |
|---|---|
| Chat | Read a conversation, reply, and close it. A live typing indicator runs both ways, so the visitor sees you typing and you see them. |
| Callbacks | See the number and the page it came from, tap to dial, and mark it called or no-answer. |
| Bookings | Confirm, 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. |
| Forms | Browse entries by form, see which still need a reply, read every submitted field, and reply by email — sent by the site, not the phone. |
| Events | See registrations per event, how many tickets are scanned, and open the door scanner. |
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.
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.
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.
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
| Module | Events |
|---|---|
| Booking | booking.created · booking.status_changed · booking.rescheduled · booking.deleted |
| Events | registration.created · registration.status_changed · registration.deleted · registration.checked_in · registration.checkin_undone |
| Forms | form.submitted · form.entry_deleted |
| Chat & callbacks | chat.started · chat.message · chat.closed · callback.created · callback.status_changed · callback.deleted |
What a delivery looks like
{
"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"
}
}| Header | Value |
|---|---|
X-WPStack-Event | The event name, so one endpoint can route several. |
X-WPStack-Site | Which site sent it — useful when several point at one scenario. |
X-WPStack-Attempt | 1 on the first try, 2 on the retry. |
X-WPStack-Signature | sha256=…, an HMAC of the exact body. Only sent when you set a signing secret. |
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.
| Hook | Type | Description |
|---|---|---|
| wpstack_booking_created | action | $booking_id |
| wpstack_booking_status_changed | action | $booking_id, $new, $old |
| wpstack_events_ticket_checked_in | action | $ticket, $user_id — only a real check-in; re-scans do not fire. |
| wpsf_entry_created | action | $entry_id, $form_id, $data |
| wpsc_callback_created | action | $callback_id, $phone |
| wpsc_new_chat_message | action | $session_id, $message, $sender, $session — visitor messages only. |
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.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 );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.
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.