Skip to content دوام Help Center

AI & Automation

Automation & integrations

In one line: draw on a single canvas what starts the work and what it does — "when a deal reaches a stage, create a task and notify its owner" — then publish it, and read in the run log why it worked or why it didn't.

Plan: Available on Professional, Advanced, Business and the Custom plan, and during the trial; not on Basic, or once a trial ends without subscribing — where the row disappears from the sidebar and the screen doesn't open at all. The company administrator enters by role; anyone else gets no row in their sidebar unless they hold one of the two automation permissions, and an employee specifically needs Use the automation editor ("run and test pre-built automations"). Start with Tasks and Customers.

Overview

An automation is a drawing, not a form: a canvas on which you place a trigger that starts things, then connect it to steps that run in order — actions that do something, conditions that fork the path in two, and a wait that pauses it.

trigger  →  [condition]  →  action  →  action…

You reach it through two doors, and both open the same editor:

  • From the HR workspace: the Automation row in the sidebar — a standalone row that comes after the Team Chat group.
  • From the Customers workspace: the Growth row → the Customer automation tab — the fourth tab, after Campaigns, WhatsApp Status and Entry points. It is the same door, but it lands on the Customers tab of the automation list and makes that the suggested scope for every new automation — so a salesperson doesn't scroll past task and shift triggers to reach their own.

The editor fills the screen: the automation list with its folders to one side, the canvas in the middle, and on its edge the palette of elements you drag from. An element is drawn as a small square carrying its icon with its name beneath — not a wide card — so the canvas holds ten elements instead of four, which is the whole point of drawing it.

Every automation has two states and no third: Draft, which catches nothing whatever happens, and Published, which works. Only a published one receives the event.

Note: if an employee is granted Manage automations alone, the row appears in their sidebar — in the Admin section — and then refuses them on opening with "Access to automations is not permitted for your account." The permission that actually opens the screen is Use the automation editor, so grant it alongside. Both are given from Employees → edit an employee → Permissions → the Automation group.

How do I create an automation?

  1. Press New automation at the bottom of the sidebar list. A Choose a template dialog opens — "Ready-made recipes — pick one, adjust it, publish it."
  2. Choose the automation scope from the list: General — all, Employees, or Customers. It is preset to the tab you're standing on.
  3. Choose Start from scratch, or one of eight recipes arranged under four headings: Rewards & recognition — "bonus congratulations over WhatsApp", "points redemption approved", "shift completion reward"; Reminders & deadlines — "reminder before a task is due", "escalate overdue tasks"; Communication — "instant assignment notification"; Workflow — "distribute tasks among employees", "approval cycle". Each carries its number of steps. And note: a recipe imposes its own scope and overrides what you chose in the previous step — because it knows what it is, and a mismatched scope would have hidden half of what it laid down.
  4. Name it from the name box at the top of the screen (a recipe arrives named after itself).
  5. Drag elements from the palette onto the canvas — "Drag an element from the list — or right-click the canvas", and "Drag the space to move the canvas · mouse wheel to zoom". Then connect them from the endpoints.
  6. Click any element to open its editor: it has an action name (call it what you like) and then its fields.
  7. Press Published on the state switch at the top of the screen, then press Save.

Tip: a draft saves itself. While the state is Draft the status line reads "Auto-saving…" and then "All changes saved." A published one, though, saves only by your hand, and tells you "Unsaved changes" until you press Save — which is why publishing shows the message "The automation is now live — press Save to apply it."

Note: the palette is split into three collapsible groups — HR, Customers and General — and inside each the same build order: Triggers, then Conditions, then Actions, then Timing. Above them a "Search for a trigger or action" box accepts Arabic, English and the element's programmatic name alike, and when it finds nothing it says "No element by that name." Right-clicking the canvas opens the trigger list or the action list, narrowing the palette to one kind.

What is the "automation scope", and why doesn't it change what gets caught?

