Instagram Direct for business

Your messages, your stories, your comments: one inbox

Sparrow Instagram connects your professional account to an inbox shared by your teams: direct messages, story replies and comments all arrive in the same place, routine requests answer themselves, and the history stays attached to the contact in your CRM.

Messages, stories and comments together Automated replies Conversational selling
sparrow.store
Professional account · Replies within minutes
Today
Replied to your story
Is the beige one available in a 42?18:20
Yes, in 42 and 43! Shall I send you the order link?18:21
Yes please 🙌18:21
3 minaverage reply
68 %handled automatically
5 300messages/month
94 %satisfaction
What you can do

One channel, five ways to convert your audience

Click a use case to see in detail how Sparrow Instagram sets it up for your business.

Everything that reaches the account, on one screen

On Instagram a sales enquiry takes three forms: a direct message, a story reply, a comment under a post. They arrive here in the same inbox, assigned to an agent, tagged and tracked — with the contact's full history in view.

  • Direct messages, story replies and mentions brought together
  • Automatic assignment by queue, by tag or round-robin
  • Internal notes the customer never sees, mentions between colleagues
  • Saved replies, inserted in two keystrokes
  • Handover between agents without losing the thread
  • First response time and resolution time measured
Shared inbox
3 agents online
Replied to your story
How much is the beige bag?18:20
MAD 890, free delivery over MAD 500 🙂18:20
3 min1st reply
24open
3agents

The story creates interest, the message converts it

A well-watched story produces dozens of replies that get lost in someone's phone. Here, each one opens an identified conversation with the story that triggered it. The same goes for comments: a public reply under the post, and a private message to continue.

  • Story replies attached to the post concerned
  • Automatic reply to keywords in a comment
  • Private message sent from a comment, in one click
  • Public reply and private message recorded together
  • Story mentions of your account brought into the inbox
  • Moderation of unwanted comments on your posts
Story reply
New collection
Replied to your story
So beautiful 😍 how much is it?20:41
Thank you! MAD 890, sizes 38 to 42 still available.20:42
312story replies
41 %converted
2 mindelay

The catalogue moves into the conversation

On Instagram the sale is often closed in the private message: the customer asks for a size, a price, availability, and expects an immediate answer. Your agents send the images, check stock and pass on a payment link, without switching tools.

  • Sending photos, videos and product sheets in the conversation
  • Live stock lookups in your catalogue
  • Payment or order link sent in the message
  • Basket carried from one conversation to the next, even days apart
  • Abandoned basket follow-up within the permitted window
  • Order pushed into your management system
Conversational sale
Basket MAD 1,240
I'll take the beige one in a 4218:26
Perfect! Here is your order link: sprw.ma/c/4521 — delivery within 48 hours.18:26
1 240 DHbasket
18 %conversion
48 hdelivery

What comes up every day no longer has to be written

Price, sizes in stock, delivery time, shop address: these questions make up most of the volume. A guided journey answers them instantly and hands over as soon as the request falls outside the script. Your applications, meanwhile, write directly through the API.

  • Ice breakers and quick replies shown on opening
  • Automatic answers to the most frequent questions
  • Handover to a human agent on request, or after two misunderstandings
  • Token-authenticated REST API, one token per application
  • Webhook on every inbound message and every story reply
  • Test environment separate from production
API call
POST /instagram/send/one
{ "recipient": "178...", "text": "Order 4521 shipped" }
{ "code": "OK", "result": { "message_id": "8f21c4" } }
140 msresponse
OKcode
1message

What your conversations say about your account

Every conversation carries its first response time, its source — message, story, comment, ad — and its outcome. You can see which posts generate enquiries, which hours are understaffed, and which questions would be worth answering automatically.

  • First response and resolution times, by agent
  • Conversation source: message, story, comment, ad
  • Posts and stories ranked by the enquiries they generate
  • Share of conversations resolved without a human
  • CSV export and automatic weekly report
  • Metrics pushed to your reporting tool via API
Weekly report
Week 33
5,314 conversations · 3,613 handled without an agent
Source: 46% stories · 33% messages · 21% comments
5 314conversations
68 %auto
3 min1st reply
Use cases

