Open

Multiple webhook URLs + platform alert events

--- Today Spur sends every webhook event to a single callback URL, and we only expose two event types: Message Received and Message Status Update. Customers have to route everything through one endpoint, and they get no alert when Meta does things to their WABA (display name rejected, account flagged, template paused, CTWA lead submitted). Ask, two parts. 1. Multiple webhooks, each scoped to specific events. - Settings, Webhooks, New webhook, enter URL, tick the events you want, save. - A customer can register N webhooks, each listening to its own subset of events. - Public API to register, list, edit, delete webhooks programmatically. 2. Expose new event types beyond incoming + delivery status. Meta already fires these to our WABA, we just need to forward them. a) Phone number name update (Meta field: phone_number_name_update) Fires when display name is approved or rejected. Customers want to know immediately if their brand name gets rejected. json { "entry": [{ "id": "[REDACTED]", "time": 1778602217, "changes": [{ "value": { "display_phone_number": "[REDACTED]", "decision": "REJECTED", "requested_verified_name": "[REDACTED]", "rejection_reason": "BIZ_COMMERCE_VIOLATION_OTHER" }, "field": "phone_number_name_update" }] }], "object": "whatsapp_business_account" } b) Account update / violations (Meta field: account_update) Fires on spam violations, quality rating drops, account restrictions. Critical for customers to monitor. json { "entry": [{ "id": "[REDACTED]", "time": 1778216044, "changes": [{ "value": { "event": "ACCOUNT_VIOLATION", "violation_info": { "violation_type": "SPAM" } }, "field": "account_update" }] }], "object": "whatsapp_business_account" } c) CTWA automatic events (Meta field: automatic_events) Fires on CTWA ad lead events with ctwa_clid for downstream attribution. Customers running CTWA ads can pipe this into their CRM or CAPI optimizer. json { "object": "whatsapp_business_account", "entry": [{ "id": "[REDACTED]", "changes": [{ "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": "[REDACTED]", "phone_number_id": "[REDACTED]" }, "automatic_events": [{ "id": "[REDACTED]", "event_name": "LeadSubmitted", "timestamp": 1777473615, "ctwa_clid": "[REDACTED]" }] }, "field": "automatic_events" }] }] } d) Template status update (Meta field: message_template_status_update) Fires when a template moves between APPROVED, PAUSED, REJECTED, PENDING. Customers want to know the moment a high-volume template gets paused so they can swap to a backup before broadcasts break.

Rohan Rajpal·6 days ago
Open

AI Auto Follow Up

