Workflows and approvals

The workflow categories, what a step is, escalations + reminders, conditional gates that skip themselves, and how to customize them.

On this page

A workflow is the sequence of steps a business process moves through — record, verify, approve, post. Every team has slightly different rules ("payments above SAR 10,000 need a director's sign-off"), so the system ships sensible defaults and lets workspace admins customize.

The eight workflow categories

CategoryWhat it governs
Lease offerDrafting, negotiating, accepting a lease offer
Payment verificationRecording → verifying → posting a tenant payment
Expense verificationRecording → verifying → posting an expense
Deposit payment verificationRecording the initial security deposit
Deposit refund verificationRefunding the deposit at contract end
MaintenanceReporting → assigning → resolving → closing
Recurring taskGenerated instance → working → completing
Contract expiryApproaching contract end → renewal or close

Each category has a default workflow that works out of the box. You only need to customize if your process is different.

What a "step" is

A workflow is a chain of steps. Each step is either:

  • Domain — the core action (e.g. "Record payment", "Mark work complete"). Always one per workflow, always at the start.
  • Gate — an approval/verification (e.g. "Manager verifies", "Director approves"). You can have any number of gates after the domain step.

A step has:

  • A name ("Manager verification").
  • A role that's allowed to act on it (e.g. "Manager", or a custom role).
  • Optional rules (e.g. only required when the payment amount exceeds SAR 10,000).

Approval style: Solo or Team

At the top of Settings → Configuration → Workflows you'll see your workspace's approval style — the choice you made during onboarding:

  • Solo — every workflow is a single step. You record an action (a payment, an offer, a maintenance job) and it's done. No approval hand-offs.
  • Team — work routes between roles for review across multiple steps (the shipped defaults).

An admin can switch styles anytime. Switching re-applies that style's defaults to every workflow category and overwrites any customizations you've made — so you'll get a confirmation prompt first. Approvals already in progress are safe: they finish on the steps they started with. After switching, each workflow's own Reset to defaults follows the new style.

Your choice is per workspace, so different workspaces can run different styles. New workspaces you create start from your most recent choice (changeable when you create them).

Customizing a workflow

Open Settings → Workflows, pick the category, and edit. The editor lets you:

  • Add or remove gate steps.
  • Re-order steps (the domain step stays first).
  • Change the role assigned to each gate.
  • Add conditional rules (gate only triggers above a threshold, etc.).

Save. The next process started will follow the new workflow. In-flight processes keep their existing workflow — changes are not retroactive.

Reset to defaults loads the shipped configuration into the editor for review — nothing changes until you click Save, so you can inspect (or tweak) the default setup before applying it.

[!warning] A gate step requires action from a member with the matching role. If you assign a gate to a role no one holds, processes will stall there. Always make sure the role has at least one member before saving.

File attachments and input fields per step

Each step can carry two kinds of configurable inputs that appear in the step's action dialog:

  • File attachments — named upload slots (e.g. "Completion Proof", "Invoices"). Each slot has a label (English + Arabic), a required flag, and a maximum file count. Required slots block the step from completing until at least one file is attached. When a slot holds more than one file, a Download all button appears in the Workflow documents section that downloads them together as a single ZIP — named after the slot and date (e.g. Invoices 2026-06-15.zip) — with each file keeping its original name. Previous versions are not included.
  • Input fields — form fields the person completing the step fills in (e.g. "Total cost"). Each field has a label (English + Arabic), a type (Text, Number — numbers accept decimals like 1,250.75 — or Yes / No, which shows as a toggle), and a required flag. Captured values appear in the Workflow documents section on the request/offer/contract page (web and mobile), grouped by step — including Previous values when a step was returned and re-completed with different data.

Add either from the step card in the workflow editor: expand File Attachments or Input Fields, click the add button, and type the label. To translate a label, switch the app language and edit the same label — each language stores its own text.