The different business uses of Instagram

One channel, different rules: within twenty-four hours of a customer's message you write freely; beyond that, only a human agent may resume the conversation, and only for a limited time.

Direct messages

Questions, complaints and price enquiries handled by your agents from a shared inbox.

24-hour window

Story replies

Every reaction to a story opens a conversation attached to the post that triggered it.

Story attached

Comments turned into messages

A comment gets a public reply and a private message to continue.

Public and private

Automated replies

Price, sizes, delivery times, address: a guided journey answers without involving anyone.

Available 24/7

Conversational selling

Images, stock and a payment link passed on in the conversation, right through to the order.

Catalogue built in

Click-to-Direct ads

The ad opens a private message instead of a landing page, and the source stays attached to the contact.

Campaign source kept

Story mentions

A customer who mentions your account appears in the inbox; you thank them or reshare.

Built-in monitoring

Human agent handover

Beyond twenty-four hours, an agent can resume the conversation for seven days.

Human agent tag

Reviews and customer feedback

After a purchase, a review request sent within the permitted window, with no nagging.

Within the permitted window
Features

Everything you need to reply, and to sell

The shared inbox, automation and the API in one subscription, with no extra tool to plug in.

Unified inbox

Direct messages, story replies, mentions and comments on one screen, assigned, tagged and tracked. Internal notes and handover without losing the thread.

Automated journeys

Ice breakers, quick replies and keyword replies on comments. Routine requests settle themselves and an agent takes over whenever needed.

Unified contact record

The Instagram profile, the conversation history and your CRM data on one screen. The agent knows who they are talking to before replying.

Response windows under control

The platform shows how long you have left to reply freely and flags when a human agent handover becomes necessary. No Meta rule broken by accident.

Conversation analytics

First response time, contact source, the posts that generate the most enquiries. CSV export, weekly report, API feed.

REST API and webhooks

Your applications send and receive messages without going through the interface. One token per application, a test environment, and examples in the main languages.

Integration

One HTTP request, and the message goes out on Instagram

No proprietary library to install. The REST API is called from any language, and the shared inbox remains available for conversations handled by your agents.

Authentication — a call to POST /api/v1/login with your credentials returns a token (api_token) that you then place in the Authorization: Bearer {api_token} header of every request. One account can hold several applications, each with its own token: statistics stay separate, application by application.
OperationMethodURL
Get a tokenPOSThttps://app.sparrowmessage.com/api/v1/login
Send a messagePOSThttps://app.sparrowmessage.com/api/v1/instagram/send/one
Receive a messagePOST inboundhttps://your-site.com/sparrow/webhook
Message statusPOSThttps://app.sparrowmessage.com/api/v1/instagram/status
Status of a listPOSThttps://app.sparrowmessage.com/api/v1/instagram/status/bulk
PHP Python Node.js .NET Java Ruby WordPress Odoo Salesforce HubSpot Shopify PrestaShop WooCommerce Zapier SEMS SEMS Amplitude HR Amplitude HR

1 — Get the token, then send a message.

<?php
$base = 'https://app.sparrowmessage.com/api/v1';

// — Authentication: keep the token, don't request a new one for every send
$ch = curl_init("$base/login");
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Accept: application/json', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS     => json_encode([
        'email'    => 'you@company.com',
        'password' => 'your-password',
    ]),
]);
$token = json_decode(curl_exec($ch), true)['api_token'];
curl_close($ch);

// — Send a message
$ch = curl_init("$base/instagram/send/one");
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => [
        'Accept: application/json',
        'Content-Type: application/json',
        "Authorization: Bearer $token",
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'recipient'     => '718294106203941',
        'text'      => 'Your verification code is 385 214.',
        // Optional: Sparrow will post status changes here
        'notifyurl' => 'https://your-site.com/sparrow/status',
    ]),
]);
$reponse = json_decode(curl_exec($ch), true);
curl_close($ch);

// Every response carries a code field: OK or KO
echo $reponse['code'] === 'OK' ? "Message envoyé\n" : "Échec : {$reponse['error']}\n";

Single send, then bulk send.

import requests

