CRM SMS Integration: Connect Your CRM to an SMS API in Ghana and Africa

CRM SMS Integration: Connect Your CRM to an SMS API in Ghana and Africa

CRM SMS integration: a CRM contact record sends an SMS through an API to a customer's phone, and the delivered status returns to the contact

Your CRM knows when a lead arrives, a deal closes or an invoice falls due. If your team still copies those phone numbers into an SMS portal by hand, CRM SMS integration is the fix: the CRM sends the text itself and records whether it was delivered.

For teams in Ghana and across Africa, the practical route usually runs through an SMS API, because the texting built into HubSpot and Zoho CRM is tied to other countries. You can have the connection working in a sandbox before a single customer receives a message.

What is CRM SMS integration?

CRM SMS integration connects your customer relationship management (CRM) system to an SMS gateway, so that an event in the CRM sends a text automatically. A new lead gets a welcome message, a won deal triggers onboarding steps, and the delivery result lands back on the contact record.

You will also see it called SMS CRM integration. It is the same job in either word order.

The connection can live in one of four places:

  • Inside the CRM, as a built-in texting feature.
  • In a no-code connector, such as Zapier, Make or n8n, sitting between the CRM and an SMS provider.
  • In a small service you host, which receives the CRM’s event and calls an SMS API directly.
  • In a CRM where messaging is part of the product, so there is less to connect.

Why send SMS from the CRM instead of by hand?

The CRM already holds the three things every message needs: who the customer is, what just happened, and whether they agreed to hear from you. When someone re-types that into a separate portal, you get delays, mistyped numbers and texts sent to people who opted out.

Automation removes the copy step. The CRM decides when to send, the SMS API sends, and the delivery status comes back to the record your sales or support team already reads.

SMS works alongside email rather than replacing it. Email suits longer content a customer reads later, while SMS suits short, time-bound messages such as a reminder the day before an appointment. Our comparison of CRM vs email marketing covers where each channel fits.

Common CRM SMS triggers:

  • Appointment reminders: a text the day before a booked meeting or service visit.
  • Order and payment updates: dispatch, delivery and payment confirmations drawn from CRM fields.
  • Sales follow-up: a booking link sent shortly after a lead fills in a form.
  • Payment reminders: invoice due dates in the CRM become scheduled reminders.
  • Re-engagement: a message to contacts whose last activity date passes a threshold you set.

Where does SMS fit in the customer journey?

Map each SMS touchpoint to a lifecycle stage before you build anything. Texts arrive next to personal messages, so keep them for moments where speed and clarity matter.

Lifecycle stageCRM triggerSMS use case
AcquisitionNew lead createdWelcome text with a link to book a call
QualificationLead moved to “Qualified”Rep introduction with a scheduling link
NurtureDeal stage is “Proposal Sent”Follow-up nudge a day or two later
ConversionDeal marked “Won”Onboarding text with next steps
RetentionLast activity date passes your thresholdRe-engagement offer
SupportTicket status is “Resolved”Short satisfaction survey link
Win-backContact stage is “Churned”Personalised return offer

Each row is one CRM event you will connect to the SMS API in the steps below. For how this mapping relates to marketing automation tools, see the difference between CRM and marketing automation. For more event ideas, see our guide to which customer events make good SMS triggers.

Does your CRM’s built-in SMS work in Ghana?

Check the vendor’s own documentation before you plan around a built-in SMS feature. For two widely used CRMs, it is tied to other countries.

CRMWhat the vendor’s documentation saysWhat it means for a team in Ghana
HubSpotSMS is a paid add-on, and messages can only be sent from US-based numbersPlan to connect HubSpot to an SMS provider that sends in your market
Zoho CRMBuilt-in Notification SMS is supported only for companies registered in IndiaA Ghana-registered company falls outside this feature
SalesforceFlow Builder’s HTTP Callout action connects a flow to an external API without codeAn admin can call an SMS API from a flow
PipedriveAutomations can send a webhook to an external endpoint, on Advanced and higher plansCheck your plan before you design the flow

What HubSpot, Zoho, Salesforce and Pipedrive document

HubSpot. HubSpot’s guide to setting up SMS messaging describes marketing SMS as a paid add-on for Marketing Hub Professional or Enterprise, and states that you can only send SMS messages from US-based numbers.

