Call lifecycle
What a call is
Section titled “What a call is”A call is one attempt to reach one recipient. If the first attempt doesn’t reach them, a retry is a new
call with its own id. A recipient called three times has three call records.
Call statuses
Section titled “Call statuses”Every call moves through some of these statuses. They fall into six stages:
| Stage | Statuses | Meaning |
|---|---|---|
| Waiting | SCHEDULED QUEUED | Not dialled yet. |
| Connecting | INITIATED RINGING | Being set up, or ringing. |
| Talking | IN_PROGRESS | The agent is on the line with the customer. |
| Getting the result | ANALYZING → COMPLETED / ANALYSIS_FAILED | The conversation ended and the result is being prepared. |
| Not reached | NO_ANSWER BUSY FAILED | Rang or connected, but nobody usable was reached. |
| Stopped before dialling | CANCELLED EXPIRED | Removed from the queue before it could ring. |
See Statuses for the one-line meaning of each status.
What moves a call
Section titled “What moves a call”| Trigger | Effect |
|---|---|
| Gowajee’s dialler picks up a waiting call | SCHEDULED → QUEUED → INITIATED → RINGING |
| The customer answers | RINGING → IN_PROGRESS |
| The customer doesn’t answer, rejects, or the line is busy | RINGING → NO_ANSWER or BUSY |
| The call hangs up | IN_PROGRESS → ANALYZING → COMPLETED or ANALYSIS_FAILED |
| You pause the campaign | Waiting calls (SCHEDULED, QUEUED, INITIATED) go back to SCHEDULED. Calls already ringing or talking finish normally. |
| You cancel the campaign | Waiting calls become CANCELLED. Calls already ringing or talking finish normally. |
The campaign’s endDateTime passes |
Waiting calls become EXPIRED. |
| A call waits too long in the queue | It becomes CANCELLED and is retried without using up an attempt. |
| Gowajee re-analyzes a finished call | COMPLETED or ANALYSIS_FAILED → ANALYZING → a fresh result. |
| A late result arrives for a call whose analysis had failed | ANALYSIS_FAILED → COMPLETED. |
Retries
Section titled “Retries”A call is retried when it ends as NO_ANSWER, BUSY, FAILED, or CANCELLED from a queue timeout — and the
recipient still has attempts left. Each retry is a new call, with its own id and sessionId.
- The wait before a retry is counted from when the previous call ended, not from when it was dialled.
- A retry only happens inside the campaign’s calling hours.
- With more than one caller number configured, the caller ID rotates: a retry never uses the number the recipient was just called from.
- The voice is re-picked for every call, including retries.
- Someone who was reached (
COMPLETED, including voicemail) at any point in the campaign is never called again.
See Scheduling → Retries for the exact fields (maxAttempts, retryInterval) and a
worked timeline.
Timing fields
Section titled “Timing fields”| Field | Meaning |
|---|---|
callStartedAt |
When the conversation started. null if the customer never answered. |
callEndedAt |
When the attempt ended. Set even for calls nobody answered. |
callDuration |
Seconds, with 3 decimals, as a numeric string such as "120.120", or null. Parse it with parseFloat/float(). |
Getting the result
Section titled “Getting the result”callResult is ready once callStatus is COMPLETED. There are three ways to read it:
- the webhook — pushed to you as soon as it’s ready,
GET /api/campaign/:id/calls— the field is namedcallResult,GET /api/call/:callId— the same object, but namedresult. It is{}when there is no result yet, nevernull.
A few things that affect the result:
- When analysis couldn’t run, the call is still
COMPLETED, but the result has a fixed fallback shape instead of your fields — see Webhooks → When the analysis could not run. - Re-analysis sends the same call again with a new result and
isReAnalysis: true. Upsert oncall.idso the newer result replaces the older one. See Webhooks → Re-analysis. - Recordings are fetched separately, with
GET /api/call/:callId/record-url. The links it returns expire within 1 hour, so fetch a fresh one when you need it rather than storing the URL.
Which changes send a webhook
Section titled “Which changes send a webhook”| Change | Webhook sent? |
|---|---|
A call reached the customer and was analyzed (COMPLETED) |
Yes |
A call ended without a conversation (NO_ANSWER, BUSY, FAILED, or a queue-timeout CANCELLED) |
Yes, with callResult: null |
A call’s analysis failed (ANALYSIS_FAILED) |
No |
A COMPLETED call Gowajee doesn’t analyze (no recording and no transcript, or the agent stopped with an error) |
No |
A waiting call became CANCELLED because you cancelled the campaign |
No |
A waiting call became EXPIRED |
No |
| Gowajee re-analyzed a call you already received | Yes, a new CALL_RESULT with isReAnalysis: true |
This is a summary. For the full rules and the payload shape, see Webhooks → When is it sent?.