The scope decides what you see in the palette while you build, and decides nothing after that. The screen says so itself: "Determines the triggers and actions shown in the palette. It does not affect what the automation catches when it runs."

That is deliberate, not a gap: a scope that decided which events arrived would mean a misfiled automation stops silently — no error, no row in the log, nothing to read. And the worst fault in this engine is the silent one.

Above the sidebar list are three tabs filtering what you see: All, Employees and Customers. An automation created before this field existed reads as General, so it appears under All and under nothing else — which is why an empty tab says: "No automations in this scope yet — choose All or create one."

Tip: General — all is not indecision. The automation that crosses between the two systems — "deal won → onboarding task for its owner" — is the most useful thing you can build, so it has a home rather than being squeezed outside one.

Which triggers are available?

From HR:

Trigger When it runs What it accepts as a filter
Task created When a new task is created Filter by team, filter by employee
Task opened On task creation — the very same event Task created catches, not anyone opening or reading the task Team, employee
Task completed When the task is completed Filter by employee
Task approved When the task is approved —
Task due soon Before the due date Timing (empty = any time): 24 hours before / 4 hours before / 1 hour before
Task overdue After the deadline passes How overdue: after a day / after 3 days / after 7 days
Shift start / Shift end When an employee starts or ends their shift —
Message received On every chat message —
Bonus received When an employee receives a bonus —
Points redemption updated When a redemption is requested, approved or rejected Stage (empty = any stage): pending / approved / rejected
Customer WhatsApp message When a customer sends a message to the company's WhatsApp number Filter by keyword (optional)
Work Order Created / Stage Started / Completed When a work order is recorded and its task built, when a station picks it up, and when it's delivered The station trigger has a pin field naming the station

From Customers:

Trigger When it runs What it accepts as a filter
Deal stage changed On every move On reaching stage (or any stage)
Deal won / Deal lost On reaching a won or lost stage —
Deal created "When a single deal is created — not on import" Filter by pipeline
Deal assigned "When a deal's owner is set or changed" Filter by pipeline
Deal stale "Once daily at 08:00, when a deal has sat in its stage longer than the pipeline allows" Filter by pipeline
Close date approaching "Once daily at 08:00, 7 / 3 / 1 days before the expected close date" Days before (1, 3 or 7), filter by pipeline
New contact "When a single contact is added — not on import" —
Tag added to a contact "When a tag is added to a contact — not on bulk tagging" —
Form submitted "When someone submits one of your capture forms" —

Caution: imports and bulk operations fire nothing — by design. Five thousand imported rows would have started five thousand runs, each able to enrol a person in a campaign and message them from the company's number: a surprise discovered from customers rather than from the log. Likewise system messages inside conversations — an assignment notice, a mention, a hint — don't count as a message a human wrote, so Message received doesn't catch them.

Note: Deal stale and Close date approaching don't come from anything anyone does — a stale deal is stale by sitting still — so their source is a single daily pass in your company's time zone. Staleness is measured against the pipeline's own limit (14 days unless you change it), and is reported once per period of staleness: moving the deal resets the clock. Close-date approach is reported once per threshold for that date, and changing the date re-arms it.

Which actions are available?

