16 Feb 2022: Add resources to Playbooks and export Contacts
26 Jan 2022: Try out emojis in buttons, but no more 'templates' in sandboxes
5 Jan 2022: Use buttons in threads
23 Nov 2021: Button messages
2 Nov 2021: Playbooks Launch (Beta)
20 Sept 2021: The end of Chatbase
9 Sept 2021: Data Export API
9 August 2021: Thread data export
22 June 2021: You know best!
21 June 2021: Sample content for templates
17 June 2021: Important security improvements
8 June 2021: Community Playbooks (Alpha)
18 March 2021: Improved billing transparency
17 March 2021: Share the amazing work you do
8 March 2021: Contextual replies and profile settings that suit you
22 Feb 2021: Button automation
18 Feb 2021: Updates to the fallback channel
17 Feb 2021: Contacts and labels data added to BQ
10 Feb 2021: Temporary limitations while we do a Search infrastructure upgrade
5 Feb 2021: Snappier and easier-to-use modals
3 Feb 2021: Add media to templates
27 Jan 2021: Add media or stickers to custom replies
21 Dec 2020: A last big release to celebrate the year
2 Dec 2020: Delete a template, get more insights and send stickers via the API
17 Nov 2020: Delete a user message
23 October 2020: Insights
19 October 2020: Hidden numbers by default
8 September 2020: Contact Profile
11 August 2020: Learn in Turn
3 August 2020: Add a list to your Exact match automations
30 July 2020: Manage your message template spend
15 July 2020: Data storage and rejection reasons
10 July 2020: WhatsApp profile and Login
What is chat for impact?
Get a WhatsApp line: Step-by-step instructions, with a video
Your WABA application checklist
Display name guidelines
What is Business Verification?
Your Business Verification checklist
Help! I got an error whilst doing embedded sign-up?
Help! I'm struggling to get my business verified?
Help! I uploaded the wrong document for Business Verification?
Help! The "Start Verification" button is greyed-out?
Help! Why hasn't my display name been approved?
Help! Our display name got rejected?
Help! What happens if we're not verified within 30 days?
Help! I can see my number in Turn but it's not working?
Help! Can I have a WhatsApp number for a different country than my business registration?
Help! We are a government entity, how do we do Facebook business verification?
Help! What is a Facebook Business Manager Account?
Help! What number can I use on WhatsApp?
Help! What is a BSP?
What number do I need for my service?
Help! What is two-factor authentication (2FA)?
The WhatsApp Business Platform
Three key rules of engagement
A closer look at the WhatsApp Business API
Understanding conversation-based pricing
Message types: Session vs. Template messages
Message template rules
Message template troubleshooting
Reasons why your template(s) gets rejected
You need opt-in to initiate messages
Human escalation path required
WhatsApp's quality rating and messaging limits
Examples of how to upgrade to the next tier
Connect with your users on chat
Great ways of marketing your chat service
Use a ‘wa.me’ link and QR code to market your service
Get user consent in a WhatsApp conversation
Use automation to collect opt-in
Manage your business presence by updating your WhatsApp profile
How to use Turn.io
How to load content
How users engage with content
Structure and plan your content
Create your first menu
How to send custom replies
How to add a button message
How to upload stickers
How to delete a message that a user sent?
How to set up basic automations
The available trigger types
The available action types
How to set up advanced automations
How to set up multiple language automation
How to set up a follow-up timer
Automation tips & tricks
Triggers explained: Message received STARTS WITH...
Triggers explained: Message received EXACTLY matches...
Triggers explained: Message received does NOT exactly match...
Triggers explained: Message received is a BUTTON PRESSED...
Triggers explained: Message received is from a specific COUNTRY...
Triggers explained: Message received is AUTOMATICALLY labelled...
Triggers explained: Message received from a specific CONTACT PROFILE......
How to send stickers in automation
How to set up a sequential content delivery experience using Automation and Custom Profile Fields
How to send 'Welcome back' message to returning users
Use a follow up timer based on local time
The ABC of threads
How to create a thread
Different thread card types
How to add skip logic to your thread
How to use personalisation in threads
Start a thread when a user reply with a button.
Export your thread data
Create a sequential learning experience with Threads
How to re-connect with users using message templates
Create and submit your template(s) for approval
Send message templates to users
How to add buttons to a template
How to add media to a template
Delete or copy a template
Search and Label
Collections, Assign and Roles
How to create and use collections
How to assign or share a conversation
Search for sent or received or all messages
How to add team members?
How to log in to your account
Overview of the Turn.io user interface
Design an impactful solution
Create good chat service content
Varying interpretations of emoji
Changing behaviour is difficult. Here's some help!
Guiding and tracking
How to decide on and set up goals
How to nudge and track behaviours in conversations
Set up a data connection to BigQuery
Understand your BigQuery data and queries
Example queries for your data
Turn.io API documentation
Where do I find my credentials for the Message Template API?
How do I create message templates via the API?
Upload and send a sticker via the API
Replacing the Contact Export API
New to webhooks?
How to set up a RapidPro integration
Notify your team over email when someone needs urgent help
What is an MAU (Monthly Active User)?
Can I use Turn.io in my country?
What is Turn.io?
Can I get a free trial?
What is Google-backed?
Can I format content with bold, italics etc?
My sandbox isn't working? How do I connect?
Can I attach more than one image, audio clip, video or document to a message?
My emoji trigger isn't working?
How do I extract data out of Turn.io?
What are 'goals'?
What are 'collections'?
How to work as a team
Can I use multimedia in my messages?
Why is my video not sending?
How to setup subscription billing
What is the difference between a member and an admin?
How do I add other contact fields?
I found a bug..
Can I use WhatsApp Groups on the API?
Can you give me examples of approved message templates?
What languages are allowed for message templates?
Why has my template(s) been rejected?
How are conversations charged?
Example of user-initiated vs business-initiated conversations
Can I send a free-form message?
Are all conversations paid?
Una introducción a la WhatsApp Business API
Echar un vistazo más de cerca a la WhatsApp Business API
Tres reglas clave de participación
Tipos de mensajes: Mensajes de sesión versus plantilla
Necesita de adhesión para iniciar mensajes
Se requiere un proceso humano de escalamiento
Calificación de calidad y límites de mensajería de WhatsApp
Actualizaciones de los Términos de Servicio y la Política de Privacidad de WhatsApp
Updated by Neelke Stadler
It is incredible what you learn about your users by looking at your data.
Your WhatsApp data can be used to understand your users and their behaviour to ultimately to improve your service, both online and offline. The analysis you can do is endless, but we share a couple of example queries to help you start.
You will find great resources online, and many of your questions on how to write specific queries to answer some of your burning questions are likely already answered by online communities such as Stack Overflow. A great starting point is BigQuery's Standard SQL documentation, specifically the Functions and Operators section.
A few tips
- Create a new dataset in BigQuery, e.g. called Reporting, and save important query output that you would like to visualise to a dedicated table in your new dataset.
- This way it is easy to visualise the output (e.g. daily counts) on Data Studio by using BigQuery and selecting the specific dataset and table as the data source.
- BigQuery allows you to schedule a query refresh to ensure you have up to date data for your dashboard.
- Unique users: Count the number of unique users that have engaged with your service since the start:
select count(distinct id) from `<your number>.chats`
- Chat details: Get the latest chat details of a user without duplication:
RANK() OVER(PARTITION BY id ORDER BY updated_at DESC) as rank
from `<your number>.chats`
WHERE rank = 1
- Daily counts: Get the daily counts for active users (split between new and returning) and total messages (split between sent and received)
SELECT date(messages.inserted_at) AS day,
count(distinct chats.owner) as Daily_Active_Users,
count(distinct IF(date(chats.inserted_at) = date(messages.inserted_at), chats.owner, NULL)) as Daily_New_Users,
count(distinct IF(date(chats.inserted_at) <> date(messages.inserted_at), chats.owner, NULL)) as Daily_Returning_Users,
count(distinct messages.id) as Daily_Total_Messages,
count(distinct IF(messages.direction='inbound', messages.id, NULL)) as Daily_Received_Messages,
count(distinct IF(messages.direction='outbound', messages.id, NULL)) as Daily_Sent_Messages,
count(distinct messages.id)/count(distinct chats.owner) as Messages_per_User
FROM `<your number>.chats` as chats
LEFT JOIN `<your number>.messages` as messages ON messages.chat_id = chats.id
GROUP BY day
ORDER BY day desc
- Content: Get the number of unique users that interacted with content on your service, in descending order.
SELECT faqs.question as content_name,
count(distinct chats.id) as user_count
From `<your address>.messages` as messages
LEFT JOIN `<your address>.chats` as chats ON messages.chat_id = chats.id
LEFT JOIN `<your address>.faqs` as faqs ON messages.faq_uuid = faqs.uuid
WHERE messages.direction = 'outbound'
and messages.faq_uuid is not null
and faqs.is_deleted = false
GROUP BY content_name
ORDER BY user_count desc
- Contacts: Get the latest contact details you have for each of your users
select t.owner, t.generation, JSON_EXTRACT_SCALAR(t.fields, "$.whatsapp_profile_name") as whatsapp_profile_name, JSON_EXTRACT_SCALAR(t.fields, "$.whatsapp_id") as whatsapp_id
from(select distinct chats.owner,generation,fields, max(generation) over (partition by contact_details.contact_id) as max_generation
from `27600457382.chats` as chats
left join `27600457382.contact_details` as contact_details on chats.contact_id = contact_details.contact_id) t
where generation = max_generation