Zoho CRM. Zoho’s Notification SMS overview says the feature is currently supported only for companies registered in India, sending transactional SMS to customers in India. That covers Zoho’s built-in Notification SMS only, so check what other SMS options your Zoho edition offers.

Salesforce. Salesforce Help describes HTTP Callout as a way to connect flows to external APIs without coding. You set up authentication first under Setup, in Named Credentials.

Pipedrive. Pipedrive’s knowledge base explains that the webhook action in Automations sends information to external endpoints, and that automations and webhooks are only available on Advanced and higher plans at the time of writing.

If your CRM is not listed, open its automation settings and look for an action that sends data to an external URL. That action, often called a webhook, is what the integration steps below plug into.

Still choosing a CRM? Our guide to the best CRM for small businesses in Africa compares the options.

Three ways to set up CRM SMS integration

Path 1: Built-in CRM SMS

You buy SMS from the CRM vendor and send from inside the CRM. It needs no code.

Best for: teams whose CRM vendor sends to the numbers they text. Confirm that first, using the table above.

Path 2: A no-code connector (Zapier, Make, n8n)

The CRM fires an event, the connector catches it, and the connector calls your SMS provider’s API.

Best for: marketing and operations teams without a developer who want triggered SMS running quickly.

Watch for: how the connector bills as your send volume grows, and whether it can receive the delivery callback as a second flow, so the status reaches the CRM.

Path 3: A direct webhook to an SMS API

The CRM posts a webhook to a handler you host. The handler checks consent and sending hours, calls the SMS API, and writes the delivery status back to the CRM.

Best for: teams with a developer who want full control over consent checks, sending windows, duplicate protection and status logging.

Which path fits your team?

Comparison of three CRM SMS integration paths: built-in CRM SMS, a no-code connector and a direct SMS API, by code needed, delivery status, consent rules and best fit
Built-in CRM SMSNo-code connectorDirect API
Code neededNoneLittle or noneA hosted handler
Who delivers the SMSThe CRM vendor’s SMS serviceThe SMS provider you connectThe SMS provider you connect
Delivery status on the contactDepends on the vendorNeeds a second flow for the callbackYour handler writes it
Consent and send-window rulesWhat the CRM’s settings allowFilter steps in the connectorYour own code

A fourth option removes the connection step altogether: a CRM with messaging built in.

How to integrate an SMS API with your CRM

How to integrate an SMS API with your CRM in five steps: pick the trigger, send the event, call the SMS API, receive the delivery status, write it to the contact

A CRM SMS integration follows the same flow whichever CRM you run. Here it is with the Arkesel SMS API as the sending side.

  1. Pick the trigger. Choose one event from your lifecycle map, such as a deal moving to “Won”, and add a condition that the contact’s SMS consent field is true.
  2. Send the event out of the CRM. Use the CRM’s webhook or HTTP action, such as Salesforce’s HTTP Callout or Pipedrive’s Automations webhook, to post the contact and deal details to your handler or connector.
  3. Call the SMS API. Send sender, message and recipients, plus a callback_url for delivery status. The Arkesel API documentation limits the sender field to 11 characters including spaces, and anything longer makes the message fail, so never map a long company-name field straight into it.
  4. Receive the delivery status. The send response is not a delivery receipt. Arkesel pushes each recipient’s status to your callback_url with two query parameters, sms_id and status, with values such as DELIVERED, SUBMITTED, PROHIBITED, QUEUED, NOT_DELIVERED and EXPIRED. Exempt that URL from any login or authentication in your application, or the notifications fail.
  5. Write the status to the contact. Update a CRM field or add a note, such as “SMS delivered” or “SMS not delivered”, so the rep sees the result where they already work.

Before you go live, send with sandbox set to true. Sandboxed sends are not billed and are not forwarded to the mobile networks, so you can confirm the CRM trigger fires and your handler builds the right request without texting a real customer. Our bulk SMS API guide for developers in Ghana covers handling delivery callbacks on your own server in more depth.

Ready to try it with your own CRM? Check every trigger in sandbox mode before a customer sees a message. Explore the Arkesel SMS API.

What to look for in an SMS API for CRM integration

