# DMLY > DMLY is the WhatsApp-first customer engagement platform - unified inbox, chatbots, broadcasts, CRM, appointments and payments. ## Docs - [Set your business details](https://docs.dmly.io/account/business-details.md): Set the business name, logo, brand colour, currency and contact details your workspace uses everywhere. - [Set up notifications](https://docs.dmly.io/account/notifications.md): Choose which events message your clients, which alert your team, and on which channel — all set once for the whole workspace. - [Manage your profile](https://docs.dmly.io/account/profile.md): Change your own name, email, language, timezone, password and two-factor authentication in DMLY. - [Control what your team can do](https://docs.dmly.io/account/roles-and-permissions.md): Set a base role for each team member and build custom roles that grant an exact set of permissions. - [Secure your account](https://docs.dmly.io/account/security.md): Turn on two-factor authentication, control who can do what in your workspace, and understand what DMLY protects and what it doesn't. - [Invite and manage team members](https://docs.dmly.io/account/team-members.md): Invite teammates to your workspace by email, give them a role, and remove or revoke access when they leave. - [Brand DMLY as your own](https://docs.dmly.io/agency/branding.md): Set your app name, logo, colour and Powered by link so your clients see your brand instead of DMLY. - [Client workspaces](https://docs.dmly.io/agency/client-workspaces.md): How client workspaces join your agency, and how to assign plans, grant add-ons, suspend access, and open one as the customer. - [Connect Stripe](https://docs.dmly.io/agency/connect-stripe.md): Connect your agency's own Stripe account so client workspaces can subscribe and pay you online, and set up the webhook that keeps DMLY in sync. - [Connect your agency domain](https://docs.dmly.io/agency/custom-domain.md): Serve your agency's DMLY on a domain you own, so your customers sign up and work under your address instead of a DMLY one. - [Agency overview](https://docs.dmly.io/agency/overview.md): How the DMLY agency layer lets you resell the platform under your own brand, domain, and Stripe account. - [Price and bill your clients](https://docs.dmly.io/agency/plans-and-billing.md): Set up your own plans, charge clients through your own Stripe account, and understand what your reseller plan pays for. - [Conversation reports](https://docs.dmly.io/analytics/conversation-reports.md): Read the inbound and outbound message numbers on your Overview page, and understand what each one counts. - [Collect customer satisfaction scores](https://docs.dmly.io/analytics/csat.md): Ask contacts to rate your service in WhatsApp, route each score to a different follow-up, and send happy responders to a Google review. - [Export your data](https://docs.dmly.io/analytics/exporting-reports.md): What you can export from DMLY, in what format, and how to get everything else through the API. - [Overview](https://docs.dmly.io/analytics/overview.md): Read the Overview dashboard: quick actions, at-a-glance numbers, message volume, flow outcomes, broadcast funnel and contact sources. - [Get the authenticated workspace](https://docs.dmly.io/api-reference/account/get-the-authenticated-workspace.md): Returns the workspace (account) that the API key belongs to. Useful as a connectivity / auth check. - [Book a 1:1 appointment.](https://docs.dmly.io/api-reference/appointments/book-a-1:1-appointment.md): Re-validates the slot under a lock (no double-booking), creates the booking (confirmed), pushes the calendar event, sends the confirmation message, seeds reminders and fires booking.created + appointment_booked. If the slot is gone responds 422. `datetime` is parsed in `timezone` (default UTC). With… - [Cancel an appointment.](https://docs.dmly.io/api-reference/appointments/cancel-an-appointment.md): Cancels the booking: deletes the calendar event, skips pending reminders, messages the contact and fires booking.cancelled + appointment_cancelled. Returns {"cancelled": true}, or false if the booking was already terminal. - [Get one appointment.](https://docs.dmly.io/api-reference/appointments/get-one-appointment.md): Returns a single 1:1 appointment by its uuid, with the embedded service, staff and contact. - [List 1:1 appointments (paginated).](https://docs.dmly.io/api-reference/appointments/list-1:1-appointments-paginated.md): Returns confirmed/pending/completed/cancelled/no_show 1:1 bookings, newest scheduled first. Class-seat bookings are excluded. Filter by service, staff, contact (all uuids), status, and a scheduled_at window (from/to). - [List open booking slots for a service.](https://docs.dmly.io/api-reference/appointments/list-open-booking-slots-for-a-service.md): Computes bookable slot start instants for a service over a date window, honouring working hours, min-notice/horizon, buffers, calendar busy time and existing bookings. The window runs from the start of `date` (in `timezone`) for `days` days. Returns {"slots": [iso8601 utc, ...]} (max 100). - [Mark an appointment completed or no-show.](https://docs.dmly.io/api-reference/appointments/mark-an-appointment-completed-or-no-show.md): Transitions a non-terminal appointment to a terminal status. `completed` fires appointment_completed and awards loyalty; `no_show` fires appointment_no_show. Responds 422 if the appointment is already terminal. - [Reschedule an appointment.](https://docs.dmly.io/api-reference/appointments/reschedule-an-appointment.md): Re-validates the new slot, moves the booking, patches the calendar event, reseeds reminders and notifies the contact, firing booking.rescheduled + appointment_rescheduled. Responds 422 if the booking is terminal or the new slot is taken. `datetime` is parsed in `timezone` (default UTC). - [Authentication](https://docs.dmly.io/api-reference/authentication.md): Authenticate with a workspace API key, sent as the x-api-key header. - [Activate an automation.](https://docs.dmly.io/api-reference/automations/activate-an-automation.md): Sets the automation's status to active so it begins running on its trigger. Identified by uuid. Returns the updated automation. No request body is required. - [List automations in the workspace.](https://docs.dmly.io/api-reference/automations/list-automations-in-the-workspace.md): Returns a paginated list of the workspace's Salesbot automations (flows and quick automations), newest first. Building or editing flows is out of scope for the API; this endpoint is read-only. Supports filtering by status, trigger type, builder, and the connected channel. - [Pause an automation.](https://docs.dmly.io/api-reference/automations/pause-an-automation.md): Sets the automation's status to paused so it stops running until reactivated. Identified by uuid. Returns the updated automation. No request body is required. - [Retrieve a single automation.](https://docs.dmly.io/api-reference/automations/retrieve-a-single-automation.md): Returns one automation by its uuid. Responds 404 if no automation with that uuid exists in the current workspace. - [Approve a held broadcast.](https://docs.dmly.io/api-reference/broadcasts/approve-a-held-broadcast.md): Releases a broadcast awaiting approval: clears requires_approval, records the acting API key's user as approver with approved_at=now(), and marks the broadcast Scheduled so the DispatchDueBroadcasts cron can dispatch it. Returns the updated broadcast. - [Create a broadcast.](https://docs.dmly.io/api-reference/broadcasts/create-a-broadcast.md): Creates a broadcast on the given channel. Status is Draft unless 'schedule' is true (then Scheduled). For a retarget campaign, set type=retarget with source_broadcast_id (a prior broadcast uuid) and retarget_engagement; otherwise the audience defines a contact segment. Returns 201 with the created b… - [Delete a broadcast.](https://docs.dmly.io/api-reference/broadcasts/delete-a-broadcast.md): Permanently deletes the broadcast identified by its uuid. Returns {"deleted": true}. - [List a broadcast's recipients.](https://docs.dmly.io/api-reference/broadcasts/list-a-broadcasts-recipients.md): Returns a paginated list of per-contact delivery rows for the broadcast (newest first), each with delivery status, provider message id, error payload and the embedded contact. Optionally filter by recipient status. - [List broadcasts in the workspace.](https://docs.dmly.io/api-reference/broadcasts/list-broadcasts-in-the-workspace.md): Returns a paginated list of broadcasts (newest first), each with channel and source-broadcast embeds. Optionally filter by status or by channel uuid. - [Retrieve a single broadcast.](https://docs.dmly.io/api-reference/broadcasts/retrieve-a-single-broadcast.md): Returns the broadcast identified by its uuid, with channel and source-broadcast embeds and aggregate delivery counters. - [Send a broadcast now.](https://docs.dmly.io/api-reference/broadcasts/send-a-broadcast-now.md): Marks the broadcast as Scheduled with scheduled_at=now(), so the DispatchDueBroadcasts cron dispatches it on its next run. The queue is never invoked directly. Returns the updated broadcast. - [Update a broadcast (PUT or PATCH).](https://docs.dmly.io/api-reference/broadcasts/update-a-broadcast-put-or-patch.md): Updates the broadcast's name, audience, message, schedule, retarget config or approval flag. Re-requiring approval voids any prior sign-off. A broadcast cannot retarget itself (422). All fields are optional. - [List connected messaging channels.](https://docs.dmly.io/api-reference/channels/list-connected-messaging-channels.md): Returns a paginated list of the workspace's connected messaging accounts (WhatsApp, Facebook, Instagram, SMS, Telegram, Live Chat, TikTok, etc.). Channels are connected via OAuth in the dashboard, so this endpoint is read-only. Supports keyword, platform, and status filtering. Results are ordered by… - [Retrieve a single connected channel.](https://docs.dmly.io/api-reference/channels/retrieve-a-single-connected-channel.md): Returns a single connected messaging channel by its public id (uuid). Responds 404 if no matching channel exists in the current workspace. - [Book a contact into a session.](https://docs.dmly.io/api-reference/classes/book-a-contact-into-a-session.md): Books a contact (by uuid) into the session via the class booking service, reserving a seat under a capacity lock or — when the class is full and waitlisting is enabled — a waitlist place. Returns the created participant (201). If the booking cannot proceed (e.g. class_full, already_booked, not_booka… - [Cancel a participant's place.](https://docs.dmly.io/api-reference/classes/cancel-a-participants-place.md): Cancels a participant's place by its uuid via the class booking service. Freeing a confirmed seat returns it to the pool and promotes the next waitlisted contact. Returns {"deleted": true}. - [Create a group-class session.](https://docs.dmly.io/api-reference/classes/create-a-group-class-session.md): Creates one occurrence of a class Service: a fixed time window with a seat pool. service_id is required (Service uuid); staff_id is the optional host (staff uuid). If ends_at is omitted it is derived from the Service duration. capacity defaults to the Service capacity and waitlist_enabled defaults t… - [Delete a group-class session.](https://docs.dmly.io/api-reference/classes/delete-a-group-class-session.md): Deletes a group-class session by its uuid. Returns {"deleted": true}. - [List a session's participants.](https://docs.dmly.io/api-reference/classes/list-a-sessions-participants.md): Returns a paginated list of the session's participants — confirmed seats first, then the waitlist in position order. Each participant embeds its contact via the shared contact resource. - [List group-class sessions.](https://docs.dmly.io/api-reference/classes/list-group-class-sessions.md): Returns a paginated list of group-class sessions (one occurrence of a class Service, each with a seat pool), ordered by start time. Scoped automatically to the authenticated workspace. The Service and host staff are embedded as lightweight objects and a participants_count is included. - [Retrieve a single group-class session.](https://docs.dmly.io/api-reference/classes/retrieve-a-single-group-class-session.md): Returns one group-class session by its uuid, with the embedded Service, host staff and participants_count. - [Update a group-class session.](https://docs.dmly.io/api-reference/classes/update-a-group-class-session.md): Updates a group-class session by its uuid. All fields are optional; only supplied fields change. Accepts staff_id (uuid or null), starts_at, ends_at, capacity, location, waitlist_enabled, timezone and status (scheduled/cancelled/completed). PATCH is also accepted. - [Add a note to a contact](https://docs.dmly.io/api-reference/contacts/add-a-note-to-a-contact.md): Appends a timeline note to the contact. - [Add tags to a contact](https://docs.dmly.io/api-reference/contacts/add-tags-to-a-contact.md): Adds tags by name (creating any that don't exist) without removing existing ones. Fires contact.tagged per newly-attached tag. - [Create a contact](https://docs.dmly.io/api-reference/contacts/create-a-contact.md): Creates a contact. If a channel uuid is supplied, a channel identity is attached. Fires the contact.created webhook. - [Delete a contact](https://docs.dmly.io/api-reference/contacts/delete-a-contact.md): Deletes a contact and cascades its identities, messages, notes and tag links. - [Get a contact](https://docs.dmly.io/api-reference/contacts/get-a-contact.md): Returns a single contact by its id, with tags and pipeline stage. - [List contacts](https://docs.dmly.io/api-reference/contacts/list-contacts.md): Paginated list of contacts (DMLY's unified person record). A 'client' is simply a contact with lifecycle_stage=client. - [Remove tags from a contact](https://docs.dmly.io/api-reference/contacts/remove-tags-from-a-contact.md): Detaches the named tags from the contact. Fires contact.untagged per removed tag. - [Set a contact's lifecycle stage](https://docs.dmly.io/api-reference/contacts/set-a-contacts-lifecycle-stage.md): Moves the contact along the CRM lifecycle. 'client' converts via the lifecycle service (creates a client profile); 'lead' downgrades (blocked if commercial records exist). - [Set a contact's pipeline stage](https://docs.dmly.io/api-reference/contacts/set-a-contacts-pipeline-stage.md): Moves the contact to a pipeline stage (or clears it with null). Fires contact.stage_changed. - [Update a contact](https://docs.dmly.io/api-reference/contacts/update-a-contact.md): Updates a contact's fields. Fires the contact.updated webhook. - [List conversations (the unified inbox).](https://docs.dmly.io/api-reference/conversations-&-messages/list-conversations-the-unified-inbox.md): Returns the workspace's conversations — Contacts that have an inbox presence — ordered by most recent activity (last_interaction_at, then id). Each item carries the conversation rollups: name, platform, last_message preview, unread_count, inbox_status and last_interaction_at. The conversation id is… - [List the messages in one conversation thread.](https://docs.dmly.io/api-reference/conversations-&-messages/list-the-messages-in-one-conversation-thread.md): Returns the messages for the conversation identified by the contact uuid in the path, oldest-first (ascending id) and paginated. Each message exposes id (message uuid), direction (inbound/outbound), type (text/image/video/audio/file/template/system), kind, body, media, status (sent/delivered/read/fa… - [Send a message into a conversation.](https://docs.dmly.io/api-reference/conversations-&-messages/send-a-message-into-a-conversation.md): Sends an outbound message to the contact identified by contact_id (a contact uuid), routed through the same InboxService used by the dashboard composer — so it is delivered on the contact's active channel, recorded on the thread, broadcast to open inboxes, and fires the standard message.sent / messa… - [Errors](https://docs.dmly.io/api-reference/errors.md): Conventional HTTP status codes, with a consistent JSON error body. - [Create a draft invoice from line items.](https://docs.dmly.io/api-reference/finance-—-invoices/create-a-draft-invoice-from-line-items.md): Creates a draft invoice from snapshotted line items via InvoiceService::createFromLineItems. contact_id is the optional contact uuid; supplying it converts the contact to a client. Each line item snapshots name/unit_price/tax at invoice time. Totals are computed server-side. Returns 201 with the cre… - [List invoices for the workspace.](https://docs.dmly.io/api-reference/finance-—-invoices/list-invoices-for-the-workspace.md): Returns a paginated list of invoices, most recent first, each with its embedded contact and inline line items. Filter by status, contact (uuid) and issue-date range. - [Record a manual payment against an invoice.](https://docs.dmly.io/api-reference/finance-—-invoices/record-a-manual-payment-against-an-invoice.md): Records a manual payment for the invoice's contact via PaymentService::recordManual (provider=manual, advanced to succeeded) then recomputes the invoice's paid/due/status via InvoiceService::recordPayment. Fails with 422 if the invoice has no contact. Returns the updated invoice. - [Retrieve a single invoice.](https://docs.dmly.io/api-reference/finance-—-invoices/retrieve-a-single-invoice.md): Returns one invoice by its uuid, including the embedded contact and inline line items (name, unit_price, quantity, total). - [Send (finalise) an invoice.](https://docs.dmly.io/api-reference/finance-—-invoices/send-finalise-an-invoice.md): Finalises a draft invoice to 'sent' and posts the statement debit via InvoiceService::send. No-op on an already-void invoice. Returns the updated invoice. - [Void an invoice.](https://docs.dmly.io/api-reference/finance-—-invoices/void-an-invoice.md): Voids the invoice (never deletes) via InvoiceService::void, posting an offsetting statement credit for any still-open receivable. No-op on an already-void invoice. Returns the updated invoice. - [Cancel an order.](https://docs.dmly.io/api-reference/finance-—-orders/cancel-an-order.md): Cancels an order via OrderService::cancel, restoring any product stock that was decremented on confirmation and clawing back loyalty earned. Returns the updated order. - [Confirm an order.](https://docs.dmly.io/api-reference/finance-—-orders/confirm-an-order.md): Confirms a draft order via OrderService::confirm, moving it to confirmed and decrementing tracked product stock exactly once per line item. Cancelled or refunded orders are returned unchanged. Returns the updated order. - [Create a draft order from offering/custom selections.](https://docs.dmly.io/api-reference/finance-—-orders/create-a-draft-order-from-offeringcustom-selections.md): Builds a new draft order via OrderService::createFromOfferings. Each item is a selection: type service|product|plan resolves the offering by its uuid (catalogue price/tax, optionally overridden), or type custom for a free-form line. Prices, tax and totals are computed server-side; an optional coupon… - [List orders (paginated).](https://docs.dmly.io/api-reference/finance-—-orders/list-orders-paginated.md): Returns the workspace's internal orders, newest first, with the embedded contact and snapshotted line items. Filterable by status and contact. - [Retrieve a single order.](https://docs.dmly.io/api-reference/finance-—-orders/retrieve-a-single-order.md): Returns one order by its uuid, with the embedded contact and snapshotted line items. - [Create a discount coupon.](https://docs.dmly.io/api-reference/finance-—-payments-&-coupons/create-a-discount-coupon.md): Creates a coupon. The code is uppercased; a percent-type value is capped at 100%. Returns the created coupon (201). - [Delete a discount coupon.](https://docs.dmly.io/api-reference/finance-—-payments-&-coupons/delete-a-discount-coupon.md): Deletes a coupon resolved by its uuid. Returns {"deleted": true}. - [List discount coupons.](https://docs.dmly.io/api-reference/finance-—-payments-&-coupons/list-discount-coupons.md): Returns a paginated list of discount coupons for the current workspace, newest first. Supports a free-text code search and an active filter. - [List payments in the unified ledger.](https://docs.dmly.io/api-reference/finance-—-payments-&-coupons/list-payments-in-the-unified-ledger.md): Returns a paginated list of payments (manual + gateway) for the current workspace, newest first. Each payment embeds its contact and, when present, a lightweight invoice reference. Supports filtering by status, contact, and payment-date range. - [Record a manual payment for a contact.](https://docs.dmly.io/api-reference/finance-—-payments-&-coupons/record-a-manual-payment-for-a-contact.md): Records a manual (non-gateway) payment via PaymentService::recordManual. The payment is advanced straight to succeeded through the same path as a gateway webhook, posting a statement credit, converting the contact to a client, and updating their balance/LTV. Returns the created payment (201). - [Refund a payment (full or partial).](https://docs.dmly.io/api-reference/finance-—-payments-&-coupons/refund-a-payment-full-or-partial.md): Refunds a succeeded payment via PaymentService::refund. Posts an offsetting statement debit (never deletes the row), updates any linked invoice, and claws back loyalty earned. Omit amount for a full refund or supply a partial amount. Returns the updated payment. - [Retrieve a single coupon.](https://docs.dmly.io/api-reference/finance-—-payments-&-coupons/retrieve-a-single-coupon.md): Returns a single coupon resolved by its uuid. - [Retrieve a single payment.](https://docs.dmly.io/api-reference/finance-—-payments-&-coupons/retrieve-a-single-payment.md): Returns a single payment resolved by its uuid, with the embedded contact and invoice reference. - [Update a discount coupon (PUT or PATCH).](https://docs.dmly.io/api-reference/finance-—-payments-&-coupons/update-a-discount-coupon-put-or-patch.md): Updates a coupon resolved by its uuid. Accepts the same body as create; the code is uppercased and a percent-type value is capped at 100%. Returns the updated coupon. - [Cancel a subscription.](https://docs.dmly.io/api-reference/finance-—-subscriptions/cancel-a-subscription.md): Cancels the subscription (clearing its next billing date) if it is not already cancelled. Returns the updated subscription. - [List subscriptions for the workspace.](https://docs.dmly.io/api-reference/finance-—-subscriptions/list-subscriptions-for-the-workspace.md): Returns a paginated list of the workspace's subscriptions, newest first. Filter by status and/or contact. Each item embeds its contact (full ContactResource) and a lightweight plan object. - [Pause an active subscription.](https://docs.dmly.io/api-reference/finance-—-subscriptions/pause-an-active-subscription.md): Pauses the subscription if it is currently active (no-op otherwise). Returns the updated subscription. - [Resume a paused subscription.](https://docs.dmly.io/api-reference/finance-—-subscriptions/resume-a-paused-subscription.md): Resumes the subscription if it is currently paused (no-op otherwise). Returns the updated subscription. - [Retrieve a single subscription.](https://docs.dmly.io/api-reference/finance-—-subscriptions/retrieve-a-single-subscription.md): Returns one subscription by its uuid, with the embedded contact and plan. - [Subscribe a contact to a plan.](https://docs.dmly.io/api-reference/finance-—-subscriptions/subscribe-a-contact-to-a-plan.md): Creates a subscription for a contact from a plan. Billing cadence, granted contents and (by default) price/currency are snapshotted from the plan; price and currency may be overridden. Credits are granted into the contact's credit ledger and the contact is converted to a client. Returns the created… - [Introduction](https://docs.dmly.io/api-reference/introduction.md): The DMLY REST API — contacts, conversations, broadcasts, bookings, finance, webhooks and media. - [Delete a media item.](https://docs.dmly.io/api-reference/media/delete-a-media-item.md): Detaches the media from any post versions that reference it, deletes the underlying files (including conversions) from storage, then removes the record. Returns {"deleted": true}. - [List media library items (paginated).](https://docs.dmly.io/api-reference/media/list-media-library-items-paginated.md): Returns the workspace's media library (images, videos, gifs), newest first. Workspace scoping is automatic. Supports an optional name search and standard pagination. - [Retrieve a single media item.](https://docs.dmly.io/api-reference/media/retrieve-a-single-media-item.md): Returns one media item resolved by its public id (uuid). 404 if it does not exist in the current workspace. - [Upload a file to the media library.](https://docs.dmly.io/api-reference/media/upload-a-file-to-the-media-library.md): Uploads a single file via multipart/form-data and creates a Media record. Reuses the dashboard upload pipeline (storage on the configured disk plus thumbnail/video conversions). Returns the created media item with HTTP 201. Send the request as multipart/form-data with a 'file' part (not JSON). - [Create a plan/package.](https://docs.dmly.io/api-reference/offerings-—-products-&-plans/create-a-planpackage.md): Creates a plan via the OfferingService write seam (syncs line items and fires PlanCreated/PlanActivated events). For recurring plans, billing_interval defaults to month and interval_count to 1 when omitted. Each item references a service/product by uuid; credit items grant a credit pool. category_id… - [Create a product.](https://docs.dmly.io/api-reference/offerings-—-products-&-plans/create-a-product.md): Creates a product via the OfferingService write seam (records the stock ledger opening balance when tracking stock and fires the ProductCreated event). category_id, when supplied, is a ServiceCategory uuid. Returns 201 with the created product. - [Delete a plan/package.](https://docs.dmly.io/api-reference/offerings-—-products-&-plans/delete-a-planpackage.md): Deletes a plan and its line items. Returns {deleted:true}. - [Delete a product.](https://docs.dmly.io/api-reference/offerings-—-products-&-plans/delete-a-product.md): Deletes a product and its stock movements. A product bundled into a plan is deactivated instead of deleted to preserve referential integrity; in that case the response is {deleted:false} with an explanatory message. - [Get a single plan/package.](https://docs.dmly.io/api-reference/offerings-—-products-&-plans/get-a-single-planpackage.md): Returns one plan resolved by its uuid, with its category and granted line items (services, products, credits) embedded. - [Get a single product.](https://docs.dmly.io/api-reference/offerings-—-products-&-plans/get-a-single-product.md): Returns one product resolved by its uuid, with its category embedded. - [List plans/packages in the Offerings catalogue.](https://docs.dmly.io/api-reference/offerings-—-products-&-plans/list-planspackages-in-the-offerings-catalogue.md): Returns a paginated list of plans (one-time packages or recurring memberships) ordered by sort_order then name, with category and granted line items embedded. Workspace-scoped automatically. - [List products in the Offerings catalogue.](https://docs.dmly.io/api-reference/offerings-—-products-&-plans/list-products-in-the-offerings-catalogue.md): Returns a paginated list of products (sellable goods) ordered by sort_order then name. Each product is workspace-scoped automatically. Supports keyword, active, low-stock and category filters. - [Update a plan/package (PUT or PATCH).](https://docs.dmly.io/api-reference/offerings-—-products-&-plans/update-a-planpackage-put-or-patch.md): Updates a plan via the OfferingService write seam. When items are supplied they fully replace the plan's existing line items. Fires PlanUpdated and PlanActivated/PlanDeactivated when the active flag changes. category_id is a ServiceCategory uuid. - [Update a product (PUT or PATCH).](https://docs.dmly.io/api-reference/offerings-—-products-&-plans/update-a-product-put-or-patch.md): Updates a product via the OfferingService write seam. When the product tracks stock and stock_quantity is supplied, the stock level is reset through the ledger; turning track_stock off clears the quantity. Fires the ProductUpdated event. category_id is a ServiceCategory uuid. - [Pagination](https://docs.dmly.io/api-reference/pagination.md): List endpoints return data, links and meta. Page with ?page and size with ?per_page. - [Rate limits](https://docs.dmly.io/api-reference/rate-limits.md): 60 requests per minute, counted per IP address rather than per API key. - [Create a saved contact segment.](https://docs.dmly.io/api-reference/segments/create-a-saved-contact-segment.md): Creates a new contact filter. name is required (max 80). stage is an optional stage uuid. include_tags/exclude_tags are arrays of tag uuids (contacts must have ALL include tags and NONE of the exclude tags). min_days_inactive filters to contacts with no interaction for at least N days. - [Delete a saved contact segment.](https://docs.dmly.io/api-reference/segments/delete-a-saved-contact-segment.md): Deletes a segment by uuid. Returns {"deleted": true}. The underlying contacts are not affected. - [List saved contact segments.](https://docs.dmly.io/api-reference/segments/list-saved-contact-segments.md): Returns a paginated list of the workspace's saved contact filters. Each segment includes its embedded stage, include/exclude tag uuids, recency threshold, and a live contacts_count computed from the current matching contacts. - [List the contacts matching a segment.](https://docs.dmly.io/api-reference/segments/list-the-contacts-matching-a-segment.md): Returns a paginated list of the contacts that currently match the segment's filter criteria (stage + include/exclude tags + recency), as full contact resources with their tags and stage loaded. - [Retrieve a single segment.](https://docs.dmly.io/api-reference/segments/retrieve-a-single-segment.md): Returns one saved contact segment by its uuid, including its embedded stage, tag uuids, recency threshold, and live contacts_count. - [Update a saved contact segment.](https://docs.dmly.io/api-reference/segments/update-a-saved-contact-segment.md): Updates a segment by uuid. All fields are optional; only supplied fields are changed. Same validation rules as create (name max 80, stage uuid, tag uuid arrays, min_days_inactive >= 0). Accepts PUT or PATCH. - [Create a catalogue service.](https://docs.dmly.io/api-reference/services-&-service-categories/create-a-catalogue-service.md): Creates an appointment, class, or add-on service. category (a ServiceCategory uuid) is resolved server-side. payment_mode sets payment_required automatically. For add_on, booking-policy fields are forced to non-bookable defaults; capacity only applies to class. A unique slug is generated from the na… - [Create a service category.](https://docs.dmly.io/api-reference/services-&-service-categories/create-a-service-category.md): Creates a catalogue category. A unique slug is generated from the name and sort_order is auto-assigned (max+1). Returns 201. - [Delete a category.](https://docs.dmly.io/api-reference/services-&-service-categories/delete-a-category.md): Deletes a category resolved by uuid. Any linked services, products and plans are first detached (category_id set to null) so they fall back to 'no category' rather than orphaning. Returns deleted=true. - [Delete (or deactivate) a service.](https://docs.dmly.io/api-reference/services-&-service-categories/delete-or-deactivate-a-service.md): Deletes a service resolved by uuid. If the service has bookings it is deactivated (active=false) instead of deleted to preserve history; the response then has deleted=false with an explanatory message. Otherwise returns deleted=true. - [List catalogue services (paginated).](https://docs.dmly.io/api-reference/services-&-service-categories/list-catalogue-services-paginated.md): Returns a paginated list of services for the current workspace, ordered by sort_order then name. Each service embeds its category (id=uuid, name, kind) when present. Supports filtering by type, category, and a name search. - [List service categories (paginated).](https://docs.dmly.io/api-reference/services-&-service-categories/list-service-categories-paginated.md): Returns a paginated list of catalogue categories for the current workspace, ordered by sort_order then name, each with a services_count. Supports filtering by kind and a name search. - [Retrieve a single category.](https://docs.dmly.io/api-reference/services-&-service-categories/retrieve-a-single-category.md): Returns one category (resolved by its uuid) with its services_count. 404 if not found in the current workspace. - [Retrieve a single service.](https://docs.dmly.io/api-reference/services-&-service-categories/retrieve-a-single-service.md): Returns one service (resolved by its uuid) with its embedded category. 404 if not found in the current workspace. - [Update a category (full or partial).](https://docs.dmly.io/api-reference/services-&-service-categories/update-a-category-full-or-partial.md): Updates a category resolved by uuid. Accepts PUT or PATCH; all fields optional. Unspecified fields are left untouched. - [Update a service (full or partial).](https://docs.dmly.io/api-reference/services-&-service-categories/update-a-service-full-or-partial.md): Updates a service resolved by uuid. Accepts PUT or PATCH; all fields are optional and unspecified fields are left untouched. type changes re-shape add_on/class-specific fields. payment_mode resets payment_required. slug is preserved. Dispatches ServiceUpdated (plus ServiceActivated/Deactivated when… - [Add time off for a staff member.](https://docs.dmly.io/api-reference/staff/add-time-off-for-a-staff-member.md): Creates an availability override of type time_off for the staff member, subtracting hours over the given UTC window. starts_at and ends_at are required (ends_at must be >= starts_at). Returns 201 with the created override. - [Create a staff member.](https://docs.dmly.io/api-reference/staff/create-a-staff-member.md): Creates a bookable staff member. Only name is required; accepts_bookings and active default to true. Returns 201 with the created staff. - [Delete a staff member.](https://docs.dmly.io/api-reference/staff/delete-a-staff-member.md): Deletes the staff member identified by its uuid. Returns {"deleted": true}. - [Delete a staff member's time off.](https://docs.dmly.io/api-reference/staff/delete-a-staff-members-time-off.md): Deletes the availability override (identified by its uuid) belonging to the given staff member. Returns {"deleted": true}. - [Get a staff member's availability.](https://docs.dmly.io/api-reference/staff/get-a-staff-members-availability.md): Returns the staff member's weekly working-hours rules (day_of_week 0=Sun..6=Sat with HH:MM start/end in the staff timezone) plus any one-off overrides (block / time_off / extra). Optional from/to dates constrain which overrides are returned; the weekly rules are always returned in full. - [List bookable staff members.](https://docs.dmly.io/api-reference/staff/list-bookable-staff-members.md): Returns a paginated list of staff members, ordered by sort_order then name. Supports search and active/accepts_bookings filters. - [Retrieve a single staff member.](https://docs.dmly.io/api-reference/staff/retrieve-a-single-staff-member.md): Returns the staff member identified by its uuid. - [Update a staff member.](https://docs.dmly.io/api-reference/staff/update-a-staff-member.md): Updates the staff member identified by its uuid. All fields are optional; only supplied fields are changed. Also accepts PATCH. - [Create a tag](https://docs.dmly.io/api-reference/tags/create-a-tag.md): Creates a tag (or returns the existing one with the same name). - [Delete a tag](https://docs.dmly.io/api-reference/tags/delete-a-tag.md): Deletes a tag and detaches it from contacts. The built-in 'Unsubscribe' tag cannot be deleted. - [Get a tag](https://docs.dmly.io/api-reference/tags/get-a-tag.md): Returns a single tag by id. - [List tags](https://docs.dmly.io/api-reference/tags/list-tags.md): Paginated list of contact tags with contact counts. - [Update a tag](https://docs.dmly.io/api-reference/tags/update-a-tag.md): Renames or recolours a tag. - [Webhooks](https://docs.dmly.io/api-reference/webhooks.md): Subscribe to 73 events and DMLY posts to your endpoint as they happen. - [Appointment cancelled](https://docs.dmly.io/api-reference/webhooks-appointments/appointment-cancelled.md): Sent to your endpoint when **Appointment cancelled** occurs (`booking.cancelled`). - [Appointment completed](https://docs.dmly.io/api-reference/webhooks-appointments/appointment-completed.md): Sent to your endpoint when **Appointment completed** occurs (`appointment.completed`). - [Appointment confirmed](https://docs.dmly.io/api-reference/webhooks-appointments/appointment-confirmed.md): Sent to your endpoint when **Appointment confirmed** occurs (`appointment.confirmed`). - [Appointment no show](https://docs.dmly.io/api-reference/webhooks-appointments/appointment-no-show.md): Sent to your endpoint when **Appointment no-show** occurs (`appointment.no_show`). - [Appointment reminder due](https://docs.dmly.io/api-reference/webhooks-appointments/appointment-reminder-due.md): Sent to your endpoint when **Appointment reminder due** occurs (`appointment.reminder_due`). - [Appointment rescheduled](https://docs.dmly.io/api-reference/webhooks-appointments/appointment-rescheduled.md): Sent to your endpoint when **Appointment rescheduled** occurs (`booking.rescheduled`). - [Appointment scheduled](https://docs.dmly.io/api-reference/webhooks-appointments/appointment-scheduled.md): Sent to your endpoint when **Appointment scheduled** occurs (`booking.created`). - [Appointment starts soon](https://docs.dmly.io/api-reference/webhooks-appointments/appointment-starts-soon.md): Sent to your endpoint when **Appointment starts soon** occurs (`appointment.starts_soon`). - [Automation completed](https://docs.dmly.io/api-reference/webhooks-automations/automation-completed.md): Sent to your endpoint when **Automation completed** occurs (`automation.completed`). - [Automation failed](https://docs.dmly.io/api-reference/webhooks-automations/automation-failed.md): Sent to your endpoint when **Automation failed** occurs (`automation.failed`). - [Automation triggered](https://docs.dmly.io/api-reference/webhooks-automations/automation-triggered.md): Sent to your endpoint when **Automation triggered** occurs (`automation.triggered`). - [Broadcast completed](https://docs.dmly.io/api-reference/webhooks-broadcasts/broadcast-completed.md): Sent to your endpoint when **Broadcast completed** occurs (`broadcast.completed`). - [Broadcast failed](https://docs.dmly.io/api-reference/webhooks-broadcasts/broadcast-failed.md): Sent to your endpoint when **Broadcast failed** occurs (`broadcast.failed`). - [Broadcast sent](https://docs.dmly.io/api-reference/webhooks-broadcasts/broadcast-sent.md): Sent to your endpoint when **Broadcast sent** occurs (`broadcast.sent`). - [Call completed](https://docs.dmly.io/api-reference/webhooks-calls/call-completed.md): Sent to your endpoint when **Call completed** occurs (`call.completed`). - [Call declined](https://docs.dmly.io/api-reference/webhooks-calls/call-declined.md): Sent to your endpoint when **Call declined** occurs (`call.rejected`). - [Incoming call](https://docs.dmly.io/api-reference/webhooks-calls/incoming-call.md): Sent to your endpoint when **Incoming call** occurs (`call.incoming`). - [Missed call](https://docs.dmly.io/api-reference/webhooks-calls/missed-call.md): Sent to your endpoint when **Missed call** occurs (`call.missed`). - [Class booked](https://docs.dmly.io/api-reference/webhooks-classes/class-booked.md): Sent to your endpoint when **Class booked** occurs (`class.booked`). - [Class cancelled](https://docs.dmly.io/api-reference/webhooks-classes/class-cancelled.md): Sent to your endpoint when **Class cancelled** occurs (`class.cancelled`). - [Class full](https://docs.dmly.io/api-reference/webhooks-classes/class-full.md): Sent to your endpoint when **Class full** occurs (`class.full`). - [Class seat opened](https://docs.dmly.io/api-reference/webhooks-classes/class-seat-opened.md): Sent to your endpoint when **Class seat opened** occurs (`class.seat_opened`). - [Class starts soon](https://docs.dmly.io/api-reference/webhooks-classes/class-starts-soon.md): Sent to your endpoint when **Class starts soon** occurs (`class.starts_soon`). - [Joined class waitlist](https://docs.dmly.io/api-reference/webhooks-classes/joined-class-waitlist.md): Sent to your endpoint when **Joined class waitlist** occurs (`class.waitlisted`). - [Became a client](https://docs.dmly.io/api-reference/webhooks-contacts-and-clients/became-a-client.md): Sent to your endpoint when **Became a client** occurs (`contact.converted_to_client`). - [Birthday key date](https://docs.dmly.io/api-reference/webhooks-contacts-and-clients/birthday-key-date.md): Sent to your endpoint when **Birthday / key date** occurs (`contact.date_reached`). - [Contact updated](https://docs.dmly.io/api-reference/webhooks-contacts-and-clients/contact-updated.md): Sent to your endpoint when **Contact updated** occurs (`contact.updated`). - [Lifecycle changed](https://docs.dmly.io/api-reference/webhooks-contacts-and-clients/lifecycle-changed.md): Sent to your endpoint when **Lifecycle changed** occurs (`contact.lifecycle_changed`). - [New contact](https://docs.dmly.io/api-reference/webhooks-contacts-and-clients/new-contact.md): Sent to your endpoint when **New contact** occurs (`contact.created`). - [Pipeline stage changed](https://docs.dmly.io/api-reference/webhooks-contacts-and-clients/pipeline-stage-changed.md): Sent to your endpoint when **Pipeline stage changed** occurs (`contact.stage_changed`). - [Tag added](https://docs.dmly.io/api-reference/webhooks-contacts-and-clients/tag-added.md): Sent to your endpoint when **Tag added** occurs (`contact.tagged`). - [Tag removed](https://docs.dmly.io/api-reference/webhooks-contacts-and-clients/tag-removed.md): Sent to your endpoint when **Tag removed** occurs (`contact.untagged`). - [Conversation assigned](https://docs.dmly.io/api-reference/webhooks-conversations/conversation-assigned.md): Sent to your endpoint when **Conversation assigned** occurs (`conversation.assigned`). - [Conversation closed](https://docs.dmly.io/api-reference/webhooks-conversations/conversation-closed.md): Sent to your endpoint when **Conversation closed** occurs (`conversation.closed`). - [Inbound message received](https://docs.dmly.io/api-reference/webhooks-conversations/inbound-message-received.md): Sent to your endpoint when **Inbound message received** occurs (`message.received`). - [Invoice created draft](https://docs.dmly.io/api-reference/webhooks-invoices/invoice-created-draft.md): Sent to your endpoint when **Invoice created (draft)** occurs (`invoice.created`). - [Invoice fully paid](https://docs.dmly.io/api-reference/webhooks-invoices/invoice-fully-paid.md): Sent to your endpoint when **Invoice fully paid** occurs (`invoice.paid`). - [Invoice overdue](https://docs.dmly.io/api-reference/webhooks-invoices/invoice-overdue.md): Sent to your endpoint when **Invoice overdue** occurs (`invoice.overdue`). - [Invoice partially paid](https://docs.dmly.io/api-reference/webhooks-invoices/invoice-partially-paid.md): Sent to your endpoint when **Invoice partially paid** occurs (`invoice.partially_paid`). - [Invoice sent](https://docs.dmly.io/api-reference/webhooks-invoices/invoice-sent.md): Sent to your endpoint when **Invoice sent** occurs (`invoice.sent`). - [Invoice voided](https://docs.dmly.io/api-reference/webhooks-invoices/invoice-voided.md): Sent to your endpoint when **Invoice voided** occurs (`invoice.voided`). - [Message delivered](https://docs.dmly.io/api-reference/webhooks-message-lifecycle/message-delivered.md): Sent to your endpoint when **Message delivered** occurs (`message.delivered`). - [Message failed](https://docs.dmly.io/api-reference/webhooks-message-lifecycle/message-failed.md): Sent to your endpoint when **Message failed** occurs (`message.failed`). - [Message read seen](https://docs.dmly.io/api-reference/webhooks-message-lifecycle/message-read-seen.md): Sent to your endpoint when **Message read / seen** occurs (`message.read_or_seen`). - [Message sent](https://docs.dmly.io/api-reference/webhooks-message-lifecycle/message-sent.md): Sent to your endpoint when **Message sent** occurs (`message.sent`). - [Coupon redeemed](https://docs.dmly.io/api-reference/webhooks-offerings-and-credits/coupon-redeemed.md): Sent to your endpoint when **Coupon redeemed** occurs (`coupon.redeemed`). - [Credits issued](https://docs.dmly.io/api-reference/webhooks-offerings-and-credits/credits-issued.md): Sent to your endpoint when **Credits issued** occurs (`credits.issued`). - [Credits low](https://docs.dmly.io/api-reference/webhooks-offerings-and-credits/credits-low.md): Sent to your endpoint when **Credits low** occurs (`credits.low`). - [Credits used](https://docs.dmly.io/api-reference/webhooks-offerings-and-credits/credits-used.md): Sent to your endpoint when **Credits used** occurs (`credits.used`). - [Product back in stock](https://docs.dmly.io/api-reference/webhooks-offerings-and-credits/product-back-in-stock.md): Sent to your endpoint when **Product back in stock** occurs (`offering.back_in_stock`). - [Product stock low](https://docs.dmly.io/api-reference/webhooks-offerings-and-credits/product-stock-low.md): Sent to your endpoint when **Product stock low** occurs (`offering.stock_low`). - [Order cancelled](https://docs.dmly.io/api-reference/webhooks-orders/order-cancelled.md): Sent to your endpoint when **Order cancelled** occurs (`order.cancelled`). - [Order confirmed](https://docs.dmly.io/api-reference/webhooks-orders/order-confirmed.md): Sent to your endpoint when **Order confirmed** occurs (`order.confirmed`). - [Order created](https://docs.dmly.io/api-reference/webhooks-orders/order-created.md): Sent to your endpoint when **Order created** occurs (`order.created`). - [Order paid](https://docs.dmly.io/api-reference/webhooks-orders/order-paid.md): Sent to your endpoint when **Order paid** occurs (`order.paid`). - [Payment failed](https://docs.dmly.io/api-reference/webhooks-payments/payment-failed.md): Sent to your endpoint when **Payment failed** occurs (`payment.failed`). - [Payment refunded](https://docs.dmly.io/api-reference/webhooks-payments/payment-refunded.md): Sent to your endpoint when **Payment refunded** occurs (`payment.refunded`). - [Payment succeeded](https://docs.dmly.io/api-reference/webhooks-payments/payment-succeeded.md): Sent to your endpoint when **Payment succeeded** occurs (`payment.succeeded`). - [Checkout abandoned](https://docs.dmly.io/api-reference/webhooks-store-e-commerce/checkout-abandoned.md): Sent to your endpoint when **Checkout abandoned** occurs (`store.checkout_abandoned`). - [Customer milestone](https://docs.dmly.io/api-reference/webhooks-store-e-commerce/customer-milestone.md): Sent to your endpoint when **Customer milestone** occurs (`store.customer_milestone`). - [Inventory low](https://docs.dmly.io/api-reference/webhooks-store-e-commerce/inventory-low.md): Sent to your endpoint when **Inventory low** occurs (`store.inventory_low`). - [Product back in stock store](https://docs.dmly.io/api-reference/webhooks-store-e-commerce/product-back-in-stock-store.md): Sent to your endpoint when **Product back in stock (store)** occurs (`store.product_back_in_stock`). - [Store order cancelled](https://docs.dmly.io/api-reference/webhooks-store-e-commerce/store-order-cancelled.md): Sent to your endpoint when **Store order cancelled** occurs (`store.order_cancelled`). - [Store order paid](https://docs.dmly.io/api-reference/webhooks-store-e-commerce/store-order-paid.md): Sent to your endpoint when **Store order paid** occurs (`store.order_paid`). - [Store order placed](https://docs.dmly.io/api-reference/webhooks-store-e-commerce/store-order-placed.md): Sent to your endpoint when **Store order placed** occurs (`store.order_created`). - [Store order refunded](https://docs.dmly.io/api-reference/webhooks-store-e-commerce/store-order-refunded.md): Sent to your endpoint when **Store order refunded** occurs (`store.order_refunded`). - [Store order shipped](https://docs.dmly.io/api-reference/webhooks-store-e-commerce/store-order-shipped.md): Sent to your endpoint when **Store order shipped** occurs (`store.order_fulfilled`). - [Store payment failed](https://docs.dmly.io/api-reference/webhooks-store-e-commerce/store-payment-failed.md): Sent to your endpoint when **Store payment failed** occurs (`store.payment_failed`). - [Subscription cancelled](https://docs.dmly.io/api-reference/webhooks-subscriptions/subscription-cancelled.md): Sent to your endpoint when **Subscription cancelled** occurs (`subscription.cancelled`). - [Subscription created](https://docs.dmly.io/api-reference/webhooks-subscriptions/subscription-created.md): Sent to your endpoint when **Subscription created** occurs (`subscription.created`). - [Subscription paused](https://docs.dmly.io/api-reference/webhooks-subscriptions/subscription-paused.md): Sent to your endpoint when **Subscription paused** occurs (`subscription.paused`). - [Subscription payment failed](https://docs.dmly.io/api-reference/webhooks-subscriptions/subscription-payment-failed.md): Sent to your endpoint when **Subscription payment failed** occurs (`subscription.payment_failed`). - [Subscription renewed](https://docs.dmly.io/api-reference/webhooks-subscriptions/subscription-renewed.md): Sent to your endpoint when **Subscription renewed** occurs (`subscription.renewed`). - [Create or update the webhook endpoint and subscribed events.](https://docs.dmly.io/api-reference/webhooks/create-or-update-the-webhook-endpoint-and-subscribed-events.md): Saves the workspace's outbound webhook subscription and marks it connected. `url` (alias `endpoint`) must be a public https URL — private/internal/unreachable hosts are rejected with 422. `events` must be a non-empty array of topics from the catalogue (GET /webhooks/events); unknown topics are rejec… - [Disconnect the webhook (clear endpoint, events and secret).](https://docs.dmly.io/api-reference/webhooks/disconnect-the-webhook-clear-endpoint-events-and-secret.md): Disconnects the workspace's outbound webhook: clears the endpoint, subscribed events, channel scope and signing secret, and sets the status to disconnected. No further events will be delivered until a new subscription is saved via PUT /webhooks. Returns {"deleted": true}. - [Get the current webhook subscription for the workspace.](https://docs.dmly.io/api-reference/webhooks/get-the-current-webhook-subscription-for-the-workspace.md): Returns the workspace's single outbound webhook configuration: the destination endpoint URL, the list of subscribed event topics, the channel scope, the connection status (connected/disconnected/error), and whether a signing secret is set (has_secret). The signing secret value itself is never return… - [List the full subscribable event catalogue, grouped.](https://docs.dmly.io/api-reference/webhooks/list-the-full-subscribable-event-catalogue-grouped.md): Returns the complete catalogue of webhook event topics you can subscribe to, organised into ordered display groups (Contacts & clients, Conversations, Message lifecycle, Appointments, Classes, Invoices, Orders, Payments, Subscriptions, Offerings & credits, Store, Automations, Broadcasts). Each group… - [Booking page](https://docs.dmly.io/appointments/booking-page.md): Your public booking page: its address, what a contact sees and does, and how to share it on WhatsApp. - [Sync Google Calendar and Zoom](https://docs.dmly.io/appointments/calendar-sync.md): Connect Google Calendar so bookings and external events keep each other honest, and Zoom so bookings get a join link automatically. - [Run group classes](https://docs.dmly.io/appointments/classes.md): Schedule classes with a seat capacity and a waitlist, and control what happens when a place opens up. - [Connect a custom booking domain](https://docs.dmly.io/appointments/custom-domain.md): Serve your DMLY booking page on your own domain, such as book.yourbusiness.com, with SSL issued automatically. - [Meetings](https://docs.dmly.io/appointments/meetings.md): Meetings is DMLY's older booking hub — it no longer appears in the sidebar, and Appointments and Offerings replace it. - [Appointments overview](https://docs.dmly.io/appointments/overview.md): How the Appointments module fits together: services live under Offerings, staff carry the availability, and clients book on your public page. - [Take payment for a booking](https://docs.dmly.io/appointments/payments.md): Charge for an appointment with one of three payment modes — no payment, pay after, or pay before with a 15-minute slot hold. - [Bookable services](https://docs.dmly.io/appointments/services.md): A service is the thing a client books — its duration, price and payment mode drive every slot your booking page offers. - [Staff and availability](https://docs.dmly.io/appointments/staff-and-availability.md): Add staff, set their working hours and services, and understand exactly how DMLY works out which slots a client can book. - [AI agent tools](https://docs.dmly.io/automation/ai-agent-tools.md): Switch on the CRM, booking, document search and web tools an AI Reply node can use to act, not just answer. - [Reply with AI](https://docs.dmly.io/automation/ai-replies.md): Add an AI Reply step to an automation so an assistant answers your contacts in your own words. - [Bot setup](https://docs.dmly.io/automation/bot-setup.md): Configure each channel's bot — its welcome, ice breakers, menu and default reply — from one page that changes with the channel you have selected. - [Automate comments and comment-to-DM](https://docs.dmly.io/automation/comment-automation.md): Reply to comments automatically, DM commenters privately, and hide or delete unwanted comments on Facebook, Instagram and TikTok. - [Common mistakes](https://docs.dmly.io/automation/common-mistakes.md): Why a bot never replies, why publish is blocked, and the WhatsApp and AI traps that catch most flows. - [Build a flow](https://docs.dmly.io/automation/flow-builder.md): How the flow builder canvas works, and which step groups you get on each channel. - [Set up ice breakers](https://docs.dmly.io/automation/icebreakers.md): Offer first-time contacts tappable questions that answer them or start a flow, and see what each channel actually supports. - [Build a lead qualification bot](https://docs.dmly.io/automation/lead-qualification.md): Install a ready-made lead qualification template, tune it, and publish a bot that captures interest, tags hot leads and hands them to a human. - [How automation works](https://docs.dmly.io/automation/overview.md): What an Automation is in DMLY, the two ways to build one, what can trigger it, and when to use a flow instead of a sequence or a broadcast. - [Set up a persistent menu](https://docs.dmly.io/automation/persistent-menu.md): Give Facebook, Instagram and Telegram contacts an always-visible menu whose items open a link or start a flow. - [Publish a flow](https://docs.dmly.io/automation/publishing-bots.md): Publish a flow to make it live, understand what the builder blocks and warns about, and turn automations on and off. - [Ask for a phone number](https://docs.dmly.io/automation/request-phone.md): Use the Request Phone Number step to ask a WhatsApp contact to share their number when you don't have one on file. - [Sequences](https://docs.dmly.io/automation/sequences.md): Drip campaigns — an ordered series of messages sent to each contact on a schedule, starting when a flow subscribes them. - [Start from a template](https://docs.dmly.io/automation/templates.md): Install a ready-made automation from the template library and edit it in the flow builder. - [Triggers](https://docs.dmly.io/automation/triggers.md): Every event that can start an automation, which triggers are tied to a single channel, and how DMLY decides which automation runs. - [WhatsApp Flows](https://docs.dmly.io/automation/whatsapp-flows.md): Send a Meta-built in-chat form to a contact from a WhatsApp automation, and what you can and can't do with their answers. - [Buy add-ons](https://docs.dmly.io/billing/add-ons.md): Add extra contacts, social accounts or teammates on top of your plan without changing plan. - [Cancel your subscription](https://docs.dmly.io/billing/cancelling.md): Cancel a DMLY subscription, keep your data, and understand what deleting a workspace does instead. - [Choosing a plan](https://docs.dmly.io/billing/choosing-a-plan.md): Which DMLY plan suits your business — what actually differs between Starter, Growth and Pro, and how to pick without overbuying. - [Pay for DMLY](https://docs.dmly.io/billing/payment-methods.md): Update the card that pays for your DMLY subscription, and find the receipts for what you've paid. - [How plans work](https://docs.dmly.io/billing/plans.md): What your DMLY plan controls, where to see it, and what happens when you reach a limit. - [Change your plan](https://docs.dmly.io/billing/upgrading-downgrading.md): Upgrade, downgrade or switch billing cycle from Workspace Settings, and what happens when a new plan has a lower limit than your current usage. - [Read broadcast results](https://docs.dmly.io/broadcasts/analytics.md): Understand the Sent, Delivered, Opened and Failed numbers on a broadcast, and what a failure usually means. - [Choose who receives a broadcast](https://docs.dmly.io/broadcasts/audiences.md): Pick a broadcast audience with segments or retargeting, and understand how opt-outs and unreachable contacts are handled. - [Create a broadcast](https://docs.dmly.io/broadcasts/create-campaign.md): Build and send a broadcast with the four-step wizard: audience, message, schedule, review. - [Message templates](https://docs.dmly.io/broadcasts/message-templates.md): Build a WhatsApp message template, get it approved by Meta, and use its variables in a broadcast. - [Broadcasts overview](https://docs.dmly.io/broadcasts/overview.md): What a broadcast is, which channels support it, and when to send one instead of a sequence or an automation. - [Schedule a broadcast](https://docs.dmly.io/broadcasts/scheduling.md): Send a broadcast now or at a set time, understand which timezone it uses, and change it before it goes out. - [WhatsApp rules and limits for broadcasts](https://docs.dmly.io/broadcasts/whatsapp-rules-and-limits.md): What WhatsApp lets a broadcast do: approved templates only, why the 24-hour window rarely matters, and which failures come from DMLY versus Meta. - [Changelog](https://docs.dmly.io/changelog/overview.md): What's new in DMLY — new features, improvements and fixes, newest first. - [Recover a disabled WhatsApp account](https://docs.dmly.io/channels/account-disabled.md): What to do when Meta disables or restricts your WhatsApp Business account, and what DMLY can and cannot do about it. - [Delete a WhatsApp number](https://docs.dmly.io/channels/delete-whatsapp-number.md): Disconnect a WhatsApp number from your workspace, and understand what DMLY can and cannot delete on Meta's side. - [Connect a Facebook Page](https://docs.dmly.io/channels/facebook-messenger.md): Connect a Facebook Page to DMLY so Messenger conversations land in your inbox, and learn what Meta's 24-hour window allows. - [Connect Google Business Profile](https://docs.dmly.io/channels/google-business-profile.md): Connect your Google Business Profile to DMLY to manage reviews, posts and local performance — it is not a messaging channel. - [Connect Instagram](https://docs.dmly.io/channels/instagram.md): Connect a Business Instagram account through its Facebook Page and see what Instagram supports in DMLY. - [Add the Live Chat widget to your website](https://docs.dmly.io/channels/livechat-widget.md): Create a website chat widget in Bot Setup, paste the snippet on your site, and answer visitors in your Inbox. - [Fix no inbound messages](https://docs.dmly.io/channels/no-inbound-messages.md): Your WhatsApp number says connected but nothing reaches the Inbox — how to tell whether Meta is calling DMLY at all, and what to fix. - [Channels overview](https://docs.dmly.io/channels/overview.md): What a channel is, which ones you can connect to DMLY, and what each one can and cannot do. - [Connect SMS](https://docs.dmly.io/channels/sms.md): Connect Twilio, Plivo or a custom HTTP gateway so you can text contacts, take replies in your Inbox, and send SMS broadcasts with no messaging window. - [Connect Telegram](https://docs.dmly.io/channels/telegram.md): Connect a Telegram bot to DMLY with a BotFather token so Telegram chats land in your Inbox. - [Connect TikTok](https://docs.dmly.io/channels/tiktok.md): Connect a TikTok Business account so DMs and video comments reach your Inbox, and what TikTok cannot do. - [Connect WhatsApp](https://docs.dmly.io/channels/whatsapp.md): Connect a WhatsApp Business number to DMLY, register it with Meta, and work within the 24-hour window. - [WhatsApp limits and quality rating](https://docs.dmly.io/channels/whatsapp-limits.md): How WhatsApp's 24-hour window, messaging tier and quality rating work, and which rules DMLY enforces versus which ones Meta enforces. - [Client profile](https://docs.dmly.io/contacts/client-profile.md): Read a contact's profile page: its metrics, records tabs, and the actions you can take from it. - [Custom fields](https://docs.dmly.io/contacts/custom-fields.md): Define the extra details your business keeps on a contact, add values, and see where booking forms and CSV imports fill them in. - [Data, privacy and consent](https://docs.dmly.io/contacts/data-and-privacy.md): How opt-out, blocking, export and deletion work in DMLY — and precisely what each one does and does not stop. - [Import contacts from CSV](https://docs.dmly.io/contacts/import-csv.md): Bring an existing contact list into DMLY with a CSV file, and understand which rows get skipped. - [Contacts overview](https://docs.dmly.io/contacts/overview.md): What a contact is in DMLY: one person, owned by your workspace, across every channel they message you on. - [Pipeline stages](https://docs.dmly.io/contacts/pipeline-stages.md): Set up your sales pipeline, move contacts through its stages, and use stages to target broadcasts. - [Tags and segments](https://docs.dmly.io/contacts/tags-and-segments.md): Tags are labels you stick on a contact; segments are saved filters that rebuild themselves every time you use them. - [Coupons and loyalty](https://docs.dmly.io/finance/coupons.md): How percentage and fixed-amount coupons discount an invoice or an order, and how loyalty points turn into a reward coupon on their own. - [Record expenses](https://docs.dmly.io/finance/expenses.md): Track what your business spends, filed by vendor, category and account, alongside the money coming in. - [Create and send an invoice](https://docs.dmly.io/finance/invoices.md): Build an invoice from your catalogue, send it on WhatsApp with a pay link and QR code, and track it from draft to paid. - [Orders](https://docs.dmly.io/finance/orders.md): How orders move product stock, and why the invoice — not the order — is what collects the money. - [Overview](https://docs.dmly.io/finance/overview.md): How DMLY Finance bills your clients with invoices, orders, subscriptions and payments — and how it differs from your own DMLY plan. - [Connect a payment gateway](https://docs.dmly.io/finance/payments-and-gateways.md): Connect Stripe, PayPal, Paystack, Razorpay, MyFatoorah or Mercado Pago, share a pay link on WhatsApp, and understand what a missed webhook means. - [Set your Finance defaults](https://docs.dmly.io/finance/settings.md): Set the currency, due days, document numbering, tax and shipping defaults DMLY copies onto every invoice you raise. - [Statements](https://docs.dmly.io/finance/statements.md): Read a contact's running account ledger of what they owe and what they have paid. - [Subscriptions](https://docs.dmly.io/finance/subscriptions.md): Bill your clients on a repeating plan — auto-charge, renewals, pausing, cancelling and failed payments. - [Create your account](https://docs.dmly.io/getting-started/create-account.md): Sign up for DMLY, verify your email, and land in your new workspace. - [Navigating DMLY](https://docs.dmly.io/getting-started/navigating-dmly.md): A tour of the DMLY sidebar — what each area does, and where to find settings, your team and integrations. - [Set up your workspace](https://docs.dmly.io/getting-started/setup-checklist.md): The order to do things in to go from an empty DMLY workspace to a working WhatsApp inbox, team and first automation. - [Workspaces](https://docs.dmly.io/getting-started/workspaces.md): A workspace is one business in DMLY — its name, its channels, its contacts, its team, and everything scoped to it. - [Overview](https://docs.dmly.io/growth/overview.md): Growth tools are trackable links and QR codes that turn a poster, a bio link or a shop window into a WhatsApp conversation in your inbox. - [QR codes and links](https://docs.dmly.io/growth/qr-codes-and-links.md): Create a trackable QR code or chat link that opens a WhatsApp conversation and drops the person straight into a flow. - [Assign chats to teammates](https://docs.dmly.io/inbox/assigning-chats.md): Assign a conversation to a teammate, understand what assignment does and does not change, and divide inbox work across a team. - [Open and done conversations](https://docs.dmly.io/inbox/conversation-status.md): How open and done work in the Inbox, what marking a conversation done fires, and how to clear a busy queue. - [Work a conversation as a team](https://docs.dmly.io/inbox/notes-and-collaboration.md): Leave internal notes, mention teammates, see who else is typing, and take a conversation off the bot. - [Notifications](https://docs.dmly.io/inbox/notifications.md): Use the notification bell to keep your team on top of new chats, mentions, bookings and payments. - [The unified inbox](https://docs.dmly.io/inbox/overview.md): Every conversation from every channel in one list — how the Inbox is scoped, how you work a thread, and what you can send. - [Use saved replies](https://docs.dmly.io/inbox/quick-replies.md): Save the answers you type over and over and insert them into any Inbox conversation in one click. - [Make and take WhatsApp calls](https://docs.dmly.io/inbox/whatsapp-calling.md): Take WhatsApp voice calls in the Inbox and follow up on them automatically. - [DMLY documentation](https://docs.dmly.io/index.md): Everything you need to run your business on WhatsApp — the unified inbox, chatbots, broadcasts, bookings and payments. - [Import from Google Drive](https://docs.dmly.io/integrations/google-drive.md): Pick images and videos from your Google Drive and import them into the DMLY media library. - [Build a knowledge base](https://docs.dmly.io/integrations/knowledge-base.md): Upload your price list, policies and FAQs so the AI answers contacts from your own material instead of guessing. - [Connect Mercado Pago](https://docs.dmly.io/integrations/mercado-pago.md): Collect Latin-American payments with Mercado Pago Checkout Pro, including supported currencies and how a payment gets confirmed. - [n8n](https://docs.dmly.io/integrations/n8n.md): TODO: one sentence describing what this page covers. - [Connect OpenAI](https://docs.dmly.io/integrations/openai.md): Connect an OpenAI API key so your flows can reply with AI, search your documents and call tools. - [Overview](https://docs.dmly.io/integrations/overview.md): Browse the Integrations page, connect a tool to your workspace, and understand the AI plan gate. - [Connect Zoom](https://docs.dmly.io/integrations/zoom.md): Connect a Zoom account so bookings on Zoom services get a meeting and join link created automatically. - [Organise the catalogue with categories](https://docs.dmly.io/offerings/categories.md): Group services, products and plans into categories so a long catalogue stays easy to filter. - [Offerings overview](https://docs.dmly.io/offerings/overview.md): The catalogue behind DMLY: Services are what you do, Products are what you sell, Plans are what you bundle them into. - [Plans and credits](https://docs.dmly.io/offerings/plans-and-credits.md): How a plan grants credits, how a booking spends them, and what the low-credit warning actually does. - [Sell products and track stock](https://docs.dmly.io/offerings/products.md): Add products to your catalogue, track stock levels, get alerted when stock runs low, and send a product to a contact from a flow. - [Connect Google Business Profile](https://docs.dmly.io/reputation/connect-google-business-profile.md): Connect one or more Google Business Profile locations to DMLY to manage reviews, posts, performance and business details. - [Reputation overview](https://docs.dmly.io/reputation/overview.md): Reputation is a real Google Business Profile engine — read and reply to reviews, publish posts, edit your listing, and ask customers for reviews on WhatsApp. - [Publish posts and read performance](https://docs.dmly.io/reputation/posts-and-performance.md): Publish an update, offer or event to your Google Business Profile, schedule it for later, and read the numbers on the Performance tab. - [Ask for Google reviews](https://docs.dmly.io/reputation/review-requests.md): Send customers a tracked Google review link on WhatsApp, SMS or email — by hand, or automatically from a flow. - [Read and reply to Google reviews](https://docs.dmly.io/reputation/reviews.md): Read your Google Business Profile reviews in DMLY, post a public reply, and understand what Google lets you change. - [Automation not triggering](https://docs.dmly.io/troubleshooting/automation-not-triggering.md): Work out why a bot never started, in the order that finds the cause fastest — from the channel it is built on to the guards that stop a flow without saying so. - [Known issues](https://docs.dmly.io/troubleshooting/known-issues.md): Current limitations in DMLY that behave as designed, and where to go when something looks broken instead. - [Reading the Logs page](https://docs.dmly.io/troubleshooting/logs.md): Use the Logs page to find out why a message, bot or integration didn't do what you expected. - [Fix a message that didn't send](https://docs.dmly.io/troubleshooting/messages-not-sending.md): Work out why a message never left DMLY — the 24-hour window, template approval, contact reachability, and what the failure actually was. ## OpenAPI Specs - [openapi](https://docs.dmly.io/api-reference/openapi.json)