Wow! Build your WhatsApp integration. Start free. Register Now
School staff briefing · WhatsApp API use case

Daily LMS staff digest in WhatsApp after school

One responsible staff member can read that day's operational picture in WhatsApp instead of opening the LMS. After school hours your scheduler can query the database, compile a short text, and send it through Whapi.Cloud. This use case shows integrators how to implement that flow through the WhatsApp API.

Text only, not charts or PDFs One staff private chat
School operations dashboard beside a phone whose WhatsApp chat shows a short nightly staff summary after school hours.
Use case

When to use this flow

The trigger is a daily schedule after school

Use this flow when a daily scheduler task runs after school hours, not on every LMS row change in real time.

The digest comes from LMS or database data

Use this flow when own_backend queries the LMS or database and compiles counts or alerts, not when you only poll WhatsApp message history.

One responsible staff member in a private chat

Use this flow when one responsible employee should get the brief in a private chat, not when teachers share a group roster update.

WhatsApp chat on a phone showing a short nightly staff summary message after school hours.
Customer experience

Staff see the day in chat

Daily operational signals stay inside the LMS until someone opens dashboards, so leadership learns about gaps or backlog late.

After the flow runs, the responsible staff member opens WhatsApp and reads a short summary of that day's operational picture. Integrators build this result with the WhatsApp API.

Workflow

Send the nightly brief into chat

1

The daily scheduler runs after school

Your scheduler fires after school hours. A worker queries the LMS or database and builds the text body for that day.

2

Send the staff text brief

POST /messages/text

sendMessageText delivers the compiled summary to the responsible staff member. Put the staff phone in to and the digest in body.

Need delivery tracking? A successful API response does not mean the staff member already has the brief. Learn about delivery status →

Prerequisites

Before you run the flow

Connect the WhatsApp number that sends the nightly brief, and authenticate every request with that number's API token. The LMS query, schedule, and text compilation stay on your backend.

Optional — go deeper for this flow

API implementation

One call sends the brief

This call is the check-in. It puts the compiled LMS digest into the responsible staff member's private chat for that evening.

Get your API token for free after you register on whapi.cloud, and use that token in the code instead of Your_Token from the examples.

Send the staff text brief

Send the nightly operational text brief to the responsible staff member so leadership sees that day's picture without opening the LMS.

curl --request POST \
     --url https://gate.whapi.cloud/messages/text \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token' \
     --header 'content-type: application/json' \
     --data '
{
  "to": "447123456789",
  "body": "Today: 12 absences, 3 late arrivals, 2 open tickets."
}
'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/messages/text",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\"to\":\"447123456789\",\"body\":\"Today: 12 absences, 3 late arrivals, 2 open tickets.\"}",
  CURLOPT_HTTPHEADER => [
    "accept: application/json",
    "authorization: Bearer Your_Token",
    "content-type: application/json"
  ],
]);

$response = curl_exec($curl);
curl_close($curl);
echo $response;
import requests

url = "https://gate.whapi.cloud/messages/text"
payload = {
    "to": "447123456789",
    "body": "Today: 12 absences, 3 late arrivals, 2 open tickets."
}
headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token",
    "content-type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)
print(response.text)
const response = await fetch('https://gate.whapi.cloud/messages/text', {
  method: 'POST',
  headers: {
    accept: 'application/json',
    authorization: 'Bearer Your_Token',
    'content-type': 'application/json',
  },
  body: JSON.stringify({
    to: '447123456789',
    body: 'Today: 12 absences, 3 late arrivals, 2 open tickets.',
  }),
});

console.log(await response.text());
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"to\":\"447123456789\",\"body\":\"Today: 12 absences, 3 late arrivals, 2 open tickets.\"}");
Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/messages/text")
  .post(body)
  .addHeader("accept", "application/json")
  .addHeader("authorization", "Bearer Your_Token")
  .addHeader("content-type", "application/json")
  .build();

Response response = client.newCall(request).execute();
using RestSharp;