Problem In 1:1 chats, brands often send the last message and the customer goes quiet. Some of those are over (customer said thanks, brand said anytime). Some arent (brand asked something and the customer ghosted). Today nobody knows which is which until an agent manually scrolls. Tickets die, warm leads cool. What it does A native AI follow up engine for 1:1 chats. Watches every convo where the brand sent last. Classifies whether a customer reply was owed. If yes, drafts a contextual nudge after a wait period (auto send or agent draft, configurable). If no, leaves it alone. Classification (the hard part) Looking at the last 3 to 5 messages, the AI buckets the convo into: - Awaiting info : brand asked a question, asked for a screenshot, asked them to confirm something. Follow up owed. - Awaiting action : brand asked them to try a fix, click a link, share order ID, complete checkout. Follow up owed. - Pending decision : brand shared a product link, discount, price, options. Follow up owed, longer wait. - Naturally closed : customer thanked the brand and got an acknowledgement, or the brand confirmed a fix and the customer reacted positively (sticker, "got it"). No follow up. - Implicit closure : brand said "let us know if anything else comes up", customer didnt reply. They werent supposed to. No follow up. - Ambiguous : flag to agent, dont auto send. The check is not "did the brand's last message end in a question mark". Soft questions ("hope that helps?") owe nothing. And plenty of replies are owed when no question was asked at all ("Sharing code BRAND10, use before Sunday"). What actually matters : did the brand request info, request an action, or present a choice, and did the customer's prior message already close the loop emotionally. Wait periods (defaults, workspace override) Info or action : 24 hours. Pending decision : 3 days. The nudge itself References whats actually pending. Tone pulled from the brand's own messages in the same thread, not a template: Hey, circling back on the screenshot of the error. Still happening or did it sort itself out? Escalation Nudge 1 (contextual). Nudge 2 after another wait, softer. Then auto close or hand to human, workspace setting. Hard cap of 2. Not debt collection. Hard dependencies (must ship alongside) 1. AI agent image understanding. Today it goes blind on screenshots and just opens a human ticket. 2. AI agent voice note transcription. Same blind spot. 3. Workspace level Do Not Disturb window. Doesnt exist yet. Without it the engine ends up nudging at 3am and brands eat spam reports. Without 1 and 2 the classifier sees half the convo and guesses wrong on the rest. Out of scope - Broadcast follow ups. If the customer didnt engage with a broadcast, no nudge. Pinging again invites reports and tanks the WABA. Separate feature, separate surface. - Flows and abandoned checkout. Already flow territory. Edge cases - Dont stack a nudge on a nudge, unless the wait policy says so. - Skip if the chat is manually closed, customer is blocked, or unsubscribed - Multiple open threads with the same customer in the chat : we treat each thread independently. Engine acts on the most recent open one; if the bucket signal is weak, message stays generic ("hey, everything sorted on your end?") Why now Top complaint from brand CS teams is "I cant tell which chats need me right now". If the AI can surface or auto handle the ones where a follow up is genuinely owed, agents save real hours a week and brands stop dropping warm leads and half solved tickets.

Khizar·3 days ago
Open

Mobile App SDK (iOS + Android) to embed Spur chatbot and live chat inside your mobile app

Today Spur supports web (script embed), WhatsApp, Instagram and Facebook. There's no native way to add Spur inside a brand's iOS or Android app. Embedding the web widget script inside a mobile app doesn't work cleanly: no push notifications, broken identity persistence, feels foreign inside the app, no hooks into the app's native screens or features. Use case we're seeing A services brand wants their "Help & Support" menu inside their mobile app to launch the Spur chatbot. The bot should: 1. Show a 4-button menu (Pre-booking, Active Orders, Post Service, Account/Wallet). 2. Branch into the right flow on each tap. 3. Pull live order status from their backend via API. 4. Raise a ticket in their CRM or hand off to IVR (voice) for complaints. Same pattern applies to D2C brands with their own apps, fintech, healthtech, edtech, q-commerce, logistics. Any brand with a mobile app that today has either no in-app support, or a clunky third-party chat widget inside a WebView. What the SDK should do 1. Programmatic launch. Spur.openChat() from any button or screen. 2. Launch into a flow. Spur.openChat(flowId: "pre_booking") so brands can wire their own UI to specific Spur flows. 3. Identity verification. HMAC-signed user ID so the user is already logged in when they open chat. No re-asking phone or email. 4. User attributes + events. Pass the logged-in user's name, phone, order ID, wallet balance, plan tier. Track in-app events for segmentation. 5. Bot to app events. Bot can fire an event the app listens for: open dialer for IVR, deep link to wallet screen, close chat. 6. Push notifications. FCM (Android) + APNS (iOS) so users get pinged when an agent replies. 7. Theming. Brand color, logo, header copy, launcher icon. 8. Conversation continuity. Same conversation visible on web widget, iOS, Android. Platform coverage Native iOS (Swift), native Android (Kotlin), plus wrappers for React Native and Flutter. Most modern apps are RN or Flutter, so the wrappers matter as much as native. How the rest of the industry does this Every serious chatbot and live chat player ships a native mobile SDK. Examples: 1. Intercom. Native iOS + Android SDKs, plus React Native, Flutter, Cordova wrappers. Intercom.present() opens the Messenger as a native bottom sheet. HMAC identity, push, custom attributes, in-app messages. 2. Zendesk. Messaging SDK for iOS + Android, ~7.5MB footprint. Configured via Channel ID in admin, customised in the Zendesk dashboard. 3. Freshchat (Freshworks). Native iOS + Android. Web widget config (topics, KB, branding) inherited automatically. External ID + Restore ID pattern for cross-platform continuity. 4. Haptik. HaptikLib for iOS + Android. Pitched as "embed our assistant in your app." 5. Yellow.ai. Native Android + iOS. Notably also exposes a Fragment / ViewController so the bot can be embedded inline inside an existing app screen, not just as a popover. Bot to app and app to bot event listeners. 6. QuickReply. Direct competitor, has a mobile SDK (this came up in a prospect call where we lost on the mobile experience comparison). Why this matters for Spur 1. Unlocks non e-commerce verticals (services, fintech, healthtech, logistics) where the app is the primary surface, not the website. 2. Closes the gap with QuickReply and the larger players on the mobile experience question. 3. For our existing D2C brands with custom mobile apps, gives one continuous Spur experience across web, app, WhatsApp, Instagram and Facebook.

