Q-Assist for Salesforce — Partner Overview
What Q-Assist is
Q-Assist puts a company's WhatsApp Business conversations inside Salesforce. Reps read and reply to customers on WhatsApp from any Lead, Contact, Account or custom record page, and every message is stored as a Salesforce record.
It is built for sales and service teams that already sell and support over WhatsApp, often from personal phones, and need that conversation in the CRM: visible to managers, tied to the right record, and sent from company numbers rather than individual handsets.
- No middleware for the partner to build. Q-Assist runs the WhatsApp side (Meta Cloud API, webhooks, queues, retries); the Salesforce side is a set of
FAS_-prefixed objects, Apex and Lightning components deployed into the org. - Salesforce stays the place reps work. One drag-and-drop chat component on record pages, plus a Q-Assist app with an inbox (Home) and an admin Settings page.
- Requires Enterprise Edition or above (API access is needed in both directions).
AI workflows
Q-Assist runs full AI workflows on WhatsApp: an AI agent answers first, qualifies the customer or lead, gathers what the team needs, and hands over to the right rep in Salesforce with the context already captured. Every workflow is built for the customer's business.
| Capability | What it does |
|---|---|
| Conversational AI | Natural, multi-turn WhatsApp conversations in the customer's voice, in any language the customer writes in. Answers questions, follows up and keeps the conversation moving 24/7. |
| Lead qualification | Asks the qualifying questions the sales team defines (need, budget, timing, product, location) and decides when a lead is sales-ready. |
| Customer qualification and intent | Works out what an existing customer wants, whether a quote, an order, support or a booking, and routes it to the team that handles it. |
| Specialist agents | A workflow can hand between specialist AI agents by intent, for example sales, service and finance, each with its own instructions. |
| Images and documents | Reads what customers send, such as product photos, labels, licence discs and documents, and pulls out the details (part numbers, vehicle details, specifications). |
| Voice notes | Transcribes and translates customer voice notes. The transcript and translation are stored on the Salesforce message record. |
| Structured forms | Collects answers through WhatsApp forms (Flows) when a question needs a fixed set of options. |
| Handover to a person | Hands over when the AI has what it needs, when the customer asks for a person, or after a set number of messages. The rep gets a short summary of what the customer wants. |
In Salesforce. Everything the AI says is synced as ordinary messages, so the rep sees the whole conversation on the record. Qualified enquiries can become Leads routed to the right queue per business number, with the AI's answers captured.
Built per customer, by Q-Assist. Q-Assist designs and builds every AI workflow and bot with the customer: the questions, the qualification rules, the tone, the handover points and the hours the AI covers.
Q-Assist's own AI, running outside Salesforce. The AI and bots are Q-Assist's own, not Agentforce or Einstein. They run entirely in the Q-Assist service, so nothing AI-related runs inside the org: no Agentforce or Einstein licences, no AI credits, and no Salesforce API calls or Apex limits used while the AI works. Salesforce only receives the results, as messages and records.
What it can do
Reps get a full WhatsApp chat on any record page; admins control who uses which number, and every message lands in Salesforce within seconds. Measured on a live thread: inbound message to Salesforce in 2.7 s, a reply from Salesforce delivered in about 2 s.
For reps
| Capability | How it works |
|---|---|
| Chat on any record | One component (fasChatWindow) dropped on Lead, Contact, Account or any object with a phone field. It finds the customer by the record's phone number. |
| Inbox (Home tab) | Every conversation the rep may see, newest first, filterable by status, with the chat open beside it. |
| Send and receive text | Live thread; new messages appear without refreshing. |
| Files, images, video, audio | Send with + or drag and drop. Files the customer sends are copied into Salesforce Files with thumbnails and previews. |
| Shared files and My Files | Admin-curated brochures with captions, plus the rep's own Salesforce files, in a side panel. Picking a file stages it; nothing goes until the rep presses send. |
| Quick replies | Saved texts and map locations. Admins share them with everyone; reps keep their own. Two clicks to send. |
| Replies and reactions | Quote a specific message, or react with an emoji, exactly as on a phone. |
| Delivery status | Pending, Sent, Delivered, Read or Failed on every outbound message, with Meta's failure reason. |
| 24-hour window | The composer knows when WhatsApp's 24-hour customer-service window is closed and offers approved templates in place of free text. |
| Expanded view | Open the chat in a large modal from a record page; the draft carries across. |
| Mobile app sign-in | A licensed rep signs into the Q-Assist phone app with a QR code from Salesforce. No second password. |
For admins
- One Settings page with tabs for users, numbers, files and replies, business hours, record linking, conversations and health. Covered in full under Settings reference.
- Business hours, holidays, out-of-office and scheduled auto-replies, managed from Salesforce.
- A Health tab showing connection status, scheduled jobs, org storage and API use, and any stuck or failed sends.
Also included
- WhatsApp templates — reps pick a Meta-approved template, fill in its variables and send. Templates start new conversations from any record and reopen a conversation after the 24-hour window.
- Voice notes from Salesforce — record, listen back and send as a native WhatsApp voice note, up to 7 minutes. Switched on per org in Settings.
- Typing indicator — shows when another rep is already replying to the same customer, so two people don't answer at once.
- Manager reporting tab — conversation volumes, response times and activity per rep and per number, alongside standard Salesforce reports on the message records.
How it works
Q-Assist sits between Meta's WhatsApp Cloud API and Salesforce. It receives every message, writes it into the org as a record, and sends reps' replies to WhatsApp after checking they are allowed to.
A message in. The customer writes; Meta delivers it to Q-Assist; Q-Assist upserts a FAS_Message__c record and fires an event so any open chat refreshes. Delivery and read receipts update the same record.
A reply out. The rep sends from the chat. Salesforce saves the message as Pending first, then calls Q-Assist. Q-Assist checks the rep's licence, the number and the 24-hour window, queues the send and answers within about a second. If the call fails, Salesforce retries within minutes and a scheduled sweeper catches anything left. Every send carries a unique key, so a retry never reaches the customer twice.
Files sent by reps stream from Salesforce Files to WhatsApp without passing through Apex, so size limits are WhatsApp's own. Files from customers are copied into Salesforce Files according to the copy settings.
The Q-Assist mobile app works on the same conversations, so reps can reply from their phones under the same licence and number rules.
Multiple WhatsApp numbers
One Salesforce org can run several WhatsApp Business numbers, for example one per branch, brand or team. Each number keeps its own conversations and its own 24-hour window with each customer.
- Registered in Settings → Numbers. Each number is a
FAS_BusinessNumber__crecord with a description reps see ("Cape Town Sales"), the number itself and Meta's phone number ID. Settings checks each entry against the numbers Q-Assist actually holds and pre-fills the ones it finds. - One card per number in the chat. If a customer has talked to two of the company's numbers, the record page shows two cards, each in its number's colour and labelled with its description. The most recent is open; the others fold to one line.
- Replies go out on the right number. Every send names the number it is sent from. A reply in the Cape Town card goes from the Cape Town number, never from whichever number the customer used last.
- Every message records its number (
FAS_BusinessNumber__candFAS_BusinessNumberId__con conversations and messages), so reports and automation can split by number. - Adding a number is a Q-Assist onboarding step (Meta app, number registration, webhook), then one record in Settings. No deploy is needed on the Salesforce side.
How access is scoped per user
Three independent layers decide what a user can do: a permission set says which parts of the app they see, a licence says whether they may send, and number assignments say whose conversations they see.
1. Permission sets
| Permission set | Give it to | Grants |
|---|---|---|
FAS_Base | every rep | Read access to conversations and messages, the chat component, and the right to call Q-Assist to send. |
FAS_Manager | managers, and reps who use the inbox | The Q-Assist app and its Home tab. Seeing messages still needs FAS_Base. |
FAS_Settings | Salesforce admins of Q-Assist | The Settings tab and the right to change it. Without it, Settings is read-only. |
FAS_All_Conversations | managers | Every conversation on every number, whatever the number assignments say. |
FAS_Integration_User | the integration user only | Write access used by the sync. Never assigned to people. |
No profiles are used. Every rule the components enforce is checked again on the server, so the UI is never the only gate.
2. Licences (who may send)
- Admins pick licensed users in Settings → Users. Only licensed users can send; anyone else can read but the composer refuses.
- The licence list is held by Q-Assist, not in Salesforce data, and the send is checked there. Editing Salesforce records cannot grant a licence.
- The seat count is set by Q-Assist per customer. Settings only lets an admin pick as many users as there are seats left, and says so plainly ("2 seats remain on your plan of 10").
- Billing is on distinct users licensed during the period.
- Removing a licence also switches off that user's Q-Assist mobile app.
3. Number access (whose conversations they see)
- In Settings → Numbers, each number can have users assigned. A number with no users is seen by everyone. Once it has users, only they see its conversations.
- A user can work several numbers, and a number can have several users.
- System administrators and holders of
FAS_All_Conversationssee every number. - This is real Salesforce record sharing, not a filter in the component, so reports, list views and global search respect it too.
FAS_Conversation__cis Private.FAS_Message__cis its master-detail child, so messages follow their conversation.- Each number has a public group (
FAS_WA_<phone number id>) kept in step with its assigned users. Each conversation is shared with its number's group. - Reassigning users only changes group membership; Salesforce recalculates access without rewriting records.
- The same assignments are pushed to the Q-Assist mobile app, which shows each user only their numbers and only notifies them about those.
When a user is deactivated
An admin chooses the behaviour once, in Settings → General:
| Choice | What happens |
|---|---|
| Remove them; keep their numbers closed (default) | Removed from numbers, licences and groups a few seconds after deactivation. A number left with no active users is closed: only administrators see it until someone is assigned. |
| Remove them; open their numbers to everyone | The same, but a number left with no active users becomes visible to everyone, past conversations included. |
| Refuse the deactivation | Deactivation is blocked until the admin removes the user in Settings. This also applies to deactivations from Okta, Azure AD or SCIM. Freezing still works. |
Settings → Health lists closed numbers and any inactive users still set up in Q-Assist.
Settings reference
Everything a customer admin can change lives on one Settings tab in the Q-Assist app, behind FAS_Settings. Nothing here needs a deploy.
| Tab | Setting | Default / notes |
|---|---|---|
| General | Default country code | 27. Used to turn local numbers such as 082 123 4567 into international format for matching. |
| General | Largest file a rep may send (MB) | 100, WhatsApp's own limit. Can be set lower. |
| General | File types reps may send | Blank means anything WhatsApp accepts. |
| General | When customer files are copied into Salesforce | On arrival, when a rep opens the chat, or never. Files not copied stay in Q-Assist and open by link. |
| General | Largest customer file to copy (MB) | 1 to 100. Larger files stay in Q-Assist with an Open link. |
| General | File retention (days) | 30. Copied customer files older than this are removed from Salesforce by a nightly job and re-fetched on demand. 0 keeps them. |
| General | Reps can send voice notes | Off by default. Receiving voice notes is always on. |
| General | What happens when a user is deactivated | See "When a user is deactivated" above. |
| General | Sync mode, batch interval and batch size | Immediate by default. Batched mode sends messages to Salesforce every few minutes, 1 to 200 records per API call, to save API calls in high-volume orgs. |
| Users | Licensed users | Pick from Salesforce users, up to the seat count. |
| Mobile users | Mobile app on/off; self-serve sign-up on/off | Both off by default. Lists every app user with their role and status; set up accounts, change roles, sign people out. |
| Numbers | Business numbers and their users | Description, number, Meta phone number ID; assigned users. |
| Files & replies | Shared files | Up to 50, each with a caption, description, pin and sort order. |
| Files & replies | Shared quick replies | Up to 50 texts or map locations. A pasted Google Maps link fills in the coordinates. |
| Hours & replies | Opening hours and special days | Per weekday, plus holidays and half-days. No hours set means always open. |
| Hours & replies | Out-of-office reply | On/off and text, sent to customers who message outside hours. |
| Hours & replies | Scheduled auto-replies | Message per day and time window. |
| Record linking | Object → phone field | Which field holds the customer's phone on each object (Lead → MobilePhone, Opportunity → Customer_Phone__c). Contact, Lead and Account come pre-set. |
| Conversations | Delete a conversation | Removes it, its messages and files Q-Assist copied in. Keeps shared files and files reps chose to send. Built for clearing demo data. |
| Health | (read only) | Connection, scheduled jobs with Schedule buttons, org file/data storage and API use, failed and stuck sends, number-access issues. |
Settings are stored where they are read: values only Apex uses (country code, retention, record linking) are custom metadata in the org; values Q-Assist's servers enforce (licences, file limits, hours) are stored in Q-Assist and edited through Salesforce. Q-Assist accepts only known settings with validated values.
Data model
Every WhatsApp message is an ordinary Salesforce record, so partners can report on it, trigger automation from it and build on it. All Q-Assist metadata carries the FAS_ prefix to avoid collisions with the customer's own schema.
| Object | Label | Holds |
|---|---|---|
FAS_Conversation__c | WhatsApp Conversation | One per customer per business number: phone, customer name, business number, status, last message preview and time, last inbound time. Private sharing, scoped by number. |
FAS_Message__c | WhatsApp Message | Master-detail child of the conversation. Direction, body, type (text, image, video, audio, document, location, reaction, template), status and time, sender, the Salesforce user who sent it, file link, voice-note transcript and translation, location, reply-to, Meta's failure reason. |
FAS_BusinessNumber__c | WhatsApp Business Number | The company's numbers, with description and whether a number is closed. |
FAS_BusinessNumberUser__c | WhatsApp Number User | Which users work which number. |
FAS_QuickReply__c | WhatsApp Quick Reply | Shared and personal quick replies. |
FAS_FileSetting__c | WhatsApp Shared File | Admin-shared files with captions. |
FAS_LicensedUser__c | Q-Assist Licensed User | A read-only copy of the licence list, for reports. |
FAS_ObjectPhoneMapping__mdt | custom metadata | Object → phone field for the chat component. |
FAS_Config__mdt | custom metadata | Country code, retention, voice notes, deactivation mode. |
FAS_MessageArrived__e | platform event | Fired when a message lands, so open screens refresh. Carries no message content. |
Built for partners to extend
- Lookups reserved for your automation.
FAS_Conversation__chasFAS_Lead__c,FAS_Contact__c,FAS_Account__candFAS_Opportunity__c. Q-Assist never writes them, so customer automation can set them without fighting the sync. - Messages are safe to trigger on. Each message has a unique, case-sensitive external ID, and syncs are upserts, so a retried sync never creates a duplicate.
- Synced fields are read-only to reps because the next sync would overwrite an edit.
- Reference implementation: WhatsApp enquiries to Lead queues. We supply example Apex (no Flows) and a setup guide that turns a message from an unknown number into a Lead owned by a queue, chosen per business number, and links existing Contacts and Leads instead of duplicating them. It is deployed and owned by the customer, so partners can adapt it.
Implementing it in a customer org
Q-Assist installs and connects the app; the partner configures it for the customer's processes and builds anything around it. A typical rollout:
- WhatsApp numbers (Q-Assist). Register each business number with Meta and connect it to Q-Assist. Physical SIMs are recommended; Meta has banned virtual numbers on arrival.
- Deploy (Q-Assist). The Salesforce metadata is deployed into the org directly. There is no AppExchange package and no namespace; everything is
FAS_-prefixed. Enterprise Edition or above is required. - Connect (Q-Assist, with the customer's admin). Create an integration user and give it
FAS_Integration_User. Q-Assist sets up the server-to-server connection both ways and issues the org its own key. - Assign permission sets (partner).
FAS_Baseto reps,FAS_Managerto anyone who uses the inbox,FAS_Settingsto Q-Assist admins,FAS_All_Conversationsto managers. Permission set groups work well here. - Configure Settings (partner). Licensed users, business numbers and who works each one, record linking for every object the chat should appear on, shared files and quick replies, business hours and auto-replies.
- Place the chat (partner). In Lightning App Builder, drop the Q-Assist chat component on the record pages that need it. On an object with no phone mapping it shows a clear message instead of failing.
- Schedule jobs (partner). From Settings → Health, schedule the send-retry sweeper and the nightly file retention job.
- Extend (partner, optional). Lead routing by number, linking conversations to Accounts or Opportunities, reports and dashboards on messages, notifications.
Updates to the Salesforce side are deployed by Q-Assist. Customer Settings are kept across updates.
Security and limits
Security and data
- Each org has its own key, stored by Q-Assist only as a hash. The org never tells Q-Assist which customer it is; Q-Assist works that out from the key, so one org cannot reach another's data. This has been tested with a second tenant.
- Q-Assist signs in to Salesforce with a certificate (OAuth JWT bearer). No passwords or refresh tokens are stored.
- Customer files are never on a public link. They are either copied into Salesforce Files or opened through a link that expires in 15 minutes.
- Data residency. Q-Assist runs in South Africa. Message content is copied into the customer's Salesforce org, which may be hosted elsewhere. Under POPIA that is a cross-border transfer the customer's agreement should cover.
Limits to plan for
| Area | What to know |
|---|---|
| Salesforce API calls | About one API call per message, plus one per status change. Health shows the org's 24-hour API use. High-volume orgs can switch to batched sync, which groups up to 200 messages into one API call on an interval the admin sets. |
| File storage | Copied customer files use the org's file storage. Use the retention days and the copy mode to control it. |
| File sizes | WhatsApp's limits apply: images 5 MB, video and audio 16 MB, documents 100 MB. Oversized media is sent as a document rather than refused. Customers cannot send files over 100 MB; the rep sees a notice when they try. |
| Starting a conversation | WhatsApp only allows free text within 24 hours of the customer's last message. Outside that window, and to start a new conversation, reps send a Meta-approved template. |
| Lists | Shared files, shared quick replies and personal quick replies are capped at 50 each. The Home inbox shows the 100 most recent conversations, filterable by status. |
| Edition | Enterprise Edition or above. The typing indicator uses Platform Cache. |