Taqnyat
Send email, SMS, and WhatsApp through Taqnyat — one provider, three channel transports.
Taqnyat is a multi-channel provider. Wire each product into its sently channel sender — do not build a mega Taqnyat client.
The one rule
Use createMailer, createSmsSender, or createWhatsAppSender with the matching sently/transports/taqnyat-* transport.
Vendor extras stay on the concrete transport instance — never on the shared channel sender.
| Channel | Transport | Import |
|---|---|---|
| SMS | TaqnyatSmsTransport | sently/transports/taqnyat-sms |
TaqnyatWhatsAppTransport | sently/transports/taqnyat-whatsapp | |
TaqnyatMailTransport | sently/transports/taqnyat-mail |
SMS
| Option | Type | Default or requirement |
|---|---|---|
bearerToken | string | required |
sender | string | required — active portal sender name (case-sensitive) |
Recipients are normalized to international digits (no + / leading 00).
Setup
import { createSmsSender } from "sently/sms";
import { TaqnyatSmsTransport } from "sently/transports/taqnyat-sms";
const taqnyat = new TaqnyatSmsTransport({
bearerToken: process.env.TAQNYAT_TOKEN!,
sender: "Taqnyat.sa",
});
const sms = createSmsSender({ transport: taqnyat });Features
Pick a branch. Channel send goes through sms; everything else is called on taqnyat.
Immediate SMS via the channel sender.
const result = await sms.send({
to: "+9665xxxxxxxx",
body: "Hello from sently",
});
console.log(result.messageId, result.response);Optional from overrides the transport sender for that send.
| Option | Type | Default or requirement |
|---|---|---|
bearerToken | string | required |
Business-initiated chats must start with an approved template. Session text is only allowed after the user replies (24h window).
Queued accepts may return statuses: "PENDING" with no message_id yet — still treated as accepted.
Setup
import { createWhatsAppSender } from "sently/whatsapp";
import { TaqnyatWhatsAppTransport } from "sently/transports/taqnyat-whatsapp";
const transport = new TaqnyatWhatsAppTransport({
bearerToken: process.env.TAQNYAT_WHATSAPP_TOKEN!,
});
const wa = createWhatsAppSender({ transport });Features
Pick a branch. Template/session send goes through wa; extras stay on transport.
Business-initiated message with an approved template.
await transport.optIn("+9665xxxxxxxx"); // once per recipient when required
const result = await wa.send({
to: "+9665xxxxxxxx",
template: {
name: "demotest1_testr11",
language: "ar",
// components: [...] // when the template has variables
},
});
console.log(result.messageId, result.response);Sandbox: recipient must be on the authorized numbers list.
| Option | Type | Default or requirement |
|---|---|---|
bearerToken | string | required |
campaignName | string | required |
from should be a sender address your Taqnyat account is allowed to use. See Sender Approval if email is not enabled in the portal yet.
Features
Transactional email via the channel mailer.
import { createMailer } from "sently/mailer";
import { TaqnyatMailTransport } from "sently/transports/taqnyat-mail";
const mailer = await createMailer({
transport: new TaqnyatMailTransport({
bearerToken: process.env.TAQNYAT_MAIL_TOKEN!,
campaignName: "sently",
}),
});
await mailer.send({
from: "noreply@example.com",
to: "person@example.com",
subject: "Hello",
text: "Hi",
// html: "<p>Hi</p>",
});Body is html when set, otherwise text (msg on Taqnyat’s API).
Account verification & sender names
Portal onboarding from Taqnyat — required before a custom SMS sender is active. Not part of the sently API; complete these in the Taqnyat portal.
Account verification
- Fill out the contract, sign it, and stamp it.
- If the organization is subject to tax, attach the tax certificate.
New sender name
| Rule | Detail |
|---|---|
| Authorization | Fill out the sender-name authorization form, sign it, and stamp it |
| Name relation | Sender name must relate to the organization; otherwise attach a supporting document that explains the link |
| Fee | SAR 230, renewed annually |
| Service name | Max 11 characters |
| Promotional name | Max 8 characters, with -AD appended at the end |
| Dual registration | Names ≤ 8 characters can be registered as both service and promotional for one SAR 230 fee (counts as one name) |
Tip
Use the Senders tab above (listSenders) after registration to confirm the name is active before hard-coding sender.
Troubleshooting
Open the Senders branch and call listSenders(), or use an active portal sender exactly as shown (trial accounts often use Taqnyat.sa).
Custom names need portal registration first — see Account verification & sender names.
Add the destination under Manage WhatsApp → Sandbox, then use the Opt-in branch before business-initiated templates.
Use the Templates branch (listTemplates) and pick status approved — name + language must match exactly.
Taqnyat rejected the from address. Confirm email is enabled and the sender is approved, then retry with that address.
Developers → Security Settings: authorize your public IP or turn off the IP allowlist.
No. Use the matching sently channel sender; open a feature branch above for vendor extras on the transport.
Contact & resources
Provider contact details from Taqnyat (account setup, packages, and platform guides).
| Contact | Detail |
|---|---|
| Unified number | 920015404 |
| Support email | support@taqnyat.sa |
| Point of contact | a.ghaith@taqnyat.sa |
| Packages & pricing | Offers & packages |
| Platform explanations | Technical explanations |
API reference: SMS, WhatsApp, Verify, Mail.
Learn more
- Email channel — mailer options and send pipeline
- Sms channel — SMS sender options
- Whatsapp channel — template and session text
- Vendor OTP extras — OTP helpers on concrete transports