base = 'https://app.sparrowmessage.com/api/v1'

# — Authentication
token = requests.post(f'{base}/login', json={
    'email': 'you@company.com',
    'password': 'your-password',
}).json()['api_token']

headers = {'Authorization': f'Bearer {token}', 'Accept': 'application/json'}

# — Send a message
r = requests.post(f'{base}/instagram/send/one', headers=headers, json={
    'recipient':     '718294106203941',
    'text':      'Your verification code is 385 214.',
    'notifyurl': 'https://your-site.com/sparrow/status',
}).json()

print('Message envoyé' if r['code'] == 'OK' else f"Échec : {r['error']}")

# — Bulk send: one request, several recipients
requests.post(f'{base}/instagram/send/bulk', headers=headers, json={
    'phones': ['718294106203941', '+2126YYYYYYYY'],
    'text':   'Soldes : -20 % jusqu\'à dimanche. STOP au 36000',
})

# — Delivery status, from the identifier returned
status = requests.post(f'{base}/instagram/status', headers=headers, json={
    'message_id': '8f21c4',
}).json()
print(status['result'])

Node 18 or later: fetch is built in.

const base = 'https://app.sparrowmessage.com/api/v1';

// — Authentication
const { api_token } = await fetch(`${base}/login`, {
  method:  'POST',
  headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
  body:    JSON.stringify({
    email:    'you@company.com',
    password: 'your-password',
  }),
}).then(r => r.json());

const headers = {
  'Content-Type': 'application/json',
  Accept:         'application/json',
  Authorization: `Bearer ${api_token}`,
};

// — Send a message
const reponse = await fetch(`${base}/instagram/send/one`, {
  method:  'POST',
  headers: headers,
  body: JSON.stringify({
    phone:     '718294106203941',
    text:      'Your verification code is 385 214.',
    notifyurl: 'https://your-site.com/sparrow/status',
  }),
}).then(r => r.json());

console.log(reponse.code === 'OK' ? 'Message envoyé' : `Échec : ${reponse.error}`);

// — Bulk send
await fetch(`${base}/instagram/send/bulk`, {
  method:  'POST',
  headers: headers,
  body: JSON.stringify({
    phones: ['718294106203941', '+2126YYYYYYYY'],
    text:   'Soldes : -20 % jusqu\'à dimanche. STOP au 36000',
  }),
});

.NET 6 or later.

using System.Net.Http.Json;

var http = new HttpClient { BaseAddress = new Uri("https://app.sparrowmessage.com/api/v1/") };

// — Authentication
var auth = await http.PostAsJsonAsync("login", new {
    email    = "you@company.com",
    password = "your-password",
});
var token = (await auth.Content.ReadFromJsonAsync<Dictionary<string, string>>())["api_token"];
http.DefaultRequestHeaders.Authorization = new("Bearer", token);

// — Send a message
var msg = await http.PostAsJsonAsync("sms/send/one", new {
    phone     = "718294106203941",
    text      = "Your verification code is 385 214.",
    notifyurl = "https://your-site.com/sparrow/status",
});

var result = await msg.Content.ReadFromJsonAsync<Dictionary<string, object>>();
Console.WriteLine(result["code"].ToString() == "OK" ? "Message envoyé" : $"Échec : {result["error"]}");

// — Bulk send
await http.PostAsJsonAsync("sms/send/bulk", new {
    phones = new[] { "718294106203941", "+2126YYYYYYYY" },
    text   = "Soldes : -20 % jusqu'à dimanche. STOP au 36000",
});

Java 11 or later, native HTTP client.

import java.net.URI;
import java.net.http.*;

var client = HttpClient.newHttpClient();
var base   = "https://app.sparrowmessage.com/api/v1";

// — Authentication
var auth = HttpRequest.newBuilder(URI.create(base + "/login"))
    .header("Content-Type", "application/json")
    .header("Accept", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString("""
        {"email":"you@company.com","password":"your-password"}"""))
    .build();

var token = extract(client.send(auth, HttpResponse.BodyHandlers.ofString()).body(), "api_token");