var options = new RestClientOptions("https://gate.whapi.cloud/messages/text");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
request.AddHeader("content-type", "application/json");
request.AddJsonBody(new { to = "447123456789", body = "Today: 12 absences, 3 late arrivals, 2 open tickets." });
var response = await client.PostAsync(request);

Console.WriteLine("{0}", response.Content);
package main

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
)

func main() {
	body := []byte(`{"to":"447123456789","body":"Today: 12 absences, 3 late arrivals, 2 open tickets."}`)
	req, _ := http.NewRequest("POST", "https://gate.whapi.cloud/messages/text", bytes.NewReader(body))
	req.Header.Set("accept", "application/json")
	req.Header.Set("authorization", "Bearer Your_Token")
	req.Header.Set("content-type", "application/json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	out, _ := io.ReadAll(res.Body)
	fmt.Println(string(out))
}
Delivery

Know when the brief arrived

A successful send response does not mean the staff member already has the brief. The first status visible before a webhook is pending. Later status changes arrive only on statuses.post and statuses.put. If the status stays pending and does not move to sent, delivered, or a later ack, the message was not delivered. Check the payload and the account's permission to send that type.

  • A response from sendMessageText is not proof the staff member has the brief.

  • pending that never moves on means the brief was not delivered.

  • Watch statuses.post and statuses.put for later acks.

  • Enable webhooks if your worker should retry when delivery never completes.

What to read on delivery and webhooks

Contact our support if something went wrong
When things break

Handle failures at each step

If the LMS query fails, the worker skips the send, or the text is not delivered, retry the task or alert backup staff and do not mark the check-in complete.

Scheduler ran, but the check-in failed?

The LMS query can fail before any send, or sendMessageText can be rejected or not delivered after the digest was ready. Retry the worker task or alert backup staff, and do not mark the check-in complete. If the nightly check-in still fails after a retry, contact Whapi support with the channel id and the failed send response.

Contact our support if something went wrong

Troubleshoot by API step

Status What it means What to do
400 Wrong request parameters Wrong request parameters — check to and body on the send payload.
401 Need channel authorization for send message
402 Trial version limit exceeded
403 It is forbidden to send to this group/recipient It is forbidden to send to this recipient — confirm the staff phone or chat id and channel permissions.
429 Too many requests
500 Internal Error
FAQ

Questions integrators ask

No. This flow sends one nightly text brief to a responsible staff member. Charts, PDFs, and parent reachability checks belong to a separate multi-format parent flow.
No. This flow targets one staff private chat. Group coordination alerts use a teacher group JID and are a separate scenario.
If the LMS query fails, the worker skips the send, or the text is not delivered, retry the task or alert backup staff and do not mark the check-in complete.
No. You compile custom text from your LMS data and send it with sendMessageText. The send does not wait on a pre-approved template, and it does not add a per-template charge for that message.
On your backend. The catalog Whapi step is only sendMessageText. Scheduling, Redis or Celery workers, and database queries stay in own_backend.
Supported WhatsApp Features

Everything you need to build WhatsApp automation

Whapi.Cloud gives you access to a complete set of WhatsApp features — messaging, media, groups, channels, webhooks and more. Build bots, automations and integrations without feature limitations.

Chosen by developers

Trusted by 3,300+ developers and SaaS teams

Developers worldwide rely on Whapi.Cloud to build automations, bots, CRM integrations, bulk messaging tools and advanced WhatsApp workflows. Our infrastructure processes millions of API requests with high stability — and grows every month.

Icon of feature

5,5K+

active API channels

Icon of feature

21M+

API requests processed monthly

“Everything is simple, intuitive and easy to navigate. The docs are clear, and all the info I need is right on the screen. Great job.”

roberto k. / Web Developer

“We connected WhatsApp to our workflows using n8n in just a few minutes. No code, no complications- everything worked on the first try.”

Martin p. / Developer

“Whapi.Cloud became a key part of our customer communication. We automated product updates, order notifications and support messages without needing Meta templates or approvals”

Oscar T. / CTO

Decorative bubble