When you compare options for the best SMS API for CRMs, check five things:

  • Per-recipient delivery callbacks, so every contact record can show what happened to its message.
  • A sandbox, so you can test triggers without sending or paying for live messages.
  • Clear sender ID rules, including length limits you can enforce in your field mapping.
  • Billing you can predict from CRM data. Arkesel bills SMS per segment. One character outside the standard SMS character set, such as an emoji in a customer’s name field, switches the message to Unicode and cuts capacity from 160 to 70 characters per segment, which multiplies the charge.
  • Coverage where your customers are. The Arkesel SMS Platform serves Ghana, Nigeria, South Africa and Tanzania.

Using a no-code connector instead

If you are not writing code, the same five steps apply inside the connector:

  1. Connect your CRM as the trigger app and choose the event, such as “Deal updated”.
  2. Add a filter step for the stage and the SMS consent field.
  3. Add an HTTP request step pointing at the SMS API, with sender, message, recipients and callback_url in the JSON body.
  4. Map CRM fields into the message, keeping an eye on message length.
  5. If your connector offers an incoming-webhook trigger, use it as the callback_url in a second flow that writes the status back to the CRM.

A worked example: CRM webhook to the Arkesel SMS API

The Node.js handler below is a minimal CRM SMS integration. It receives a CRM webhook, normalises the phone number to the 233 format, runs consent, send-window and duplicate checks, and calls the Arkesel SMS API. A second route receives the delivery status and writes it to the CRM. Keep your API key in an environment variable, never in code.

// crm-sms-handler.js (Node.js 18+, Express)
import express from "express";

const app = express();
app.use(express.json());

const ARKESEL_SMS_URL = "https://sms.arkesel.com/api/v2/sms/send";
const API_KEY = process.env.ARKESEL_API_KEY;
const SENDER_ID = process.env.ARKESEL_SENDER_ID; // 11 characters max, including spaces
const STATUS_URL = process.env.SMS_STATUS_URL; // public URL of the /sms/status route below
const SANDBOX = process.env.ARKESEL_SANDBOX === "true";

// Normalise Ghanaian numbers to 233XXXXXXXXX: handles "024 123 4567", "+233 24...", "233..."
function normaliseGhanaPhone(raw = "") {
  let digits = String(raw).replace(/[^\d]/g, "");
  if (digits.startsWith("00233")) digits = digits.slice(2);
  if (digits.startsWith("0") && digits.length === 10) digits = "233" + digits.slice(1);
  return digits;
}

// Ghana promotional window: 8.00 a.m. to 7.00 p.m., and no Sundays
function insideGhanaPromoWindow(now = new Date()) {
  const parts = new Intl.DateTimeFormat("en-GB", {
    timeZone: "Africa/Accra",
    hour: "numeric",
    hourCycle: "h23",
    weekday: "short",
  }).formatToParts(now);
  const hour = Number(parts.find((p) => p.type === "hour").value);
  const weekday = parts.find((p) => p.type === "weekday").value;
  return weekday !== "Sun" && hour >= 8 && hour < 19;
}

app.post("/crm/webhook", async (req, res) => {
  const { contact, deal, messageType } = req.body; // "promotional" or "transactional"

  // 1. Consent first: only message opted-in contacts
  if (!contact?.sms_consent) {
    return res.status(200).json({ skipped: "no_consent" });
  }

  // 2. Normalise the number BEFORE any check, so no Ghanaian number skips the send window
  const phone = normaliseGhanaPhone(contact.phone);
  if (messageType === "promotional" && phone.startsWith("233") && !insideGhanaPromoWindow()) {
    await queueForNextWindow(contact, deal); // your scheduler
    return res.status(200).json({ queued: "outside_send_window" });
  }

  // 3. Idempotency: a retried webhook must not send twice
  const key = `${contact.id}:${deal.id}:${deal.stage}`;
  if (await alreadySent(key)) {
    return res.status(200).json({ skipped: "duplicate" });
  }

  // 4. Send through the Arkesel SMS API
  const response = await fetch(ARKESEL_SMS_URL, {
    method: "POST",
    headers: { "api-key": API_KEY, "Content-Type": "application/json" },
    body: JSON.stringify({
      sender: SENDER_ID,
      message: `Hi ${contact.first_name}, your proposal is ready: ${deal.link}`,
      recipients: [phone],
      callback_url: STATUS_URL,
      sandbox: SANDBOX,
      // Sending to Nigerian numbers? Specify the use_case field (see the API docs).
    }),
  });
  const result = await response.json();

  // 5. This response is not a delivery receipt. Store each message id against the contact.
  if (result.status !== "success") {
    await logToCrm(contact.id, `SMS request failed: ${result.message}`);
    return res.status(502).json({ sent: false });
  }
  for (const item of result.data.filter((d) => d.id)) {
    await saveMessage(item.id, contact.id); // your storage
  }
  await markSent(key);
  await logToCrm(contact.id, "SMS submitted, waiting for delivery status");
  return res.status(200).json({ submitted: true });
});