// — Send a message
var msg = HttpRequest.newBuilder(URI.create(base + "/instagram/send/one"))
    .header("Content-Type", "application/json")
    .header("Accept", "application/json")
    .header("Authorization", "Bearer " + token)
    .POST(HttpRequest.BodyPublishers.ofString("""
        {"recipient":"718294106203941",
         "text":"Your verification code is 385 214.",
         "notifyurl":"https://your-site.com/sparrow/status"}"""))
    .build();

System.out.println(client.send(msg, HttpResponse.BodyHandlers.ofString()).body());

Copy and paste into a terminal.

# — 1. Get the token
curl -X POST https://app.sparrowmessage.com/api/v1/login \
     -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -d '{"email":"you@company.com","password":"your-password"}'

# Response: {"code":"OK","api_token":"eyJ0eXAiOiJKV1Qi..."}

# — 2. Send a message
curl -X POST https://app.sparrowmessage.com/api/v1/instagram/send/one \
     -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer $TOKEN" \
     -d '{"recipient":"718294106203941",
          "text":"Your verification code is 385 214.",
          "notifyurl":"https://your-site.com/sparrow/status"}'

# — 3. Receive inbound messages
curl -X POST https://app.sparrowmessage.com/api/v1/instagram/send/bulk \
     -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer $TOKEN" \
     -d '{"phones":["718294106203941","+2126YYYYYYYY"],
          "text":"Reminder: your appointment is tomorrow at 2:30 pm."}'

# — 4. Delivery status
curl -X POST https://app.sparrowmessage.com/api/v1/instagram/status \
     -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer $TOKEN" \
     -d '{"message_id":"8f21c4"}'

# — 5. Status of a batch
curl -X POST https://app.sparrowmessage.com/api/v1/instagram/status/bulk \
     -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer $TOKEN" \
     -d '{"messages_id":["8f21c4","8f21c5"]}'

Every response carries a code field set to OK ou KO. On anOK, result — or results for bulk calls — carries the detail; on a KO, error gives the reason. Full documentation and a sandbox are provided when your account opens.

Customers

Trusted by

Enterprises, institutions and public bodies, in Morocco and abroad. The same organisations, whatever the channel.

Employee, supplier and customer communication

Customer and employee communication

Customer and employee communication

Supplier communication

Customer and employee communication

Candidate and employer communication

Member and partner communication

Member communication

Partner and donor communication

Customer communication

Customer notifications from the CRM

Customer communication

Candidate and employer communication

Member communication

Customer and partner communication

Supplier communication

Student and partner communication

Tourism industry communication

Customer communication

Member communication

Customer and user communication

Student and administration communication

Student and administration communication

Customer and store communication

Employee communication

Customer and prospect communication

Customer and prospect communication

Customer communication

Customer communication

Customer communication

Customer notifications and relations

Customer and supplier notifications

Customer notifications and campaigns

Industries

A channel built for every industry

Fashion and beauty

Sizes in stock, product advice, order closed in the conversation.

Retail and distribution

Price, stock, in-store availability, order tracking.

Hospitality and food service

Booking from a story, today's menu, table confirmation.

Wellbeing and beauty care

Appointment booking, treatments and prices, reminder the day before.

Real estate

Qualification of enquiries from posts, viewing appointments.

Education and training

Programme enquiries, term start dates, enrolments.

Sport and leisure

Opening hours, memberships, class and event registrations.

Craft and design

Bespoke orders, production times, sending images.

Getting started

Your Instagram channel live in 4 phases

From connecting your account to the first automated journey, a mapped-out path and a single point of contact.

1Scoping and account connection
Review of your most frequent requests
Switch to a professional account and connection
Agent accounts and roles created
2Inbox and queues
Queues and assignment rules set up
Qualification tags and saved replies
Opening hours and out-of-hours message
3Automation and integration
Guided journeys and ice breakers written
Connection to your catalogue, CRM or shop
Scenario testing in the sandbox
4Go-live and support
Go-live and switchover of real traffic
Training your agents on the shared inbox
Metrics review and journey tuning

Typical timeline: account connected within 24 hours, first automated journeys live within one to two weeks depending on their complexity.

How pricing works

A proposal built on your volumes

