Zudo Works

SOP library

Each SOP lists the role that performs it, the preconditions, the steps and what to check afterwards. Permissions named in brackets are the ones the role must hold.

SOP-01 Onboard a new shop (owner)

Preconditions: a verified workspace (SOP-00 = §4).

  1. Settings → Company details: confirm currency, locale and time zone; set the brand name.
  2. Settings → Appearance: pick the accent colour. Settings → Logo: upload the logo (crop if needed) and, optionally, a dark-mode variant.
  3. Settings → Units: check the seeded units (EA, KG, M, …) and add what you measure in. Set decimal places per unit (0 for each, 3 for kilograms).
  4. Settings → Warehouses: rename MAIN or add FLOOR, YARD, etc. Keep one if you do not track locations.
  5. Items: add items with a code (A–Z, 0–9, . _ / -, stored upper-case), name, type (raw material / purchased part / manufactured part / consumable), base unit and optional standard cost, material grade, thickness, dimensions and tags. Photos can be attached.
  6. Users: invite the team; pick a role per person (see SOP-06). Settings → Roles if you need a custom role.
  7. Stock → Movements → New receipt: post opening stock with unit costs (SOP-02) so balances and moving-average costs start right.
  8. Production → Bills of materials: create and release a BOM for each manufactured part.
  9. Walk Your journey to green; dismiss it when done.

SOP-02 Receive stock into a warehouse (storekeeper — stock.post)

  1. Stock → Movements → New → Receipt (or Dashboard → Receive stock).
  2. Choose the date, a reference (delivery note, supplier invoice) and the warehouse.
  3. Add lines: item, quantity, unit cost (required for receipts — it sets the moving-average cost). Scan barcodes with the camera on a phone if you like.
  4. Save as draft if you need to check, or Post. Posting is one transaction; the document gets the next gapless number RCV-000123.
  5. Check Balances: the quantity and value appear immediately. Attach a photo or a signature to the movement if your process requires it.

Rules: posted movements are immutable — correct with an adjustment. Posting carries an idempotency key: a retried click never books stock twice. If the receipt belongs to a purchase order, receive it from the PO instead (SOP-09) so the PO closes itself.

SOP-03 Issue, transfer or adjust stock (storekeeper — stock.post)

Stock can never go negative: an issue or transfer larger than the on-hand quantity in that warehouse is refused with insufficient_stock. Receive or transfer first.

SOP-04 Run a work order end to end (supervisor + storekeeper)

  1. Production → Bills of materials: the item needs a released BOM (draft → released; releasing a new revision obsoletes the previous one). [bom.write]
  2. Production → Jobs → New: item, quantity, due date, customer reference, free-text operations. The material plan is exploded from the BOM including scrap %. Save → JOB-000045 (draft). [jobs.write]
  3. Release the job (draft → released). Optionally add routing steps (work centre, planned hours) on the job page; steps are started and completed in order. [jobs.write]
  4. Issue material from the job page: pick the warehouse and quantities (planned, over-issue with a reason, or unplanned components) → JIS movement valued at moving-average cost. [jobs.issue] The job moves to in progress when started.
  5. Record labour hours × rate on the job. Return unused material (JRT) if needed, up to the issued quantity. [jobs.issue]
  6. Complete the job with the completed quantity; Close it when paperwork is done. The Cost card shows material (issued − returned), labour, total and per unit (total ÷ completed). Print the job card PDF (with QR code) or the barcode label.
  7. Webhooks job.created/released/started/completed/closed/cancelled and the notification centre inform the team.

SOP-05 Month-end stock check (owner / supervisor)

  1. Balances: export to Excel; compare with the physical count by warehouse.
  2. Post adjustments per item with the reason "Stock count <month>".
  3. Stock → Movements: filter the month and export for the accountant; item history gives the per-item ledger.
  4. Dashboard → Stock value is Σ (on hand × moving-average cost); it must equal the Balances total.
  5. Settings → Audit log: review who posted what (retention depends on the plan).