// 6. Delivery status arrives here as ?sms_id=...&status=...
app.all("/sms/status", async (req, res) => {
  const { sms_id, status } = req.query;
  const contactId = await findContactByMessage(sms_id); // ignore ids you never stored
  if (contactId) {
    await logToCrm(contactId, `SMS status: ${status}`);
  }
  res.sendStatus(200);
});

app.listen(3000);

Three details matter here:

  • Consent runs before anything else. A contact without SMS consent never reaches the send call.
  • Delivery status comes from the callback, not the send response. The sms_id in each callback is the id attached to that message in the send response, which is why the handler stores those ids against the contact.
  • The status route sits outside your login. Because it cannot require authentication, it only acts on sms_id values your handler stored and ignores the rest.

The queueForNextWindow, alreadySent, markSent, saveMessage, findContactByMessage and logToCrm functions are yours to write against your own database and CRM. For the full request and response reference, see our walkthrough on how to send SMS via the Arkesel API.

What about two-way SMS in a CRM?

Sender ID SMS in a CRM is one-way: replies are not received, so use a preferences link for opt-outs and WhatsApp for conversations

Two-way SMS means customer replies come back into the CRM. A number that can receive texts takes the reply, the SMS provider forwards it to your system, and the CRM matches the sender’s phone number to a contact, adds the reply to that contact’s history and assigns it to an agent.

It only works if your SMS provider receives replies and passes them on. Ask about that before you design any reply-based flow.

Arkesel SMS sent from a sender ID is one-way. It does not receive replies, and it does not forward replies or STOP messages to a webhook, so do not build a flow that waits for a customer to text back.

That shapes two decisions:

  • Opt-outs. Do not tell customers to “Reply STOP” to a sender ID message. Give them a way to opt out that does not depend on replying, such as a link to a preferences page, and write the result to the CRM consent field.
  • Conversations. When a customer needs to answer you, invite them to a channel built for replies, such as WhatsApp. Our guide to the WhatsApp Business API in Africa explains how to set that channel up.

The fourth path: a CRM with messaging built in (KOVA IQ)

Every path above connects two separate systems. The alternative is a CRM where messaging is part of the product.

KOVA IQ is Arkesel’s messaging-first CRM and customer engagement platform. It runs Arkesel SMS campaigns and WhatsApp broadcasts from the same customer data, so there is no separate SMS-to-CRM connection to build for your campaigns.

What that gives you:

  • SMS and WhatsApp campaigns from one contact list, with consent gating on every send and per-recipient cost estimation before you send.
  • Hosted unsubscribe links for campaign opt-outs.
  • Seven prebuilt plays: welcome, post-purchase, win-back, cart-abandon, birthday, post-demo and lead-stuck.
  • Auto-pause on delivery-failure or negative-sentiment signals.
  • One inbox for WhatsApp, Facebook Messenger, Instagram DM, Telegram and website live chat, with those conversations kept on a timeline-first customer profile alongside tickets, leads, notes and files.

SMS in KOVA IQ is for campaigns. Inbound SMS replies are not captured in KOVA IQ, so the conversation history on each customer profile comes from the inbox channels listed above.

If you keep another CRM as your main record, KOVA IQ also has its own API. The Arkesel API specification describes programmatic access to KOVA IQ’s ticketing and customer management, authenticated with an X-API-Token header, including an endpoint that retrieves all messages for a specific customer.

When does the integration route still make more sense? When your business is committed to a CRM such as Salesforce or HubSpot and you need SMS to fire from that system of record. In that case, the connector and direct API paths above are the right fit.

Compliance and costs to build into your CRM SMS integration

Consent. Only message contacts whose CRM record shows explicit SMS opt-in. Use one field, such as sms_consent, across every form, import and integration, and never infer SMS consent from an email opt-in. In KOVA IQ, consent gating is enforced on every send.