[!info] The default maintenance workflow uses both: the Property Manager step carries an Invoices slot and a required Total cost number field, and the Accountant step carries an Accounting statement slot. The total cost feeds the maintenance expense record automatically. The Accountant Review step also ships with a condition — it auto-skips when the Total cost is less than 1, so an operations-only request with no cost goes straight to the final confirmation instead of waiting on the accountant. A request with a real cost still routes through the accountant.

Conditional gates (skip a step automatically)

Sometimes an approval step is only worth a person's time in certain cases — for example, payments above SAR 10,000 need the director's sign-off, but smaller ones don't. Instead of routing everyone through the director, you can give an approval gate a condition that lets it skip itself automatically.

Open the step card in the workflow editor and expand Condition. Tick "Skip this approval automatically when…", then build the rule from three parts:

  1. A value to check — one of:

    • a record value the workflow already knows (depends on the workflow type — see below),
    • an input field captured in an earlier step (e.g. a "Requires legal review?" Yes/No toggle you added to the recording step), or
    • whether an earlier step has a file attached in one of its upload slots (e.g. "skip this review when the invoice was already attached upstream").

    The record values depend on the workflow type, for example:

    • Payments — amount, payment method, whether it was paid late, days late.
    • Expenses — total, subtotal (excl. VAT), VAT amount, invoice age, payment method, payment status.
    • Contracts & lease offers — contract value, annual/monthly rent, security deposit, number of units, total unit area, lease period in days, payment frequency, owner type, VAT applicable, multi-unit.
    • Deposits — amount, charge type, who holds the funds, amount paid/refunded, related contract value.
    • Maintenance — priority, unit type, unit status.
    • Recurring tasks — kind (visit/renewal), days until due, whether overdue, occurrence number, contract amount, recurrence frequency.
  2. A comparison — the choices adapt to the value's type: numbers offer is greater than / is less than / equals / …; text offers is / is not / contains / is empty / …; Yes/No offers is Yes / is No; a value with a fixed set of choices (priority, payment method, frequency, status…) offers is / is not; and an attachment offers has a file / has no file.

  3. A value to compare against — a number or text box, a Yes/No, or a dropdown of the allowed choices when the value has a fixed set (so you pick Urgent rather than typing it). For payment method, that dropdown lists your workspace's own payment methods (Settings → Payment methods), so renamed and custom methods appear by their real names. Omitted entirely for comparisons like is empty, is Yes, or has a file.

As you build it, a plain-language line shows exactly what will happen — for example, "This step is skipped when Payment amount is greater than 10000." A gate with a condition shows a small Conditional badge.

What happens at runtime:

  • When the workflow reaches the gate, it checks the condition. If it holds, the step is skipped — no one is asked to act on it — and the workflow moves to the next step. The skipped step shows as Skipped in the progress view, so the history stays complete.
  • Skipping the last gate completes the workflow. Whatever the final step would have triggered (e.g. creating the contract) still happens.
  • If the value the condition needs isn't available, the step is not skipped — it runs as a normal approval. The system never skips on missing information.

A few guardrails keep this safe, so the editor will stop you from building something that could break a workflow:

  • A skipped step never collects inputs, so a gate with a required input field or attachment can't be made conditional.
  • A condition can only read a value from an earlier step (and not from another step that can itself be skipped) — you can't depend on data that may never be collected.
  • Conditions are an opt-in customization: the built-in default workflows never skip anything.

[!info] Conditions are frozen when a workflow starts, just like the rest of the steps. Editing a gate's condition only affects workflows started afterward — anything already in progress keeps its original rules. Conditional gates are configured on the web app; on mobile they run normally (a skipped step shows as Skipped, and Yes/No fields appear as a toggle), but you build the conditions on web.

Notifications

Every time a workflow advances, the system notifies the role of the next step. For a payment verification: the recorder submits → the system pings the Manager role → the Manager verifies → the payment posts.

Notifications go to every channel the user opted into (in-app inbox, email, mobile push if installed). Per-role notification overrides live in Settings → Notifications.

Returning and reassigning