SOP-06 Add a teammate and choose a role (owner — users.manage)

  1. Users → Add user: e-mail, temporary password, display name, role.
  2. System roles: Owner (everything), Supervisor (masters, BOMs, jobs, sales, purchasing, planning, forms, dashboards incl. manage), Storekeeper (read masters, stock read/post, BOM read, jobs read/issue, purchasing read, planning read, forms read/write, dashboards read).
  3. Need something else? Settings → Roles → New role, tick permissions in the matrix. You can only grant permissions you hold yourself; roles cannot carry permissions their author lacks.
  4. The new user signs in with the e-mail and password; they can change it with Forgot password?
  5. Leaving? Deactivate (signed out at once) or Delete (owner only; a user with history is anonymised and kept for the audit trail). The last active owner cannot be deactivated or demoted.

SOP-07 Create a custom form and put it in the sidebar (owner / designer — forms.design)

  1. Settings → Low-code → Forms → New form (or [F] → New form… on a module link, which pre-adds a lookup to that module).
  2. Name it: 5–20 characters, not the name of a built-in section ("Items", "Jobs" …).
  3. Drag fields from the palette: text, textarea, rich text, number, decimal, currency, percent, date, datetime, checkbox, select, multi-select, e-mail, URL, phone, tags, lookup (item, customer, vendor, warehouse or another form), subform (rows of child fields).
  4. Per field: label, required, options, lookup target / match field, per-role access (edit, read-only, hidden). Choose the title field and the submit label.
  5. Save. You are asked "Show in the main sidebar?" — pick Masters / Stock / Sales / Purchasing / Production / Admin, a custom section (e.g. "Quality"), or Not now (change it later with Sidebar… in the designer).
  6. Open the form, add records, filter and export like any table. Records that look up an item or customer show up on that item's / customer's page under Referenced in.

SOP-08 Automate a form with a workflow (workflows.manage)

  1. Settings → Low-code → Workflows → New rule: name, form, trigger (record created / updated / saved / deleted).
  2. If condition (visual builder: field, operator, value; JSONLogic under the hood).
  3. Then steps: send e-mail ({{record.field}} templates), create record, update record, invoke URL (GET/POST/PUT/PATCH/DELETE with headers and JSON body), set variable, if/else, for-each / for / while loops with break, call a function, return.
  4. Test the rule against a sample record; read the run log (success / partial / failed / skipped with per-step detail). Toggle the rule on/off from the list.
  5. Reusable logic goes into Functions (void or value-returning), tested in isolation.

Limits: 5,000 steps per run, 1,000 iterations per loop, 5 nested calls, chain depth 3, 20 e-mail recipients, 10 s URL timeout. Invoke URL refuses private/loopback/metadata addresses (SSRF guard).

SOP-09 Buy what you are short of (purchasing — purchasing.write, stock.post)

  1. Purchasing → Procurement: the requirements table shows demand (confirmed sales order lines exploded one level through released BOMs + open job material), supply (on hand + sent POs) and the shortage per item, with what to buy and what to make.
  2. Select items → Draft purchase order for a vendor → PO-000012 (draft).
  3. Open the PO, check lines (quantity, unit cost), Send (draft → sent).
  4. On delivery: Receive on the PO — warehouse, date, received quantities (partial receipts allowed). Each receipt posts an RCV movement linked to the PO; the PO becomes received when the last outstanding quantity arrives. Webhook purchase_order.received fires.

SOP-10 Quote, confirm and fulfil a sales order (sales — sales.write)

  1. Sales → Customers: add the customer (billing / shipping address).
  2. Sales → Sales orders → New: a quote QT-000031 with lines (item, quantity, unit price). Edit freely while draft or sent. Send it.
  3. Confirm: the quote becomes order SO-000031; stock is reserved per line (see Reservations). Webhook sales_order.confirmed fires; the lines feed procurement.
  4. Fulfil when shipped (confirmed → fulfilled), or Cancel (releases reservations).

SOP-11 Publish a dashboard or a module report (dashboards.manage)