Action What it does Its main fields
Create task Creates a new task Task title and Project — both mandatory, and it won't publish without them — then description, team, assignee, priority, due within (hours) (24 by default)
Send message Writes a message into a conversation Conversation, message text
Award points Awards reward points Employee (empty = the event's employee), points (1 by default), reason
Change task status Moves the event's task to another status New status: New / In progress / Awaiting approval / Needs changes / Completed / Overdue
Notify user An in-app notification Recipient, message
WhatsApp to assignee A WhatsApp message to the employee assigned the task Template (overrides the text below), message text
WhatsApp to user A WhatsApp message to a specific employee or the event's employee User (empty = the event's user), template (overrides the text below), message text
WhatsApp to number A WhatsApp message to a number typed directly Mobile number (e.g. +966500000000), message text
WhatsApp to team A message to every member of a team and its leader Team (empty = the event task's team), message text
Webhook (HTTP send) Sends data to an external URL URL (https://…), method, authorization header (optional), JSON body
Wait Pauses the path Wait until: task only / time only (the default) / task + task timing / task + manual timing, then duration and unit — and those last two don't show with the two modes that lean on the task's own timing
Condition Forks the path in two Rule: task completed / task overdue / approval granted / message contains / employee was late, plus keyword (for the message rule), which appears only with that rule

And on the deal and the contact:

Action What it does Its main fields
Move the deal to a stage Moves it within its own pipeline Stage, loss reason (for a lost stage)
Create a task on the deal Adds a task to the deal's record Task, due within (days)
Alert the deal's owner An in-app notification to whoever owns it Message
Set the deal's owner Sets who is responsible Owner
Tag the contact Adds a tag to the deal's contact Tag
Log a note Writes a note into the deal's record Note
WhatsApp QR "Reply to the customer on the QR-linked line, within 24 hours of their last message" Template (overrides the text below), message
Enrol in a campaign Starts a drip campaign for the contact Campaign — and the list shows only running campaigns
Drip mode "Advances to the next step in batches, at a fixed interval" Batch size, interval between batches, unit

Caution: Move the deal to a stage won't move to a lost stage without a loss reason, won't move a deal to its current stage, and won't move it outside its own pipeline. And if an automation loops on itself past 3 automated moves for one deal in a minute, it is stopped automatically and the company's administrators get a notification naming it: "Deal move loop … check the run log."

Note: Enrol in a campaign won't accept a draft campaign, because it would take the enrolment and send nothing — you'd read "succeeded" in the log and wait days for messages that were never going out. And if you have no running campaign the list tells you: "No running campaigns — launch one first." See Customer campaigns.

How do I write text that carries the event's data?

Every text field has a Variables button — "insert a variable" — that opens a picker grouped by subject, and clicking one inserts it at the cursor. The main ones:

  • Contact: {{contact.name}}, {{contact.first_name}}, {{contact.last_name}}, {{contact.phone}}, {{contact.email}} and {{contact.company}}.
  • Deal: {{deal.name}}, {{deal.amount}}, {{deal.currency}}, {{deal.stage}}, {{deal.owner}}, {{deal.closeDate}}, {{deal.daysInStage}} and {{deal.url}}.
  • Task: {{task.title}}, {{task.status}}, {{task.dueDate}}, {{task.priority}}, {{task.project}}, {{task.assignee}}, and {{task.due.relative}}, which writes the deadline in relative form using fixed, uninflected wording: "in an hour", "in 3 hours", "in 5 days", "overdue now", "overdue by 5 hours", "overdue by 5 days".
  • Employee: {{user.name}}, {{user.first_name}}, {{assignee.name}} and {{reviewer.name}}.
  • Chat message: {{message.body}} and {{message.sender}} — which are what read the text of the message that fired Message received, and the name of whoever wrote it.
  • Bonus and redemption: {{bonus.points}}, {{bonus.message}}, {{bonus.from}}, {{redemption.amount}} and {{redemption.status}}.
  • Customer message: {{customer.phone}} and {{customer.message}}.
  • Work order: {{order.number}}, {{order.customer.name}}, {{order.customer.phone}}, {{order.lines}}, {{order.stage}} and {{order.url}}.
  • Company and time: {{company.name}} and {{now}}.

A variable that finds no value is replaced by nothing at all, not by its braces. And beneath the WhatsApp QR message field is a live counter reading "{c} characters · {w} words" — counting the variable at what it occupies right now, because it stays text until the moment of sending.

Note: some elements and some section headings in the variable picker aren't translated yet, so they appear in English inside the Arabic interface — among them the three work-order triggers. That is a translation defect, not a working one: the element behaves exactly as described here.

How do I find out why an automation didn't run?

Press the Log button in the editor toolbar — an icon with no text, its name showing on hover — to open the run log. Each row is one event that reached this automation, with its time, the event's name as the system calls it (crm.deal.stale, say) and a coloured status: succeeded, skipped, failed or no match.

Under the row are its steps one by one: a trigger row first, then each step by its programmatic name in English (create_task, whatsapp_send_to_assignee, crm_move_deal_stage…) and its status in English too (success / skipped / error), each with its written reason — most of them in English: why it was skipped, and why it failed. That line is the point of the whole screen, so read it rather than settling for the status colour.

And before any of that, the canvas is still in your hands:

  • A pre-publish badge beside the publish switch — and it only appears when something is missing. It counts what's missing and opens a panel naming it and taking you there in a click: "No trigger — this automation will never start.", "A trigger with no step after it — nothing will happen.", "An unconnected step — it won't run.", "Missing: …". When everything is clear the badge itself disappears, and the panel, if open, says: "Everything is ready to publish."
  • And while the badge is showing, publishing is refused from that switch: pressing Published answers with "Fix the steps first" and opens the panel on what's missing, and the state does not change. (Going back to Draft doesn't pass this guard — stopping needs no permission.)
  • The panel itself carries a reading from the server before you publish: how many people it will reach, what your line's ceiling is in messages/hour, and when the last message went — or "This automation sends no messages." Beneath it, warnings where warranted: "No re-entry guard — the same person may be reached more than once.", "Sending will take about … hours at your line's current ceiling." (when the audience reaches 50 people or more and sending takes 6 hours or more), and "The line's ceiling is unknown — no message may be sent at all."
  • Test this step — a button on every element except the trigger. On an action it means: run this action alone, now, and write on the element itself what the engine said — "step completed", "skipped" or "failed" — with the engine's reason verbatim, not reworded. It doesn't walk the rest of the drawing, records no row in the log, and spends no re-entry credit. And while you have any unsaved change it answers "Save the automation first to test it." — because it works on the saved drawing, not the one in front of you.
  • Simulate lights the elements in order on the canvas so the path can be read — display only, executing nothing.

Caution: an automation that fails 5 times in a row is stopped automatically, and the company's administrators get a notification naming it and pointing them at the run log. This is a safety net, not a punishment: a broken automation with no guard keeps hammering recipients or an external system for hours while nobody reads the log.

Note: the system keeps the last 200 runs per automation, and the panel shows the last 50 of them. A draft automation writes no log at all — because it receives no event.

How do I prevent duplicates and a flood of messages?

Five guards work together, and only the first can be switched off:

  • Re-entry — from the More options menu in the editor toolbar. "Prevents the same person being enrolled in this automation twice." It has three modes: always allowed (the default), once only, and once every period with a number of days — 30 days if you leave it, and 365 at most. Your choice shows as a badge: once per person or once every {d} days.
  • Per-minute, per-automation limits: 30 webhook sends, 20 WhatsApp QR messages, and only 2 of WhatsApp to team — because a broadcast to a whole team is not the same as a reply to one customer. Anything over the limit is logged as skipped with its reason, never cut silently.
  • The service window: WhatsApp QR only sends if the customer messaged you within 24 hours; otherwise the log says: "outside the 24h service window — send a campaign instead".
  • Opt-out before everything: anyone who said stop receives nothing through this door — checked before the service window, before the limit, before everything. See Customer campaigns.
  • Drip mode — a step that does nothing to the contact, but holds the path there and releases a fixed number every interval, so sending spreads over hours instead of one burst that torches the line. It carries review the send schedule — "Shows when each batch actually goes out — after your line's ceiling is applied." — and a show the schedule button writes out the times of each batch after your line's ceiling is applied, not before; and if the rate was reduced it tells you: "Rate reduced to fit the WhatsApp line's ceiling: {b} every {m} minutes."

Note: Drip mode is the only wait that is persisted and survives a server restart. The Wait step is an in-memory timer: a restart drops it and everything after it. Make long waits drips, or build on them only what you can afford to lose.

How do I disable a step without deleting it?

Every step carries small buttons: disable step / enable step, duplicate, test this step, and more. The trigger, though, has only two: disable trigger / enable trigger and more — no duplicate and no test, because two copies of the same trigger are exactly what enrols a person twice, and because a trigger has nothing in it to execute. A disabled element is marked disabled. Deleting isn't in that row — it lives in the more menu alongside copy action and copy all actions from here; and it deletes without asking, though ⌘Z brings it back while you're in the same session.

And the disabling behaviour is precisely intended:

  • A disabled step is skipped and the path continues over it to what comes next. Cutting the branch would have made "skip this greeting" secretly mean "cancel the follow-up too".
  • A disabled trigger closes its door — there is nothing before it to continue from.
  • A disabled condition takes both branches — picking one would be inventing an answer, and taking neither would sever the path.

How do I send an event to an external system?

With the Webhook (HTTP send) action: set the URL (https://…), choose the method (POST, PUT or PATCH), add an authorization header (optional) if the other end asks for one, and write the JSON body — text you write yourself that accepts variables, so you build the payload in the shape that system understands.

It carries guards that can't be switched off:

  • The URL must start with http:// or https://.
  • Internal and private destinations are blocked before the connection opens — and any ambiguity in the address is read as a block, not a pass.
  • Redirects are not followed: a redirect response counts as a failure, because the check ran on the first URL alone.
  • A 10-second timeout, then it's logged as a failure with its reason, and a limit of 30 requests per minute per automation.

Every unsuccessful response is written to the log with its status and its text, so you know it was the receiving system that refused.

Caution: there is no signature on this payload and no shared secret. If the receiving system needs proof of origin, put a key in the authorization header and read it at the other end.

How do I connect an external system that reads from Duwam?

From Settings → My company → Integrations, which has three tabs:

  • API keys — a key per external application, with permissions you choose yourself and a rate limit (per minute). The key is shown in full once only, at creation, and is used in an Authorization: Bearer … header — or in an X-API-Key header for anyone who can't set the first.
  • Activity log — the most recent requests that arrived on your keys, with their status, path and duration.
  • WhatsApp API — connecting WhatsApp through HighLevel with a private integration you create in your account there, then check capabilities to tell you what your key actually reaches.

The full detail of this screen is in Settings.

Caution: an API key is equivalent to a password — never put it in a page a browser opens or in a public repository. And if it leaks, rotate from the same screen issues a replacement with the same permissions and revokes the old one immediately.

How do I organise automations when there are many?

  • Create folder at the bottom of the list: "Create a folder to organise your automations and keep similar work in one place." Folders are one level — there is nothing on the screen that puts a folder inside a folder.
  • Drag an automation into a folder, or into empty list space to take it out.
  • Tick several automations and a bar appears saying how many are selected, carrying publish all, convert to draft and delete.
  • Deleting a folder doesn't delete what's in it: "Delete this folder? The automations will remain and move out of the folder."

What automation does not do

So you don't go looking for what isn't there:

  • No time trigger and no cron. You can't schedule an automation for "every Monday at 9am". Every trigger is event-based, and the nearest thing to scheduling is the periodic passes built into the product itself: Deal stale and Close date approaching from one daily pass at 08:00 in your company's time zone, and Task due soon and Task overdue from a sweep every half hour that catches the threshold being crossed.
  • No email sending and no SMS. The channels are: an in-app notification, a message in team chat, WhatsApp, and a webhook.
  • No persisted wait except the drip. The Wait step is an in-memory timer that a server restart drops, and its ceiling is 7 days; and waiting for a task to complete gives up after 7 days without running what follows — because running the "task completed" follow-up for a task that never completed is worse than silence.
  • No editing of a task's fields from the canvas other than its status: no tag, no priority, no due date on an existing task.
  • No condition on a deal. All five condition rules are about tasks and messages, so a deal automation that forks on its amount or its stage isn't possible today — pin that in the trigger instead (on reaching stage, filter by pipeline).
  • No inbound webhooks in settings: what's there is API keys, their log, and the HighLevel connection. The only outbound door is the Webhook (HTTP send) action.
  • No standard signed payload for the webhook — the payload is what you write, and there is no signature.
  • No scoping by project. An automation belongs to the whole company; there is nobody today who owns "automations for my projects only".
  • No versions and no undo across sessions. What is saved is saved, and there is no version history for an automation to return to.
  • The scope is not a runtime filter. An automation scoped to Employees catches a deal event if that is its trigger — the scope filters the palette only.

FAQ

Q: I created the automation and nothing happened. A: Check in order: is its state Published, not Draft? (And if the switch refused to publish, the pre-publish badge tells you what's missing.) Did you press Save after publishing (a published one doesn't save itself)? Then open the log: if it's empty the event never reached it at all — check the trigger; and if a skipped row appears, the reason is written beneath it.

Q: Where is the webhooks screen in settings? A: There isn't one. Integrations holds API keys, their activity log, and the WhatsApp connection through HighLevel. Sending an event to an external system is an action inside the automation called Webhook (HTTP send).

Q: How do I run an automation at a set time each week? A: There is no time trigger. The practical answer is for an external system to hit Duwam's API at the time you want — see API docs on the integrations screen.

Q: I imported hundreds of contacts and the welcome automation never fired. A: That's intended, not broken. Imports and bulk tagging fire nothing, protecting you from hundreds of messages leaving your number at once.

Q: A WhatsApp QR message isn't reaching the customer. A: The three commonest causes are all written in the log: the customer hasn't messaged you within 24 hours so the window is closed (send a campaign instead), or they previously said stop, or the message text became empty after a variable with no value was substituted.

Q: I disabled a step — does everything after it stop? A: No. A disabled step is skipped and the path continues past it. The two exceptions: a disabled trigger closes its door, and a disabled condition takes both branches.

Q: The automation stopped itself. Why? A: For one of two reasons: 5 consecutive errors, or a deal-move loop (more than 3 automated moves for the same deal in a minute). In both cases the administrators get a notification naming it, and the reason is in the run log. Fix what's in it, then publish again.

Q: I see the row in my sidebar but the screen refuses me. A: You have Manage automations without Use the automation editor. Ask your company administrator for the second.

Q: How many automations can I create? A: There is no limit on the number. The real limits are on running: 200 saved runs per automation, the per-minute sending limits, and the automatic stop after 5 errors.

Q: Why can't I see the deal triggers in my palette? A: Because the automation's scope is Employees. Change it to Customers or General — all from the automation scope list, or enter through Customer automation.

Quick reference

Action Path
Open Automation (HR) HR workspace → the Automation row
Open Customer automation Customers workspace → the Growth row → Customer automation
Create an automation New automation → Choose a template → Start from scratch or a recipe
Change the scope The Choose a template dialog → automation scope
Filter the list The All / Employees / Customers tabs above the list
Publish The Draft / Published switch, then Save
See what's missing before publishing The pre-publish badge beside the switch — it appears only when something is missing
Start from a ready-made recipe More options → ready-made templates
Read why it failed Log → the run log
Test one step The element's buttons → test this step
Prevent duplicate enrolment More options → re-entry
Disable a step The element's buttons → disable step
A new folder Create folder at the bottom of the list
Delete an automation More options → delete automation
Send to an external system The Webhook (HTTP send) action
An API key Settings → My company → Integrations → API keys
Grant the automation permission Employees → edit an employee → Permissions → Automation
  • Deals & pipelines — the seven triggers and actions on a deal, and the staleness limit
  • Customer campaigns — the campaign the enrol action feeds, and the line's ceiling
  • Tasks — the tasks automation creates and whose status it moves
  • WhatsApp — the line automation messages leave from, and its templates
  • Work orders — the three events a work order fires
  • Settings — API keys, their activity log and the HighLevel connection
  • Teams & permissions — who opens the editor and who doesn't
  • Plans & billing — the plans that include automation