If a verifier spots a problem (e.g. wrong tenant, wrong amount), they can Return the item to the previous step. The original recorder gets a notification with the reason and can fix and resubmit. The audit trail records every transition. This works the same across maintenance, lease, payment, expense, and deposit verification — every gate offers Approve / Return (and Decline where it applies). If the gate step has its own configured attachment slots or input fields (e.g. a treasurer's verification note), the verifier fills them right there when approving.

A verifier can also Reassign to a different member with the same role (e.g. "out of office — Ahmad will handle this batch").

Recording and verifying a payment

When you record a payment, the Record Payment step's configured attachment slots (e.g. "Payment Receipt") and input fields appear right in the record-payment form — so you attach the receipt and fill any required fields as you record. Those show up afterwards in the Workflow documents section on the payment page.

A payment verifier (e.g. the Treasurer) then Approves or Returns the payment — the same as other workflows. There's no separate "decline": if a payment was recorded in error, delete it and the receivable it was applied to is restored automatically. If you edit an already-verified payment's amount, method, or date, it goes back through verification.

Managing attachments and captured values

Files and form values attached to a workflow step (for example the payment receipt and any fields captured when a payment was recorded) can be managed after the fact by someone with the right permission. On the item's detail page (e.g. a payment), the Workflow documents card lets an authorized user:

  • Delete a file — both the current file and any previous versions.
  • Replace / add a file in a slot — upload a new one; the old one is kept as a previous version.
  • Edit the captured field values for a step.

This is separate from simply recording or resubmitting — the recorder always uploads their own files when they submit or fix-and-resubmit a returned item. Attachment management is an override for corrections after the fact.

Who can do it: by default only workspace admins. To let another role manage workflow attachments, grant the Manage workflow attachments permission in Settings → Roles.

Two things to know:

  • Contract documents are protected. A file that's designated as the contract document (it's copied onto the contract itself) can't be deleted or replaced from here — manage it from the contract.
  • Accounting isn't re-synced. If a receipt was already pushed to your accounting system (Odoo), deleting it here does not remove the copy already sent there.

Today this management UI is on the web app; on mobile, a recorder can still re-upload when fixing a returned item.

Escalations and reminders

Workflow steps don't just sit there indefinitely. Each step can carry a deadline, and the engine fires two kinds of nudge around it.

How it works

  • Reminder — fires N hours before the deadline. The role currently holding the step gets a notification: "Verify this payment by 5pm tomorrow."
  • Escalation — fires when the deadline passes without action. A second role (the escalation role) is notified. If the step is configured with "reassign on escalation," that escalation role also gains the ability to act on the item directly — both the original and the escalation role can now move it forward.

A 5-minute cron checks for overdue items, so escalations land within minutes of the deadline.

Configuration

Escalation settings live on each individual step inside the workflow editor at Settings → Workflows. For each step that has a deadline, an Admin can configure:

  • Deadline hours — how long after the step is reached the deadline is.
  • Reminder hours — how long before the deadline the reminder fires.
  • Escalation role — which role gets pinged when the deadline passes.
  • Reassign on escalation — toggle whether the escalation role gains action authority or just visibility.

Workflows ship with sensible defaults. Most teams never touch escalation config; you only need to think about it when a particular step has a hard SLA (e.g. "lease offers must be verified within 24 hours" or "deposit refunds must be approved within 3 business days").

How escalations surface in the UI

  • The Tasks page shows due-soon and overdue badges next to each item.
  • An item escalated to a second role appears in both roles' task queues — the original member can still complete it, but if they've gone silent, the escalation role can now act.
  • The full audit trail records every reminder and escalation event with timestamp.

[!warning] A step configured to escalate to a role with zero members will get stuck. The reminder fires but no one receives the escalation — there's no one to receive it. If you add an escalation, make sure the escalation role has at least one assigned member on the relevant property.

Where to find each workflow's state

  • Tasks page shows every workflow item assigned to you across all categories — your action queue.
  • Each module's page (Payments, Expenses, etc.) shows items at the workflow step relevant to that module. A "Pending verification" filter shows only the ones waiting for someone to act.
  • Each item's detail page shows the full step-by-step history with timestamps and actor names.