How delivery works
Someone comments LINK on your reel. A few seconds later they have a DM. In between, Dartzo does five things — and writes down the result of every one of them. This page walks that journey, so when you look at your log you know exactly what you’re reading.
The five steps
- The comment arrivesInstagram sends us a webhook the moment someone comments. We acknowledge it and record it — that’s the
receivedstate. Nothing is sent yet; we’ve only promised not to lose it. - We match an automationWe compare the comment text against the keywords on your active automations for that post. If two automations could both fire, the more specific one wins — the same way, every time. A match moves the job to
matched. No match means no DM, and no job. - We queue a jobEvery matched comment becomes a job with a deadline — the last moment Instagram will still accept a reply to it. If we have capacity right now, the job goes out right now. If we don’t, it sits in
queuedand gets retried oldest-first until it sends or hits that deadline. - We sendThe job flips to
sending, we call Instagram, and we wait for the answer. Sends are spaced out by a small random delay (50–250 ms) so a viral post doesn’t land as one wall of requests on Instagram’s door. - We record the outcomeEvery job ends in one of three terminal states:
sent,expired, orfailed. A failure always carries a reason. There is no fourth outcome where a DM quietly disappears.
What each state means
Instagram allows exactly one private reply per comment, which is why the DM arrives once and only once.
| State | What it means for you | Is it final? |
|---|---|---|
| received | We have the comment. Nothing has been decided yet. | No |
| matched | A keyword matched an active automation. This comment is getting a DM. | No |
| queued | We’re at our sending ceiling for this hour, or sending is paused. The job is waiting its turn and will be retried automatically. | No |
| sending | The request is in flight to Instagram right now. | No |
| sent | Instagram accepted the DM and gave us a message ID. It’s delivered. | Yes |
| expired | The reply window closed before we could send — the deadline passed, or a Live broadcast ended. We stopped trying and said so. | Yes |
| failed | The send won’t work and retrying won’t change that. The reason is recorded on the job. | Yes |
| unknown | The call to Instagram timed out and we genuinely don’t know if it landed. A follow-up check resolves it to sent or safely retries — we never guess. | No |
sent, expired, or failed, and anything stuck in a transient state for more than an hour raises an alarm on our side. "It vanished" is not a state we accept.How long we actually have
Instagram decides how long a reply is allowed. We subtract a safety margin from every one of those windows so we’re never trying to squeeze a send through the closing door.
| Trigger | Instagram’s window | When Dartzo gives up |
|---|---|---|
| Comment on a post or reel | 7 days from the comment | 6 days 18 hours — 7 days minus our 6-hour safety margin |
| Comment on an Instagram Live | During the broadcast only | About 60 seconds, and never past the end of the broadcast |
| Story reply or story mention | 24 hours from their message | 18 hours — 24 hours minus the same 6-hour margin |
| DM keyword | 24 hours from their message | 18 hours — 24 hours minus the same 6-hour margin |
expired immediately rather than queued for hours and quietly missed.How fast we send
Instagram’s documented ceiling for comment private replies on posts and reels is 750 per hour per account. We deliberately do not start there.
- We start each account at 200 DMs per hour and pace against that, not against the ceiling.
- If Instagram signals any kind of throttling, we immediately cut the rate in half — down to a floor of 20 per hour — rather than pushing back and risking your account.
- After each clean day we recover 10% of the ceiling (75/hour) until we’re back up, never above 750 per hour.
- Live comments and messaging triggers run on a separate, much faster budget: up to 100 sends per second, because they aren’t competing for the comment-reply allowance.
- Anything over the current budget is
queued, not dropped. Capacity frees up every hour and the queue drains oldest-first.
One comment, one DM
Instagram allows exactly one private reply per comment. Not one per hour, not one per automation — one, ever. That’s Instagram’s rule, not a Dartzo setting, and it can’t be raised.
So we enforce it in three places: one job per comment at the database level, a check before we send, and a check on the way back — if Instagram tells us that comment was already answered, we record the job as sent rather than trying again. If the same person comments five times, they still get one DM.
When a send fails
| Person | Keyword | Status |
|---|---|---|
| @maya.makes | LINK | sent |
| @arun_r | LINK | sent |
| @priya.k | GUIDE | queued |
| @sam_87 | LINK | failed |
A failure is a result, not a gap. Each failed job carries a reason you can act on:
| Reason | What happened | What you can do |
|---|---|---|
| blocked | The person blocked you, or has messaging turned off. | Nothing — this is their choice, and it’s correct that we stopped. |
| comment_deleted | The comment was deleted before we could reply to it. | Nothing. There’s no longer anything to reply to. |
| permission | A permission Instagram requires for this send is missing. | Reconnect the account and grant the requested permissions. |
| token_invalid | Your Instagram connection expired or was revoked. | Reconnect the account. Queued jobs resume once it’s healthy. |
| outside_window | The reply window closed before the send landed. | Usually paired with expired. Nothing to fix on your side. |
| no_optin | A follow-up was waiting on a button tap that never came. | Nothing — they simply didn’t tap. The first DM still sent. |
| unknown_error | Something we couldn’t classify. We keep Instagram’s exact words on the job. | Contact support with the job — the raw error is stored, not lost to a log rotation. |
Temporary problems on Instagram’s side aren’t counted as failures. If we get a server error, we retry the job up to 5 times before we call it — enough to ride out a blip, few enough that a real outage is something you see instead of something we hammer at.
Common questions
My post went viral and DMs are showing as queued. Did they fail?
queued means we’re pacing to stay under Instagram’s limits — the job is waiting, not lost, and it has until its deadline (nearly 7 days for a post or reel comment) to go out. It will drain automatically as capacity frees up each hour.Why did a DM expire?
expired is us telling you a send didn’t happen — rather than leaving you to assume it did.