Rohan Rajpal·6 days ago
Open

Feature Request – AI Agent Support for Voice Messages and Images

Hi Team, I hope this message finds you well. I'm reaching out to officially submit a feature request regarding the behavior of the AI agent when connected to messaging accounts such as WhatsApp, Instagram, and similar platforms. --- Current Behavior: When a client sends a voice message or an image, the AI agent is currently unable to process it. As a result, the chat is automatically assigned to my account and a support ticket is raised. This means the customer receives no immediate response, which can lead to a poor experience — especially when my support team is unavailable and the message ends up waiting a long time to be handled. --- Feature Request: I would like to request that the AI agent be enhanced to handle voice messages and images by: 1. Processing and responding to such messages based on its available data sources and trained knowledge. 2. If full processing is not yet possible, at minimum sending an automated acknowledgment message to the customer such as: "Sorry, I wasn't able to process your message. A member of our customer support team will be in touch with you shortly." This would significantly improve the customer experience by setting clear expectations rather than leaving the conversation in silence. --- Workaround Being Tested: Following guidance from your support team, I am currently testing a workaround by updating the AI agent's system prompt to instruct it on how to handle such scenarios. I will follow up with the results once the testing is complete. --- I believe this is a valuable enhancement that would benefit many users, and I appreciate your team's time in reviewing this request. Please don't hesitate to reach out if you need any further clarification. Best regards, Ahmed Kassem

Ahmed Kassem·7 days ago
Open

Broadcast sequences — schedule multiple templates in a single broadcast

Broadcast sequences — schedule multiple templates in a single broadcast Problem Right now, if a user wants to run a drip/sequence campaign (e.g., 3–5 follow-up templates to the same segment), they have to create a separate broadcast for each message and manually adjust the audience each time. It's repetitive, error-prone, and there's no clean way to target only users who received the previous message. What we want to build A "broadcast sequence" mode where the user can configure a series of templates in a single broadcast config: - Pick a segment (as usual) - Add multiple templates in order (2, 3, 5, however many) - Set a delay between each one (e.g., 2 days between message 1 and 2, 3 days between 2 and 3, etc.) - Hit schedule once — the system fires message 1 on day 0, message 2 after the configured delay, message 3 after the next delay, and so on Audience toggle per follow-up For every message after the first, there's a toggle that controls who receives it: - Only users where the previous message was delivered — tighter funnel, avoids spamming users who never got the first message anyway - Everyone in the original segment — ignores delivery status of the previous step, sends to the full original audience Why it matters - Replaces the current workaround of 3–5 separate broadcasts with manual audience juggling - Standard pattern for re-engagement, cart recovery follow-ups, launch sequences, educational drips, etc. - Gives users proper control over sequence targeting without needing custom segments for each step

Karan·30 days ago