SOP-12 Connect an external system (owner — settings.manage)

  1. Settings → API keys → New key: name, scopes (permission keys, or *), optional expiry. The key zk_… is shown once; only its prefix is listed afterwards.
  2. Call the API with Authorization: Bearer zk_…. Calls are metered against the plan.
  3. Settings → Webhooks → Add endpoint: HTTPS URL, description, events. Copy the secret; verify X-Zudo-Signature: sha256=<hex HMAC of the raw body>. Use Test ping. Pause or delete endpoints at any time. See §41.

SOP-13 Upgrade, change or understand your plan (owner)

  1. Settings → Billing: current plan, trial days left, usage bars (storage, API calls, webhook deliveries, users), plan limits, prices.
  2. Upgrade plan → /pricing: toggle Monthly / Annually and INR / USD; Upgrade to Standard / Business switches the plan in place (payment arrangements follow with Zudo sales); Contact Sales for Enterprise.
  3. If a payment fails you have 7 days (red banner) before suspension; contact support to record recovery. A cancelled workspace keeps its data for a month.

SOP-14 Recover access


SOP-14 Connect the company e-mail sender (owner — settings.manage)

Preconditions: you know the company mailbox's address and can sign in to it (or hold its SMTP password / app password).

  1. Settings → Company e-mail sender: type the address and Continue. The kind of mailbox is detected from the address and its MX records: Google (Gmail / Workspace), Microsoft 365 / Outlook, Zoho Mail, or an SMTP server with a suggested host and port.
  2. Google / Microsoft / Zoho: click Connect with …. A popup asks you to sign in and to allow sending e-mail — nothing is ever requested that reads your mailbox. The popup closes itself and the card shows Sending as [email protected].
  3. SMTP: check host, port and SSL, enter the username and the password (Gmail, Yahoo and iCloud require an app password), Test and send code. Zudo Works logs in to the server and sends a six-digit code to that very address; enter it (three tries, ten minutes) and the mailbox is connected.
  4. Send test mails the mailbox itself; check the inbox.
  5. Pick When our mailbox can't send: Always ask (default), Automatically send from Zudo Works, or Never send from Zudo Works.

Afterwards: every member sees "E-mails are sent from [email protected]" on the card. Sign-in codes, password resets and security alerts keep coming from Zudo Works itself. Zoho admins may need to allow third-party apps (Admin console → Security → Third-party apps). Disconnect forgets the credentials and revokes the token where the provider supports it.

SOP-15 Send a purchase order to the vendor (buyer — purchasing.write)

  1. Open the purchase order. PDF shows the branded document (logo, accent bar, vendor, lines, totals, page numbers).
  2. E-mail to vendor: the vendor's address is prefilled (add more, comma-separated), tick CC me, adjust the subject ("Acme – Purchase Order PO-000123"), write a message. The preview on the right is the exact e-mail: greeting, summary card (number, dates, total, items), View Purchase Order button (a secure link to the PDF, valid 30 days), the attachment note, your signature and the organisation footer. The card shows Sending from [email protected] — or that no mailbox is connected.
  3. Send e-mail. A draft order moves to sent as soon as the e-mail went out (or you confirmed sending it yourself). The E-mail history card lists every e-mail with its status: queued, sent (from which mailbox), awaiting decision, sent manually, failed, bounced — with Retry where it makes sense.

SOP-16 When an e-mail fails (everyone; reconnecting needs an owner)

Temporary problems (time-outs, a busy server, HTTP 429 / 5xx, SMTP 4xx) retry on their own after 1, 5 and 30 minutes. When the mailbox cannot send (rejected recipient, a 5xx, bad credentials, or no mailbox connected) the e-mail waits for a decision and a notification tells you (owners too for unattended sends such as workflow steps):

  1. Send from Zudo Works — delivered by Zudo Works from "Acme Fabrication via Zudo Works <[email protected]>", replies go to the company mailbox (or to you), you are in CC, and the subject starts with the organisation name. Off when the workspace setting is Never.
  2. Send it myself — the manual panel: the rendered e-mail, Download PDF, Copy e-mail text, Copy recipients, Open draft (Gmail, Outlook web or your default mail app, chosen from your address; the PDF downloads at the same time — attach it, browsers cannot do that for you; the body also carries the secure link so the vendor can open the PDF regardless). Then I've sent it: the e-mail is recorded as sent manually and a draft order moves to sent.
  3. Reconnect mailbox and retry (owners) — when the provider refused our credentials the sender is marked needs reconnect; reconnect it in Settings, then the e-mail goes out from it.