Instagram is not billed per message like SMS: the cost depends on the conversation, the number of agents and what you automate. We therefore build a tailored proposal after a thirty-minute conversation.

Conversation volume

How many conversations open each month, and how many resolve without a human. This is the main cost driver.

Number of agents

How many people log into the shared inbox, and during which hours. An extra agent can be added at any time.

What you automate

Guided journeys, catalogue connection, CRM or ERP integration: setup is quoted once, then running costs apply.

Let's talk — we reply within one business day

Tell us your current volume and your most frequent requests. We come back with a costed proposal and a rollout schedule, with no commitment.

Frequently asked questions

Everything about Instagram for business

Yes. Instagram's business messaging is only open to professional or creator accounts linked to a Facebook page and a Meta Business account. The switch is made in the app settings and takes a few minutes; it changes nothing about your posts or your followers, and gives you access to account analytics.

As soon as a customer writes to you — direct message, story reply or comment — you have twenty-four hours to reply freely. Each new message from them restarts the clock. Once that time passes, free exchange stops. The platform shows the time left on each conversation, so your agents never have to work it out.

Instagram provides for a human agent handover: if the request could not be handled within the window, someone on your team may continue the conversation for seven days. That handover exists to resolve an open request, not to send a commercial message. For promotion, you must wait until the customer gets back in touch.

Yes, and attached to the story concerned: the agent sees what the customer is reacting to before replying. That is what makes the difference on Instagram, where most commercial volume comes from stories rather than unprompted messages. Story mentions of your account also come into the inbox.

Yes. A comment containing a keyword you have defined — "price", "in stock", "link" — triggers a public reply under the post and a private message to continue. It is the most effective way to turn a post's audience into conversations, without anyone having to watch the comments.

Yes — that is exactly what the shared inbox is for. Each conversation is assigned to one agent, visible to the others, and cannot receive two competing replies. Handover takes one click, internal notes included, and the history stays attached to the contact whichever agent replied.

Yes, and it is the most common use. Your agents send the images, check stock in your catalogue and pass on an order or payment link in the message. The order then flows into your management system, along with the source of the conversation.

Yes, through the REST API and webhooks. Every inbound message can be pushed to your system, and your system can write into the conversation. Connectors exist for the most widely used CRMs and e-commerce platforms; for an in-house tool, integration through the API takes a few days.

Yes, with the full history attached to the contact: a customer who comes back six months later is recognised, and the agent sees what was said. Retention is configurable to match your data policy, and export is available at any time.

In Morocco, personal data processing falls under Law 09-08 and the CNDP: Instagram conversations contain personal data and must appear in your declaration. Meta's rules apply on top, limiting free exchange to twenty-four hours and reserving any later handover to a human agent, to resolve an open request. Consent withdrawals and deletion requests are kept and exportable. We are not lawyers: have your setup and your CNDP declaration reviewed by your counsel.

The GDPR applies to Instagram conversations as to any processing of personal data: legal basis, informing the customer, retention period and the right to erasure. Meta's rules apply on top, limiting free exchange to twenty-four hours and reserving any later handover to a human agent, to resolve an open request. Consent withdrawals and deletion requests are kept and exportable, ready to feed your record of processing activities. We are not lawyers: have your setup reviewed by your counsel.

In the United States, commercial solicitation by message falls under the CAN-SPAM Act for email and the TCPA for phone messaging, both enforced by the FTC and the FCC; messaging is treated by analogy and carries the same requirement of consent and easy opt-out. Meta's rules apply on top, limiting free exchange to twenty-four hours and reserving any later handover to a human agent. Opt-outs are kept and exportable. We are not lawyers: have your setup reviewed by your counsel before any campaign.

The account is connected and the shared inbox usable within twenty-four hours. Automated journeys take one to two weeks depending on their complexity: you have to list the frequent requests, write the answers, then test them on real cases before going live.

Contact

Let's talk about your Instagram project

Morocco

CAF OFFICE, 1er étage, N° 2
Casablanca 20000, Maroc

+212 662-583818

United States

224 W 35th St Ste 500 N 1018
New York, NY 10001, United States

+1 (347) 789-2280