Opt-outs. Check the consent field before every send, and update it as soon as a customer opts out through your link, your team or any other channel.

Sending hours in Ghana. Ghana’s National Communications Authority tells consumers they should receive promotional messages only from 8.00 a.m. to 7.00 p.m., and that promotional messages should not be sent to them on Sundays.

Build that window into your handler for promotional sends to Ghanaian numbers, and check the rules for each other market you send to. Our overview of bulk SMS regulations in Ghana covers the wider rules.

Sender ID. Set up your sender ID with your SMS provider well before launch, and keep the sender field within its length limit when you map CRM fields.

Duplicates. A CRM workflow that fires twice must not send two texts. Build idempotency keys from stable identifiers: contact ID, deal ID and trigger event.

Delivery logging. Write every delivery status back to the contact record. A status that lives only in a separate dashboard never reaches the rep talking to the customer.

Costs. Because SMS is billed per segment, long messages and non-standard characters pulled from CRM fields raise the cost of each send. Keep templates short and clean up name fields before they reach the message. See current Arkesel pricing for rates in your market.

Frequently asked questions

What is CRM SMS integration?

CRM SMS integration connects your CRM to an SMS gateway so that events in the CRM, such as a new lead or a won deal, send a text automatically. A complete integration also writes each message’s delivery status back to the contact record.

How do I integrate an SMS API into my existing CRM or ERP system?

Use the system’s automation or webhook feature to post an event to a handler or no-code connector. The handler checks consent, calls the SMS API with a callback_url, and writes the delivery status it receives back to the record. Test the whole flow in sandbox mode first.

What’s the best way to integrate SMS into my existing software?

If you have a developer, a direct webhook to an SMS API gives you the most control over consent, sending hours and status logging. Without one, a no-code connector running the same steps is the faster start.

Can HubSpot send SMS messages to customers in Ghana?

HubSpot’s own SMS is a paid add-on, and HubSpot states that messages can only be sent from US-based numbers. To text customers in Ghana through a local SMS provider, connect HubSpot to an SMS API using the steps in this article.

Does Zoho CRM have built-in SMS?

Zoho CRM’s built-in Notification SMS is currently supported only for companies registered in India. A company registered in Ghana needs another route, such as connecting Zoho CRM to an external SMS API.

How do I get SMS delivery reports back into my CRM?

Include a callback_url when you send. Arkesel pushes each recipient’s delivery status to that URL as sms_id and status query parameters. Match the sms_id to the id you stored from the send response, then update the contact record.

What hours can I send promotional SMS in Ghana?

Ghana’s National Communications Authority tells consumers they should receive promotional messages only from 8.00 a.m. to 7.00 p.m., and not on Sundays. Build that window into your CRM triggers for promotional sends.

What is two-way SMS in a CRM?

Two-way SMS brings customer replies back into the CRM and attaches them to the contact’s history. It needs an SMS service that receives replies and forwards them to your system. Arkesel SMS sent from a sender ID is one-way, so use a reply channel such as WhatsApp when you need customers to answer.

How does a CRM with SMS integration improve response times compared to email-only platforms?

It removes the wait between a CRM event and the customer hearing about it: the text goes out when the trigger fires, with no one copying details into another tool. SMS also lands directly on the customer’s phone, which suits short, time-bound messages, while email remains the better fit for longer content.

Do I need a developer to connect SMS to my CRM?

Not always. Built-in CRM SMS and no-code connectors need little or no code. A direct webhook-to-API integration needs a developer to host and monitor the handler.

How much does CRM SMS integration cost?

It depends on the path. Built-in CRM SMS can be a paid add-on, as HubSpot’s is, and a connector has its own charges to check at your volume. A direct API integration needs build and hosting work instead.

SMS itself is billed per segment, so message length and characters matter. See the Arkesel pricing page for your market.

Related articles

Start integrating SMS with your CRM

Start your CRM SMS integration with one trigger: connect it to the SMS API, and make sure the delivery status comes back to the contact. Build consent and Ghana’s promotional sending hours in from the first send.

Create an Arkesel account to get your API key and test your first CRM trigger in the sandbox. New accounts receive free credits for SMS.

Prefer to run campaigns and customer records in one place? Talk to our team about KOVA IQ.

Scroll to Top