The tenant setting decides the default: Always ask (above), Automatically send from Zudo Works (option 1 without asking), Never send from Zudo Works (only 2 and 3). Every decision is in the audit log and on the e-mail's row in Settings → E-mail log.

SOP-17 Ask Zudo AI and approve a change (everyone with ai.use; applying needs dashboards.manage / settings.manage)

  1. Click the Zudo AI button in the bottom-right corner — a ring in the Zudo Works logo colours with the Zudo AI spark in the middle. It is always on screen (it lifts out of the way when a page button sits underneath it, docks beside the open panel and closes it again; Ctrl / ⌘ + J does the same). It exists only when your server has a model configured — or double-click anywhere on a page to get a small ask box right there; Enter sends the question. The panel opens beside the page; on a phone it fills the screen.
  2. Ask in plain words: "What is low on stock?", "Which jobs are in progress?", "How much did we sell per customer this quarter?". The answer streams in; the chips under it name the data it read (get low stock, run analytics · Sales orders · 8 rows). The assistant only sees what your role may see — a field hidden from you is hidden from it.
  3. Check the numbers that matter: the footer says it plainly, AI can make mistakes — check important numbers. Figures are quoted exactly as the tools returned them.
  4. Ask for a chart ("Add a chart of items by type to my home dashboard") or a layout change ("Hide the recent jobs section"). The assistant proposes; a card shows the live chart on your real data or a before / after of the layout. Nothing is saved yet.
  5. Approve & apply saves it (through the same checks as the dashboard builder: the proposal is re-validated, your permission is checked, the audit log gets a line). Discard throws it away. Proposals you leave alone expire after 24 hours.
  6. Rate an answer with 👍 / 👎 under it (stored on that answer, so quality can be reviewed later; click again to clear).
  7. Past conversations are under the clock icon; delete the ones you no longer need. The month's AI allowance is on Settings → Billing (80 % warns the owner, 100 % pauses the assistant until the first of next month).

SOP-21 Let Zudo AI fill in a form, then save it yourself (ai.prefill + the form's write permission)

  1. Ask: "Create an item with code AI-0001 named "Laser bracket", description "Cut from 2 mm steel", cost 12.50, unit EA, raw material" — or a customer, vendor, quote with lines, purchase order, work order, lead or a record of any custom form.
  2. A card Form filled in for you lists every value and anything it could not fill (an unknown unit or customer, a duplicate code). Contact details (e-mail, phone, address) are never filled in — you type those.
  3. Open the form: the normal new-record form opens with the values and a banner Filled in by Zudo AI — check every value, then save. Change anything, then press Save yourself. Zudo AI has no way to save or submit; closing the form without saving changes nothing.

SOP-22 Approve a change to your data proposed by Zudo AI (owner)

  1. A member with ai.changes asks, e.g. "Change the standard cost of PLATE-1 to 12.50". The card shows each field before → after and says it waits for an owner. Nothing changes yet.
  2. Owners find it under Settings → Zudo AI activity → Waiting for approval (or in their own chat).
  3. Approve… asks three questions: why the change is right (at least a few words), the record's code or number typed back, and a tick for I checked the new values against the source document.
  4. The server checks the answers, re-checks that the record still holds the values the proposal was made from (otherwise: ask again), applies it through the record's own validation and writes the answers into the audit log. Workflow functions written by Zudo AI are approved the same way.

SOP-23 Have Zudo AI design a form or rearrange the sidebar (ai.design + forms.design / settings.manage)

  1. Ask: "Create a form Machine logs in Production with machine (item), hours run, shift Day/Night and a checks table", "Rename Machine logs to Machine log and add an operator note", "Add a Surface finish dropdown to Items" (custom fields on a built-in form), "Move Machine log to a Maintenance section and make the Sales section green".
  2. The card shows a live preview of the form (new fields marked New, changed ones Changed) or the sidebar moves and colours before → after. Zudo AI never removes fields.
  3. Approve & apply saves it (the form changes only if nobody edited it meanwhile); Discard drops it.

SOP-24 Calculate, forecast and check your data with Zudo AI (everyone with ai.use)

  1. Ask any calculation — "OEE with availability 90, performance 95, quality 99", "bend allowance for 3 mm at 90° with a 2 mm radius, K 0.33", "what price gives 30 % margin on 12.50?". Zudo AI uses its exact calculator and a library of 200+ manufacturing formulas and shows the working.
  2. Ask "Can you work out the reorder point for PLATE-1 from my data?": it lists which inputs your workspace already holds (usage history, purchase lead times…) and what it still needs from you.
  3. Ask for a prediction — "forecast revenue for the next three months", "when does PLATE-1 run out?": a trend from your monthly history with a range; it says these are estimates.

SOP-25 Decide what Zudo AI may do for each role (owner — users.manage)

  1. Settings → Roles → (role) → AI: Use the Zudo AI assistant (ai.use) turns it on for the role; then fills in forms (ai.prefill), proposes dashboards, charts and colours (ai.propose), proposes changes to records (ai.changes — an owner still approves), designs forms, the sidebar and workflow functions (ai.design).
  2. The assistant only ever reads what the role may read (the same permissions and field access as the pages) and is offered only the tools the role holds. Supervisors get everything but design by default; storekeepers get no AI until you add it.

SOP-18 Turn on the authenticator app and keep backup codes (everyone)

Every account already has two-factor sign-in: after your password, a 6-digit code goes to your e-mail (valid 10 minutes, one use, one send a minute, five an hour). An authenticator app is stronger and works offline:

  1. Settings → Security → Set up authenticator app. Scan the QR code with Google Authenticator, Microsoft Authenticator, Authy, 1Password… or type the manual key.
  2. Enter the 6-digit code the app shows. The app is now your primary method; the e-mail code stays as the fallback. Every other device of yours is signed out (a method change always does).
  3. Generate backup codes (your password is asked again): ten single-use codes such as AB12-CD34, shown once — download, copy or print them and keep them safe. Regenerate replaces them all.
  4. Signing in from then on: password → app code. A session lasts 60 days from sign-in on that device, then you sign in again (password + second factor). Review devices under Active devices; Sign out one or Sign out all other devices.

SOP-19 Lost your phone? Fallbacks, holds and the lockout (everyone)

  1. After five wrong app codes, the button Use e-mail code instead appears. Press and hold it for 15 seconds (the ring fills; releasing early resets it). Keyboard and screen-reader users press Enter and wait the same 15 seconds, then confirm. The server measures the time itself — a faster client changes nothing.
  2. After five wrong e-mail codes, Use a backup code appears behind a 30-second hold (only if you have backup codes). Backup codes allow five attempts.
  3. When every available method is exhausted, two-factor sign-in is locked for 30 minutes: you get an e-mail ("Someone failed to sign in to your account…"), the owners see a notice, and the audit log records it. Wait, or ask an owner for a reset (SOP-20).
  4. Afterwards, replace the app (SOP-18) and regenerate your backup codes.

SOP-20 Reset a member's two-factor authentication (owner — users.manage)

  1. Users → ⋯ → Reset two-factor. Confirm. The member loses the authenticator app and the backup codes, is signed out everywhere, and is e-mailed; the audit log shows auth.mfa_reset.
  2. The member signs in with password + e-mail code and sets the app up again (SOP-18).
  3. Owner locked out with no backup codes: another owner resets you the same way. If you are the only owner, contact Zudo Works support: the super-admin panel has an audited reset for exactly this case (POST /admin/tenants/:id/users/:userId/mfa-reset, recorded in the tenant admin log).
  4. Require authenticator app for all users (Settings → Security, owners): members without an app are sent to set one up right after their next sign-in and cannot remove it afterwards.

Last updated