# Workstation Documentation > Learn how to use and configure Repzo Workstation. Workstation helps teams manage customer records, sales work, operations, marketing, commerce, point of sale, performance, knowledge, analytics, and workspace configuration from one place. These docs are written for people who need practical answers while setting up or using the app. Start with the sales flow if you are learning the CRM model, or jump into the module you are working with. ## Start here - [Getting Started](https://workstation.repzo.com/docs/getting-started) explains the main workflow and where each module fits. - [Pulse](https://workstation.repzo.com/docs/analytics/pulse) is the team feed you land on after sign-in when your workspace includes it; otherwise you start on the [Dashboard](https://workstation.repzo.com/docs/analytics/dashboard). - [CRM Setup](https://workstation.repzo.com/docs/sales/crm-setup) explains how Properties, Objects, Pipelines, and Table Views fit together. - [Contacts](https://workstation.repzo.com/docs/sales/contacts) covers customer records, lifecycle status, qualification, and relationship tracking. - [Activities](https://workstation.repzo.com/docs/engagement/activities) explains how calls, meetings, and tasks connect to CRM records. - [Inbox](https://workstation.repzo.com/docs/operations/inbox) covers shared customer conversations. - [Content Hub](https://workstation.repzo.com/docs/knowledge/content-hub) explains internal and public knowledge content. - [Settings](https://workstation.repzo.com/docs/administration/settings) covers app configuration, integrations, security, and data management. ## Core workflow Most sales teams use Workstation in this order: ```text Contact -> Deal -> Won or Lost | | Account Price Offer -> Invoice | Activities and communication ``` 1. Capture or import a [Contact](https://workstation.repzo.com/docs/sales/contacts). 2. Qualify the contact using lifecycle fields such as status, score, source, pipeline, and stage. 3. Open a [Deal](https://workstation.repzo.com/docs/sales/deals) when there is a real opportunity. 4. Create or associate a [Price Offer](https://workstation.repzo.com/docs/sales/price-offers) when the opportunity needs a formal quote. 5. Track follow-up with [Activities](https://workstation.repzo.com/docs/engagement/activities), [Tasks](https://workstation.repzo.com/docs/engagement/tasks), and [Activity Reminders](https://workstation.repzo.com/docs/engagement/reminders). 6. Measure progress with the [Dashboard](https://workstation.repzo.com/docs/analytics/dashboard), [KPI Dashboard](https://workstation.repzo.com/docs/performance/kpi-dashboard), and [Reports](https://workstation.repzo.com/docs/analytics/reports). ## Main sections The documentation follows the same groups and order as the Workstation sidebar. Extra setup guides stay inside the group they support. ### Analytics Use analytics docs for the team feed, dashboards, proactive findings, and reports: - [Pulse](https://workstation.repzo.com/docs/analytics/pulse) - [Dashboard](https://workstation.repzo.com/docs/analytics/dashboard) - [Radar](https://workstation.repzo.com/docs/analytics/radar) - [Reports](https://workstation.repzo.com/docs/analytics/reports) ### CRM Use CRM docs to understand customer records, activities, and the pipeline model. Additional setup guides stay in this group after the main app pages: - [Accounts](https://workstation.repzo.com/docs/sales/accounts) - [Contacts](https://workstation.repzo.com/docs/sales/contacts) - [Deals](https://workstation.repzo.com/docs/sales/deals) - [Listings](https://workstation.repzo.com/docs/sales/listings) - [Price Offers](https://workstation.repzo.com/docs/sales/price-offers) - [Meeting Links](https://workstation.repzo.com/docs/sales/meeting-links) - [Activities](https://workstation.repzo.com/docs/engagement/activities) - [CRM Setup](https://workstation.repzo.com/docs/sales/crm-setup) - [Pipelines and Stages](https://workstation.repzo.com/docs/sales/pipelines) - [Properties](https://workstation.repzo.com/docs/administration/properties) - [Objects](https://workstation.repzo.com/docs/administration/objects) - [Tasks](https://workstation.repzo.com/docs/engagement/tasks) - [Activity Calendar](https://workstation.repzo.com/docs/engagement/calendar) - [Activity Reminders](https://workstation.repzo.com/docs/engagement/reminders) ### Operations Use operations docs for service, delivery, communication, and internal workflows: - [Projects](https://workstation.repzo.com/docs/operations/projects) - [Tickets](https://workstation.repzo.com/docs/operations/tickets) - [Appointments](https://workstation.repzo.com/docs/engagement/appointments) - [Online Booking](https://workstation.repzo.com/docs/engagement/online-booking) - [Appointment Checkout](https://workstation.repzo.com/docs/engagement/appointment-checkout) - [Client Loyalty](https://workstation.repzo.com/docs/operations/client-loyalty) - [Reviews](https://workstation.repzo.com/docs/engagement/reviews) - [Requests](https://workstation.repzo.com/docs/operations/requests) - [Drive](https://workstation.repzo.com/docs/operations/drive) - [Inbox](https://workstation.repzo.com/docs/operations/inbox) - [Calls](https://workstation.repzo.com/docs/operations/calls) - [AI Agents](https://workstation.repzo.com/docs/operations/ai-agents) - [Chat](https://workstation.repzo.com/docs/operations/chat) - [Approvals](https://workstation.repzo.com/docs/operations/approvals) ### Marketing Use marketing docs for campaigns, outbound messages, audiences, ads, and intake forms: - [Campaigns](https://workstation.repzo.com/docs/marketing/campaigns) - [Send](https://workstation.repzo.com/docs/marketing/send) - [Segments](https://workstation.repzo.com/docs/marketing/segments) - [Ads](https://workstation.repzo.com/docs/marketing/ads) - [Forms](https://workstation.repzo.com/docs/marketing/forms) ### Commerce Use commerce docs for orders, recurring billing, gift cards, invoices, payments, and bookkeeping: - [Orders](https://workstation.repzo.com/docs/commerce/orders) - [Subscriptions](https://workstation.repzo.com/docs/commerce/subscriptions) - [Gift Cards](https://workstation.repzo.com/docs/commerce/gift-cards) - [Invoices](https://workstation.repzo.com/docs/commerce/invoices) - [Payments](https://workstation.repzo.com/docs/commerce/payments) - [Accounting](https://workstation.repzo.com/docs/commerce/accounting) ### Point of Sale Use the [Point of Sale](https://workstation.repzo.com/docs/pos) docs for the in-store POS Console, POS sales reports, and staff time cards. ### Performance Use performance docs to set goals, monitor progress, and manage commissions: - [KPI Dashboard](https://workstation.repzo.com/docs/performance/kpi-dashboard) - [Goals](https://workstation.repzo.com/docs/performance/goals) - [KPI Reports](https://workstation.repzo.com/docs/performance/kpi-reports) - [Commission Plans](https://workstation.repzo.com/docs/performance/commission-plans) - [Commissions](https://workstation.repzo.com/docs/performance/commissions) ### Knowledge Use knowledge docs to create help centers, handbooks, documentation sites, and reusable knowledge sources: - [Content Hub](https://workstation.repzo.com/docs/knowledge/content-hub) ### Developers Use developer docs to work with the API and CLI or build apps for team chat: - [Developer API and CLI](https://workstation.repzo.com/docs/configuration/developer-api) - [Chat apps](https://workstation.repzo.com/docs/developers/chat-apps) - [Block Kit reference](https://workstation.repzo.com/docs/developers/block-kit) ### Configuration Use configuration docs to connect apps, automate work, manage billing, and configure the workspace: - [Marketplace](https://workstation.repzo.com/docs/configuration/marketplace) - [Workflows](https://workstation.repzo.com/docs/administration/workflows) - [Billing](https://workstation.repzo.com/docs/commerce/billing) - [Plans & Add-ons](https://workstation.repzo.com/docs/commerce/plans-and-add-ons) - [Seats](https://workstation.repzo.com/docs/commerce/seats) - [Locked Modules](https://workstation.repzo.com/docs/commerce/locked-modules) - [AI Balance & Packs](https://workstation.repzo.com/docs/commerce/ai-balance) - [Settings](https://workstation.repzo.com/docs/administration/settings) - [Team](https://workstation.repzo.com/docs/administration/team) - [Departments](https://workstation.repzo.com/docs/administration/departments) - [Table Views](https://workstation.repzo.com/docs/administration/table-views) - [Data Validation](https://workstation.repzo.com/docs/administration/validations) - [Notifications](https://workstation.repzo.com/docs/administration/notifications) --- # Getting Started > Understand the main Workstation concepts before configuring your workspace. Workstation is organized around customer records, team activity, operations, marketing, commerce, performance, knowledge, and configurable workflows. You do not need to configure every module before using the app, but a few core concepts make the rest of the documentation easier to follow. ## Your first sign-in After you sign in, Workstation opens on [Pulse](https://workstation.repzo.com/docs/analytics/pulse), the team feed, when your workspace includes it. Otherwise it opens on your [Dashboard](https://workstation.repzo.com/docs/analytics/dashboard). Use the left sidebar to move between modules. It hides pages your role can't open, and modules outside your [seats](https://workstation.repzo.com/docs/commerce/seats) show as [locked](https://workstation.repzo.com/docs/commerce/locked-modules). Owners and admins of a new workspace also see a floating **Set up your workspace** checklist. It walks through the first steps: invite your team, add contacts, create a deal, connect a channel, add products or services, and log an activity. You can minimize it, drag it out of the way, or choose **Skip setup**. Everything on it stays available from [Settings](https://workstation.repzo.com/docs/administration/settings). ## Organizations Each organization has its own isolated data. Contacts, accounts, deals, activities, tickets, projects, invoices, content, settings, and users belong to one organization and are not shared with other organizations. This matters because permissions, departments, data visibility, properties, pipelines, default record layouts, and automations are configured per organization. ## The sales flow The most common workflow starts with a contact and ends with a deal outcome: ```text Contact -> Deal -> Won or Lost | Price Offer -> Invoice ``` A [Contact](https://workstation.repzo.com/docs/sales/contacts) represents a person you may sell to, support, or work with. Contacts carry lifecycle fields such as status, score, source, pipeline, and stage, so early prospects do not need a separate prospect module. When the opportunity is real, open a [Deal](https://workstation.repzo.com/docs/sales/deals). Create or associate a [Price Offer](https://workstation.repzo.com/docs/sales/price-offers) when a formal quote is needed. ## Properties and record layouts [Properties](https://workstation.repzo.com/docs/administration/properties) defines the native, custom, and computed data available to a record. [Objects](https://workstation.repzo.com/docs/administration/objects) controls where that data and the module's cards appear on supported record pages. [Pipelines](https://workstation.repzo.com/docs/sales/pipelines) controls stages and movement rules. These settings are independent but designed to work together. ## Records and relationships Workstation connects records so teams can see the full customer history: - Accounts contain contacts. - Deals link to accounts and contacts. - Activities can be linked to contacts, accounts, deals, and other supported records. - Tickets can be linked to accounts and contacts. - Projects can be linked to deals. - Campaigns and segments help track where contacts came from and how audiences are grouped. - Invoices can connect commercial work back to customer records. Use these relationships to avoid duplicating information. For example, log a call as an [Activity](https://workstation.repzo.com/docs/engagement/activities) on the deal or contact instead of writing the same note in several places. ## Views and saved table layouts Many modules support list views with filters, sorting, columns, and saved configurations. Use [Table Views](https://workstation.repzo.com/docs/administration/table-views) when teams need repeatable views such as "My Open Deals" or "High Priority Tickets". ## Permissions and visibility Access is controlled by team roles, permissions, departments, and visibility settings. - Use [Team](https://workstation.repzo.com/docs/administration/team) to manage users and roles. - Use [Departments](https://workstation.repzo.com/docs/administration/departments) to model organization structure and record visibility. - Use [Settings](https://workstation.repzo.com/docs/administration/settings) for security, integrations, imports, exports, and global configuration. Seats sit alongside roles: a member's [seats](https://workstation.repzo.com/docs/commerce/seats) decide which modules they can open, and their role decides what they can do inside them. Modules outside someone's seats show as [locked](https://workstation.repzo.com/docs/commerce/locked-modules). ## Recommended setup order For a new workspace, configure the basics in this order: 1. Invite users, confirm roles in [Team](https://workstation.repzo.com/docs/administration/team), and give each person the [seats](https://workstation.repzo.com/docs/commerce/seats) they need. 2. Configure [Departments](https://workstation.repzo.com/docs/administration/departments) if visibility depends on team structure. 3. Review native fields and create custom fields in [Properties](https://workstation.repzo.com/docs/administration/properties). 4. Configure [Pipelines](https://workstation.repzo.com/docs/sales/pipelines) for contact lifecycle and deal stages. 5. Add required, conditional, and stage-based rules using [Data Validation](https://workstation.repzo.com/docs/administration/validations). 6. Arrange supported record pages in [Objects](https://workstation.repzo.com/docs/administration/objects). 7. Configure imports, integrations, and security in [Settings](https://workstation.repzo.com/docs/administration/settings). 8. Create saved [Table Views](https://workstation.repzo.com/docs/administration/table-views) for common workflows. 9. Configure optional modules such as [Forms](https://workstation.repzo.com/docs/marketing/forms), [Inbox](https://workstation.repzo.com/docs/operations/inbox), [Content Hub](https://workstation.repzo.com/docs/knowledge/content-hub), [Goals](https://workstation.repzo.com/docs/performance/goals), and [Pulse](https://workstation.repzo.com/docs/analytics/pulse) when the team is ready to use them. ## Next steps If you are learning the CRM flow, start with [CRM Setup](https://workstation.repzo.com/docs/sales/crm-setup) and [Contacts](https://workstation.repzo.com/docs/sales/contacts). If you are configuring the workspace for a team, start with [Settings](https://workstation.repzo.com/docs/administration/settings), [Team](https://workstation.repzo.com/docs/administration/team), and [Departments](https://workstation.repzo.com/docs/administration/departments). If you are expanding beyond CRM, review [Inbox](https://workstation.repzo.com/docs/operations/inbox), [Forms](https://workstation.repzo.com/docs/marketing/forms), [Invoices](https://workstation.repzo.com/docs/commerce/invoices), [Point of Sale](https://workstation.repzo.com/docs/pos), and [Content Hub](https://workstation.repzo.com/docs/knowledge/content-hub). --- # Pulse > Share wins, give kudos, run polls and challenges, and reward colleagues in the team feed. Pulse is your team's internal social feed. People share wins and updates, give each other kudos coins, run polls, and join team challenges. Pulse also posts on its own when something worth celebrating happens, such as a big deal being won or a teammate's birthday. Open **Analytics → Pulse**. When your plan includes Pulse, it is also the first page members see after signing in. Workspaces without Pulse land on the [Dashboard](https://workstation.repzo.com/docs/analytics/dashboard) instead. The page has two tabs: **Feed** and **Rewards**. The active tab is kept in the URL (`/pulse?tab=rewards`), so you can link straight to it. ## The feed The feed shows the newest posts first and updates live, so new posts, reactions, and comments appear without refreshing. Pinned posts stay at the top in their own section. Each post can be: | Post | Where it comes from | |---|---| | **Post** | A teammate shares an update, a win, or photos | | **Poll** | A teammate asks the team a question | | **Kudos** | A teammate gives kudos coins to a colleague | | **Challenge** | An owner or admin starts a team goal with a live progress bar | | **Big Win** | Pulse posts automatically when a deal is won | | **Celebration** | Pulse posts automatically for birthdays and work anniversaries | | **Achievement** | Pulse posts the weekly heroes digest, monthly awards, and completed challenges | React to a post with 👏 🔥 ❤️ 🏆 😂 or 🎉. Hover over a reaction to see who reacted. Comment on a post and type `@` to mention a colleague; they get a notification. Click any name or avatar to open that person's profile. It shows the kudos they have received, their current daily streak, and their [badges](#badges). ### Write a post Type in the composer at the top of the feed and click **Post**. From the composer you can also: - **Photo**: attach up to six images. - **Poll**: open the poll dialog. - **Give kudos**: send coins to a colleague. - **Challenge**: start a team challenge (owners and admins only). Authors can delete their own posts and comments. Owners and admins can delete any post or comment, and can pin or unpin posts. ### Polls A poll needs a question and at least two options. Optional settings: | Setting | What it does | |---|---| | **Show who voted** | Shows voter names instead of keeping votes anonymous | | **Allow multiple answers** | Lets each person pick more than one option | | **Allow adding options** | Lets voters add their own options | | **Allow revoting** | Lets people change or retract their vote | | **Set correct answer** | Turns the poll into a quiz | | **Limit duration** | Closes the poll after a set number of hours or days | | **Hide results until closed** | Keeps results hidden until the poll closes (needs a duration) | Polls work the same way as polls in [Chat](https://workstation.repzo.com/docs/operations/chat). ### Challenges A challenge is a time-boxed team goal. Give it an emoji, a name, a target, an end date, and pick what counts: - Deals won - Tickets resolved - Kudos given - Pulse posts The challenge card shows live progress based on real records. When the team reaches the target, Pulse posts a celebration once. Everyone takes part, but only owners and admins can start a challenge. ## Kudos coins Every member gets a monthly allowance of kudos coins to give away (100 by default). The allowance resets each month and cannot be kept, only given. To give kudos, click **Give kudos**, pick a colleague, choose how many coins, and write why they earned it. The kudos appears in the feed and the colleague gets a notification. The right-hand rail shows: - **Kudos coins**: how many you have left to give this month, plus what you received this month and all time. - **Most loved this month**: the colleagues who received the most kudos. - **This month**: participation rate, posts, coins moved, and reactions. Only owners and admins see this card. Coins you **receive** are a separate balance. You can spend them on perks in the Rewards tab. ## Rewards The **Rewards** tab shows your coin balance and the perks your workspace offers, such as a coffee voucher or a half day off. Click **Redeem** on a perk to request it. The coins are held while the request waits for approval. Owners and admins see a **Waiting for approval** list. **Approve** spends the coins; **Decline** returns them. The person who redeemed gets a notification either way. Everyone can follow their own requests under **My redemptions**. If your workspace sets a coin expiry, received coins expire that many months after they were earned. The oldest coins are always spent first. ## Automatic posts Pulse posts these on its own: | Post | When | |---|---| | **Big Win** | A deal moves into a won stage for the first time. You can set a minimum deal value and hide amounts. | | **Birthday and work anniversary** | On the day, for members who have saved their dates | | **This week's heroes** | Once a week, at the start of the business day on the chosen weekday | | **Monthly awards** | Early each month: Most Loved, Most Generous, Rainmaker, and Support Hero for the previous month | | **Challenge complete** | The first time a challenge reaches its target | New workspaces also get a welcome post from Fox that explains how Pulse works. ### Birthdays and work anniversaries Members add their own dates from the **Celebrations** card in the rail, or later from **Settings → Profile**. Only the month and day of a birthday are stored, never the year. The card disappears from the rail once both dates are saved. ## Badges Badges are earned from real activity and show on each person's profile: | Badge | How to earn it | |---|---| | 🎯 Closer | Win a deal | | 🏆 Rainmaker | Win 10 deals | | 🛟 Support Hero | Resolve 25 tickets | | 🔧 Problem Solver | Resolve 100 tickets | | ❤️ Team Favorite | Receive 100 kudos | | 🤝 Generous Heart | Give away 100 kudos | | 📣 Hype Machine | Give 100 reactions | | 🗳️ Poll Master | Run 5 polls | | ✍️ Storyteller | Share 10 posts | | 🔥 On Fire | Reach a 7-day activity streak | | ⚡ Streak Legend | Reach a 30-day streak | ## Settings The workspace owner configures Pulse in **Settings → Pulse**. These settings apply to everyone: | Setting | Default | Purpose | |---|---|---| | **Monthly kudos allowance per person** | 100 | Coins each member can give away per month | | **Only celebrate deals worth at least** | No minimum | Stops small wins from flooding the feed (in your base currency) | | **Coins expire after (months)** | 12 | When received coins expire; choose **Never** to keep them | | **Max coins to the same colleague** | No cap | Limits how much one person can give the same colleague per month | | **Show deal values on win posts** | On | Turn off if deal amounts are sensitive, since everyone can see Pulse | | **Post a weekly "this week's heroes" digest** | On, Friday | Turns the weekly digest on or off and sets the day | The **Rewards catalog** on the same page lists the perks people can redeem. Add a perk with **New perk** (emoji, name, description, cost in coins, active or not), or start from **Templates**. Turning a perk off hides it from the Rewards tab; deleting it keeps past redemptions. ## Notifications Pulse can notify you about new posts (grouped into one alert), mentions, comments on your posts, reactions to your posts, kudos you receive, and team celebrations. Choose which ones you get in [Notifications](https://workstation.repzo.com/docs/administration/notifications). ## Ask Fox Fox can use Pulse data to answer questions such as "who deserves recognition this week?". It looks at kudos received and given, deals won, and tickets resolved, so it can spot different kinds of contribution. ## Permissions | Permission | Allows | |---|---| | `pulse.view` | Open Pulse and read the feed. Every role has it. | | `pulse.post` | Post, comment, react, vote, give kudos, and redeem perks | | `pulse.manage` | Start challenges, pin posts, approve or decline redemptions, and see the monthly analytics card | Changing Pulse settings and the rewards catalog is limited to the workspace owner. Pulse is included with Pro seats; see [Plans & Add-ons](https://workstation.repzo.com/docs/commerce/plans-and-add-ons). ## Related pages - [Dashboard](https://workstation.repzo.com/docs/analytics/dashboard) - [Chat](https://workstation.repzo.com/docs/operations/chat) - [Notifications](https://workstation.repzo.com/docs/administration/notifications) - [Team](https://workstation.repzo.com/docs/administration/team) --- # Dashboard > Track key numbers on a personal dashboard of widgets, with date ranges, comparisons, and links into Reports. The Dashboard is a grid of widgets that show your key numbers at a glance: contacts, deals, revenue, activities, tickets, and inbox performance. Each person has their own dashboard, so you can arrange it around the work you do without changing anyone else's. Open **Analytics → Dashboard**. New users start with a default sales layout that you can change at any time. ## Date range and comparison The toolbar controls apply to every widget on the dashboard: | Control | What it does | |---|---| | **Date range** | Pick a preset (Today, Last 7 days, Last 30 days, Month to date, Last quarter, and more) or a custom range. The default is the last 30 days. | | **Comparison** | Compare against the previous period, the previous year, the previous year matched by day of week, or a custom range. Choose **No comparison** to turn it off. | | **Currency** | Show money values in one of your organization's currencies. The choice is saved with your dashboard. | | **Refresh data** | Reload every widget. The time of the last refresh is shown in the header. | Your date range and comparison are remembered in this browser. Preset ranges such as "Last 30 days" always move with today's date. Numbers follow your data visibility. If you can only see your own or your department's records, the widgets only count those records. ## Widgets Widgets come in a few shapes: - **Stat cards** show one number, with the change against the comparison period. - **Charts** show trends over time or a split by stage, source, owner, or channel. - **Breakdowns and ranked lists** show the top values for one field, such as contacts by source or activities by type. - **Tables** rank owners or accounts, such as top owners by deal value. - **Streaks leaderboard** ranks team members by their current daily streak. Click a widget's header to open the same data in [Reports](https://workstation.repzo.com/docs/analytics/reports), with the dashboard's date range, comparison, and currency already applied. From there you can change the grouping, add filters, or save it as a report. ## Customize the dashboard Click **Customize** to edit the layout. A widget library opens beside the grid: - Add a widget by clicking it in the library or dragging it onto the grid. Search for a widget or browse by category: Overview, Sales, Contacts, Customers, Activities, Support, and Team. - Drag a widget by its handle to move it, and drag its edge to resize it. - Click a widget's title to rename it. - Remove a widget with its close button. Click **Done** when you are finished. Changes save as you make them. **Reset to default** (shown while customizing) removes your changes and restores the default layout. ### Default widgets A new dashboard includes: | Widget | Shows | |---|---| | Contacts | Total contacts | | Active deals | Open deals in your pipelines | | Revenue won | Revenue from won deals | | Contacts in lifecycle | Contacts assigned to a lifecycle stage | | Revenue over time | Won-deal revenue trend | | Deals breakdown | Key deal metrics at a glance | | Contacts over time | New contacts over time | | Deals by stage | Deals in each pipeline stage | | Contacts by source | Where contacts come from | | Top owners by deal value | Sales reps ranked by deal value | | Activities by type | Activity volume per type | The library also has widgets for pipeline value, weighted pipeline, average deal size, deals won, new accounts, top accounts, deals by owner, contacts by rating, tickets by priority, and inbox performance (open conversations, first response time, conversations by channel, replies over time, and assignee performance). ### Sales template Choose **Start from a template → Sales** for a sales manager's view. Deal amounts are monthly recurring revenue (MRR), so ARR is MRR × 12. - **Twelve cards in three rows:** - revenue: New MRR, New ARR, won deals, average deal size - pipeline: pipeline value, weighted pipeline, win rate, average sales cycle - contacts: new contacts, qualified contacts, contact → customer, overdue follow-ups - **Revenue trend:** New MRR by month as bars and won deals as a line over the last 12 months, against the year before. - **Win rate by month**, the **sales funnel**, and **goal vs target** for a KPI goal you choose. - **Top salespeople:** the five with the most New MRR, and everyone else as Other. - **Revenue by lead source:** a treemap by the lead source of each deal's contact. - **Salesperson performance** and **contacts requiring attention**. - **Pipeline by stage and owner:** a heatmap of every open deal today. - **Repeat deals by account:** a cohort grid of accounts that came back with another deal. The template adds these only when your workspace has the records for them: - **Live subscription MRR** and **ended subscriptions**, if you have subscriptions - **Customer health (RFM)**, if you have invoices or orders (see [RFM grid](https://workstation.repzo.com/docs/analytics/repzoql/visualize#rfm-grid)) Most widgets follow the dashboard's date range. The 12-month trends, the cohort grid, the pipeline heatmap, live MRR, and RFM use their own period, which is part of their [query](https://workstation.repzo.com/docs/analytics/report-queries). Clicking one of these opens its query in Reports. Picking a template replaces the widgets on that dashboard. Dashboards built from an earlier version of the template don't change. ### Add a report to the dashboard Any report can become a widget. In [Reports](https://workstation.repzo.com/docs/analytics/reports), open or build a report and click **Add to dashboard**. Choose whether to add it as a **Chart**, a **Table**, or **Chart + Table**. ## Permissions The Dashboard needs `dashboard.view`, which every role has. Workspaces that include [Pulse](https://workstation.repzo.com/docs/analytics/pulse) open on Pulse after sign-in; others open on the Dashboard. ## Related pages - [Reports](https://workstation.repzo.com/docs/analytics/reports) - [Radar](https://workstation.repzo.com/docs/analytics/radar) - [KPI Dashboard](https://workstation.repzo.com/docs/performance/kpi-dashboard) - [Departments](https://workstation.repzo.com/docs/administration/departments) for data visibility --- # Radar > Monitor CRM risks and act on evidence-backed findings. Radar watches your records for problems that need attention, such as a deal stuck in a stage or a ticket about to breach its SLA. Instead of searching reports for every risk, Radar checks records on a schedule and creates a **finding** with its evidence, severity, and history. ## Work with findings Open **Analytics → Radar** to see findings in three tabs: **Open**, **Snoozed**, and **Resolved**. Filter by severity (Critical, High, Medium, Low, Info) or by record type (deals, tickets, projects, orders, and conversations). Findings come from two kinds of detectors: - **Built-in detectors**: [Stage Health](https://workstation.repzo.com/docs/sales/pipelines#stage-health) (records that stall in a pipeline stage), Ticket SLA, and Inbox SLA. - **Monitors** you create (see below). Open a finding to see: - the affected record and the detector that found it; - when it was first and most recently detected; - a summary and the evidence behind it; - risk, impact, urgency, priority, and confidence, when scoring is available; - the full history of what happened to it. On an active finding you can **Acknowledge**, **Snooze**, **Resolve**, or **Dismiss** it. Snooze when the issue is real but should come back later; resolve when the problem has been handled; dismiss when it should not be acted on. Click **Ask Fox** to discuss the finding with Fox next to the evidence. Deal, ticket, order, and listing records also show a **Radar Findings** card, so you can see open findings without leaving the record. ## Monitors Click **Monitors** on the Radar page to manage your own detectors. Click **New monitor** and start from a template, or build one from scratch for contacts, accounts, deals, tickets, invoices, or inbox conversations. A monitor defines: | Section | What you set | |---|---| | **Conditions** | Which records to check, using native or custom-property conditions | | **Signals** | Risk signals and scoring, such as days since last activity, days in current stage, close date changes, or upcoming activities (where the record type supports them) | | **Schedule** | Hourly, daily, or weekly, with a time and weekday where relevant | | **Delivery** | **Inbox only** (findings stay in Radar) or **Notify immediately**, a minimum severity, and a cooldown in hours | | **Who gets told** | The record owner, optionally with admins as a fallback when nobody owns the record | Turn on **Open a Fox conversation with each recipient** to have Fox start an evidence-backed chat when a finding passes the minimum severity. **Preview** tests your unsaved changes against real records without creating findings. **Run now** evaluates the monitor right away, and **Runs** lists recent evaluations and the findings each one changed. ### Monitor status | Status | Behavior | |---|---| | **Draft** | Being set up; does not run | | **Shadow** | Runs and records results, but does not notify anyone | | **Live** | Runs, creates findings, and delivers them | | **Paused** | Stopped until you resume it | | **Archived** | Retired | Use shadow mode to check that a new monitor finds the right records before you go live. ## Permissions | Permission | Allows | |---|---| | `radar.view` | Open Radar and see findings | | `radar.resolve` | Acknowledge, snooze, resolve, and dismiss findings | | `radar.manage` | Create, edit, run, and change the status of monitors | Radar is included with Pro seats; see [Plans & Add-ons](https://workstation.repzo.com/docs/commerce/plans-and-add-ons). ## Related pages - [Dashboard](https://workstation.repzo.com/docs/analytics/dashboard) - [Reports](https://workstation.repzo.com/docs/analytics/reports) - [Pipelines](https://workstation.repzo.com/docs/sales/pipelines) - [Tickets](https://workstation.repzo.com/docs/operations/tickets) - [Properties](https://workstation.repzo.com/docs/administration/properties) --- # Reports > Build, save, share, and export reports across CRM, operations, and commerce data. Reports turn your records into numbers, charts, and tables. Pick what to count (metrics), how to group it (dimensions), and how to show it, then save the result so you and your team can come back to it. Open **Analytics → Reports** to see the report library. Click **New report** to build one from scratch. ## The report library The library lists every report you can open: - **Workstation** reports, a ready-made set covering revenue, pipeline, contacts, accounts, activities, team performance, tickets, projects, appointments, requests, and website traffic. - Reports you created. - Reports colleagues shared with you. - Reports saved from a module's **Reports** tab, such as Invoices and Payments (see [Module reports](#module-reports)). The list shows each report's name, category, when you last viewed it, and who created it. Search by name, or filter by **Category** and **Created by**. Pin a report to keep it at the top of your list; pins are personal. ## Build a report A new report opens the report builder. Its right-hand panel has two tabs: **Freeform**, where you pick fields, and **Query**, where you write the report as a short query (see [Report queries](https://workstation.repzo.com/docs/analytics/report-queries)). Switching tabs keeps the report: the builder turns into a query and back. The **Freeform** tab has four parts: | Part | What it does | |---|---| | **Metrics** | What to measure, such as Deals, Revenue (Won Deals), Average Deal Value, or Completed Activities | | **Dimensions** | How to group the numbers, such as stage, owner, source, or created date | | **Visualization** | How to show the result. A recommended option is suggested based on your data. | | **Filters** | Which records to include | Start by adding a metric. Metrics and dimensions are grouped by object: Deals, Accounts, Contacts, Activities, Price Offers, Invoices, Tickets, Projects, Milestones, Jobs, Appointments, Requests, Orders, Carts, Line Items, Products, Product Variants, Subscriptions, Listings, Campaigns, Articles, Forms, Suppliers, Inbox Conversations, Inbox Messages, Agent Runs, Goals, and Widget Analytics. Every object's data visibility applies. Reports on orders, carts, line items, products, product variants, suppliers, subscriptions, listings, campaigns, articles, forms, and goals also need that object's view permission and a plan that includes its module; see [Objects](https://workstation.repzo.com/docs/analytics/repzoql/objects). Custom properties from [Properties](https://workstation.repzo.com/docs/administration/properties) show up as dimensions and filters next to the native fields. Some dimensions come from a related record, for example a deal's account name. Filters in the builder apply to the report's main object, which is the object of the first metric. To filter or group by a related record, such as a deal's account industry or a contact's lead source, write it as a [query](https://workstation.repzo.com/docs/analytics/report-queries#related-records), or filter by a [segment](https://workstation.repzo.com/docs/marketing/segments). ### Ask Fox Instead of picking fields by hand, describe the report in the box above the chart. For example: "top 5 won deals by owner this quarter". Once a report is open, use the same box to refine it, such as "group by month" or "only deals over $10k". Fox writes a [report query](https://workstation.repzo.com/docs/analytics/report-queries), and shows it above the chart, so you can see exactly what it built and change it. ### Visualizations | Type | Best for | |---|---| | **Display metric** | One number, with its change against a comparison period | | **Gauge** | One number against a target, either a fixed number or another metric | | **Line** and **Area chart** | Trends over time | | **Vertical** and **horizontal bars** | Comparing groups, in simple, stacked, or grouped form | | **Donut** and **Pie chart** | Share of a total | | **Funnel** | Movement through stages | | **Bar and line** | One metric as bars and another as a line | | **Breakdown bar**, **Treemap** | Share of a total | | **Waterfall** | How each period adds up to the total | | **Heatmap**, **Calendar heatmap** | Patterns across two groupings, or across days | | **Scatter plot**, **Bubble chart**, **Radar** | Several numbers per group | | **Histogram** | How values are spread | | **Display table**, **List by metric**, **List by dimension** | Exact values | Cohort grids and retention curves come from [cohort queries](https://workstation.repzo.com/docs/analytics/repzoql/cohort). For charts over time, **Running total** adds each period to the ones before it. Charts also show a data table below them; with a comparison, each value shows the comparison value and the change under it. Use **Items shown** to limit how many groups the chart draws; the table still shows every row. ### Date range, comparison, and currency The toolbar above the chart controls the time period: - **Date range**: a preset or custom range. For objects with more than one date, choose which date the range uses, for example a deal's create date, close date, or won date. - **Comparison**: the previous period, the previous year, the previous year matched by day of week, or a custom range. - **Currency**: the currency used for money values. When you group by a date, choose the grouping: day, week, month, quarter, or year. ## Save and share Click **Save** and give the report a name, an optional description, and a category. After you change a saved report, the toolbar shows **Unsaved**; click **Save** to keep the changes, **Discard** to undo them, or **Save as new** to keep the original. Workstation reports and reports shared with you can't be changed directly. Use **Save as new** to make your own copy. Click **Share** on a report you own to choose who can open it: | Access | Who can open it | |---|---| | **Only me** | Just you | | **Selected users** | The people you pick | | **Everyone in the organization** | All members with Reports access | Only you can edit the original. People you share with still need Reports access, and they only see records their own [data visibility](https://workstation.repzo.com/docs/administration/departments) allows. Use **Copy link** to send a direct link. ## Use a report elsewhere - **Add to dashboard** adds the report to your [Dashboard](https://workstation.repzo.com/docs/analytics/dashboard) as a **Chart**, a **Table**, or **Chart + Table**. - **Export** downloads the result as **CSV** or **XLSX (Excel)**. A report returns up to 1,000 rows. Narrow the date range or add filters if you need more detail. ## Module reports Some modules have their own **Reports** tab next to **Records** in the module header. Today these are [Invoices](https://workstation.repzo.com/docs/commerce/invoices) and [Payments](https://workstation.repzo.com/docs/commerce/payments). A module report uses the same filters and columns as the module's list, so its totals match what you see there. On a module's Reports tab you can: - Start from a template, such as **Invoice overview**, **By account**, **Outstanding invoices**, **Payment overview**, or **By payment method**. - Filter, choose columns, and **Group by** a field to get one summary row per group. - Show **Summary cards** and a **Chart**. Pick the chart measure and what to group it by. Date charts can show days, weeks, or months. - Click a bar or a group to see the records behind it. - **Export** the records or the summary. - **Save report** to add it to the report library. Opening it from the library takes you back to the module's Reports tab. From the Invoices list you can also click **Create report from view** to turn your current filters into a report. Module reports need both the module's view permission and Reports access. ## Other reports - [KPI Reports](https://workstation.repzo.com/docs/performance/kpi-reports) track goal and KPI performance. - [Accounting reports](https://workstation.repzo.com/docs/commerce/accounting/reports) cover the ledger, trial balance, and financial statements. Accounting data is not part of this module. - [Point of Sale](https://workstation.repzo.com/docs/pos) has its own sales reports. ## Permissions Reports need `reports.view`. Report data always follows each person's [data visibility](https://workstation.repzo.com/docs/administration/departments), so two people opening the same report may see different totals. ## Related pages - [Report queries](https://workstation.repzo.com/docs/analytics/report-queries) - [Dashboard](https://workstation.repzo.com/docs/analytics/dashboard) - [Radar](https://workstation.repzo.com/docs/analytics/radar) - [Properties](https://workstation.repzo.com/docs/administration/properties) - [Pipelines](https://workstation.repzo.com/docs/sales/pipelines) --- # Report queries > Write reports as short queries in RepzoQL: getting started, running queries, related records, and the full reference. A report query describes a report in a few lines of text. The language is called **RepzoQL**. It's another way to build the same reports as the [report builder](https://workstation.repzo.com/docs/analytics/reports): every query fills the builder, and every builder report can be shown as a query. If you have used ShopifyQL or SQL, it will feel familiar. ```sql FROM deals SHOW count, won_value GROUP BY owner WHERE stage = "Proposal" OR stage = "Negotiation" DURING this_quarter COMPARE TO previous_quarter ``` ## Getting started Each step answers a question by adding one clause to the query before it. **How many deals do we have?** Start with the object and what to count. See [FROM and SHOW](https://workstation.repzo.com/docs/analytics/repzoql/from-and-show). ```sql FROM deals SHOW count ``` **How much did we win this quarter?** Add a metric and a period. See [SINCE, UNTIL, DURING](https://workstation.repzo.com/docs/analytics/repzoql/since-until-during). ```sql FROM deals SHOW count, won_value DURING this_quarter ON won_at ``` **Who won it?** Split the numbers by a field. See [GROUP BY](https://workstation.repzo.com/docs/analytics/repzoql/group-by). ```sql FROM deals SHOW count, won_value GROUP BY owner DURING this_quarter ON won_at ``` **Only deals from the website?** Filter the records. See [WHERE](https://workstation.repzo.com/docs/analytics/repzoql/where). ```sql FROM deals SHOW count, won_value GROUP BY owner WHERE contacts.source = "Website" DURING this_quarter ON won_at ``` **Better or worse than last quarter?** Compare periods and sort. See [COMPARE TO](https://workstation.repzo.com/docs/analytics/repzoql/compare-to) and [ORDER BY](https://workstation.repzo.com/docs/analytics/repzoql/order-by-and-limit). ```sql FROM deals SHOW count, won_value GROUP BY owner WHERE contacts.source = "Website" DURING this_quarter ON won_at COMPARE TO previous_quarter ORDER BY won_value DESC ``` ## Running queries ### In the report page Open **Analytics → Reports** and start or open a **Freeform** report. The query sits above the chart; while the report is empty it's just the Ask Fox box, and the arrow (or **⌘ E**) opens the editor. It updates as you change the builder on the right, and the builder follows the query when you run it with **⌘ Enter**. **Controls** at the top hides the right-hand panel to give the chart the full width. The editor helps as you type: - Suggestions open on a new line, after a space, and after you pick one, with a short description under each. The selected one shows faded after the cursor; **Tab** or **Enter** takes it. - Mistakes are underlined, with a fix such as "Did you mean `count`?". - The book icon lists the metrics and fields of each object; click a name to add it. - The **?** icon opens this documentation. **Cohorts** is the report page's second mode, for retention reports without writing a query. See [COHORT](https://workstation.repzo.com/docs/analytics/repzoql/cohort#in-the-report-builder). ### Ask Fox Describe a report in the box under the query, such as "average won deal by owner, only owners with at least 3 deals". Fox writes the query, explains what it built in one sentence, and runs it. Ask again to change it, for example "split it by month" or "compare with last year". Fox in the side panel answers number questions the same way, with your own permissions and data visibility. ### Saving, sharing, and links A report written as a query is saved with its query. When it's opened, the query runs again, so `me` means the person viewing it and `-30d` means the last 30 days from today. The same is true for dashboard widgets added from the report: on a shared dashboard each person sees their own numbers. The address of a report keeps its query (`?q=`), so you can send the link to a colleague. ### Using queries from the API Integrations can run a query with `POST /api/v1/reports/query` and the `reports:read` scope. See [Developer API](https://workstation.repzo.com/docs/configuration/developer-api) for keys and scopes. ```json { "query": "FROM deals SHOW count, won_value GROUP BY owner DURING this_quarter WITH TOTALS" } ``` The response has the compiled report, its rows, the comparison rows when the query compares periods, and the totals. A mistake returns a validation error with its line, column, and suggestions. Queries also build saved reports and dashboard widgets (`reports:write`): | Call | Body | |---|---| | `POST /api/v1/reports` | `{ "name": "Won by owner", "query": "FROM deals SHOW won_value GROUP BY owner" }` | | `POST /api/v1/dashboards` | `{ "name": "Sales", "template": "sales" }` (or `blank`, `default`) | | `POST /api/v1/dashboards/{id}/widgets` | `{ "title": "Revenue trend", "query": "FROM deals SHOW won_value TIMESERIES month DURING last_12_months", "ownPeriod": true }` | A widget follows the dashboard's date range unless `ownPeriod` is set, in which case it uses the query's own `DURING` and `COMPARE TO`. `GET /api/v1/dashboards/{id}` lists each widget with its query, so you can run it with `POST /api/v1/reports/query`. The [Repzo CLI](https://workstation.repzo.com/docs/configuration/developer-api) has the same commands. ## Related records Reports can mix objects that are linked to each other. Write the related object's name and a dot: ```sql -- Deals by their account's industry, for contacts from the website FROM deals SHOW count, value GROUP BY accounts.industry WHERE contacts.source = "Website" ``` ```sql -- Contacts with their deals and orders side by side FROM contacts SHOW count, deals.count, deals.won_value, orders.total GROUP BY source ``` A related object follows every link between the two records. To follow one specific reference, use its field name instead, for example `GROUP BY decision_maker.title` on deals. Deals, contacts, accounts, activities, price offers, invoices, tickets, projects, appointments, requests, orders, carts, subscriptions, listings, and campaigns can be combined. Products, product variants, line items, articles, forms, and suppliers are reported on their own. Each object keeps its own permissions and [data visibility](https://workstation.repzo.com/docs/administration/departments). See [Objects](https://workstation.repzo.com/docs/analytics/repzoql/objects). ## Parts of a query | Clause | What it does | |---|---| | [FROM and SHOW](https://workstation.repzo.com/docs/analytics/repzoql/from-and-show) | The object, and the numbers to show | | [WHERE](https://workstation.repzo.com/docs/analytics/repzoql/where) | Only count matching records | | [GROUP BY](https://workstation.repzo.com/docs/analytics/repzoql/group-by) | Split the numbers by fields | | [TIMESERIES](https://workstation.repzo.com/docs/analytics/repzoql/timeseries) | Split by time, with no gaps | | [SINCE, UNTIL, DURING](https://workstation.repzo.com/docs/analytics/repzoql/since-until-during) | The period, and which date it uses | | [COMPARE TO](https://workstation.repzo.com/docs/analytics/repzoql/compare-to) | A second period to compare with | | [WITH](https://workstation.repzo.com/docs/analytics/repzoql/with) | Totals, percent change, running totals, currency, time zone | | [HAVING](https://workstation.repzo.com/docs/analytics/repzoql/having) | Keep only groups whose numbers match | | [ORDER BY and LIMIT](https://workstation.repzo.com/docs/analytics/repzoql/order-by-and-limit) | Sort and page the rows | | [COHORT](https://workstation.repzo.com/docs/analytics/repzoql/cohort) | Follow people from their first record | | [VISUALIZE](https://workstation.repzo.com/docs/analytics/repzoql/visualize) | Pick the chart | The [syntax overview](https://workstation.repzo.com/docs/analytics/repzoql/syntax) covers names, values, comments, and errors; [Functions](https://workstation.repzo.com/docs/analytics/repzoql/functions) covers `sum()`, math, and date functions. ## Related pages - [Reports](https://workstation.repzo.com/docs/analytics/reports) - [Dashboard](https://workstation.repzo.com/docs/analytics/dashboard) - [Properties](https://workstation.repzo.com/docs/administration/properties) - [Developer API](https://workstation.repzo.com/docs/configuration/developer-api) --- # Syntax overview > How a RepzoQL query is put together: clauses, names, values, comments, and errors. A RepzoQL query is a few lines of text, one clause per line. It starts with `FROM` and the object to report on; the other clauses can come in any order, and each is used once. ```sql FROM deals SHOW count, won_value GROUP BY owner WHERE stage != "Lost" DURING this_quarter COMPARE TO previous_quarter ORDER BY won_value DESC LIMIT 10 VISUALIZE won_value TYPE horizontal_bar ``` ## Clauses | Clause | What it does | Reference | |---|---|---| | `FROM` | The object to report on | [FROM and SHOW](https://workstation.repzo.com/docs/analytics/repzoql/from-and-show) | | `SHOW` | The numbers to show | [FROM and SHOW](https://workstation.repzo.com/docs/analytics/repzoql/from-and-show) | | `WHERE` | Only count matching records | [WHERE](https://workstation.repzo.com/docs/analytics/repzoql/where) | | `GROUP BY` | Split the numbers by fields | [GROUP BY](https://workstation.repzo.com/docs/analytics/repzoql/group-by) | | `TIMESERIES` | Split by time, with no gaps | [TIMESERIES](https://workstation.repzo.com/docs/analytics/repzoql/timeseries) | | `SINCE`, `UNTIL`, `DURING`, `ON` | The period and the date it uses | [SINCE, UNTIL, DURING](https://workstation.repzo.com/docs/analytics/repzoql/since-until-during) | | `COMPARE TO` | A second period to compare with | [COMPARE TO](https://workstation.repzo.com/docs/analytics/repzoql/compare-to) | | `WITH` | Totals, percent change, running totals, currency, time zone | [WITH](https://workstation.repzo.com/docs/analytics/repzoql/with) | | `HAVING` | Keep only groups whose numbers match | [HAVING](https://workstation.repzo.com/docs/analytics/repzoql/having) | | `ORDER BY`, `LIMIT`, `OFFSET` | Sort and page the rows | [ORDER BY and LIMIT](https://workstation.repzo.com/docs/analytics/repzoql/order-by-and-limit) | | `COHORT` | Follow people from their first record | [COHORT](https://workstation.repzo.com/docs/analytics/repzoql/cohort) | | `VISUALIZE` | Pick the chart | [VISUALIZE](https://workstation.repzo.com/docs/analytics/repzoql/visualize) | ## Names Objects, metrics, and fields are written by name. Names come from each object's catalog and from [Properties](https://workstation.repzo.com/docs/administration/properties), so custom properties work too. - A field is written as its name: `stage`, `owner`, `close_date`. - A custom property can be written as its label in snake case (`customer_tier`) or in double quotes (`"Customer tier"`). - A related object's metric or field takes the object name and a dot: `deals.won_value`, `accounts.industry`. See [Related records](https://workstation.repzo.com/docs/analytics/report-queries#related-records). The [Objects](https://workstation.repzo.com/docs/analytics/repzoql/objects) page lists every object. The editor's book icon lists each object's metrics and fields. ## Values | Kind | Examples | |---|---| | Text and options | `"Won"`, `"Website"`, `"Sam Seller"` (always in double quotes) | | Numbers | `1000`, `12.5` | | Dates | `2026-01-31`, `-30d`, `startOfMonth(-1m)`, `last_month` | | Yes / no | `IS TRUE`, `IS FALSE` | | The viewer | `me`, as in `owner = me` | Option values use the option's name. A stage name used by several pipelines matches all of them; write `"Won (Sales)"` to pick one. ## Keywords and comments Keywords can be upper or lower case. Line comments start with `--`; block comments go between `/*` and `*/`. ```sql FROM deals -- every deal /* won value by owner, this quarter only */ SHOW won_value GROUP BY owner DURING this_quarter ``` ## Errors The editor checks the query as you type. A mistake is underlined, the card shows the line and a short explanation, and close matches are offered as fixes: "Did you mean `count`?". The same message, with its line and column, comes back from the [API](https://workstation.repzo.com/docs/analytics/report-queries#using-queries-from-the-api). ## Related pages - [Report queries](https://workstation.repzo.com/docs/analytics/report-queries): getting started - [Functions](https://workstation.repzo.com/docs/analytics/repzoql/functions) - [Objects](https://workstation.repzo.com/docs/analytics/repzoql/objects) --- # FROM and SHOW > Choose the object to report on and the numbers to show: metrics, related metrics, math, and functions. Every query starts with `FROM` and the object to report on, followed by `SHOW` and the numbers you want. ```sql FROM deals SHOW count, value, won_value ``` ## FROM ```sql FROM ``` `FROM` takes one object: `deals`, `contacts`, `invoices`, `orders`, `subscriptions` and so on. The [Objects](https://workstation.repzo.com/docs/analytics/repzoql/objects) page lists them all, with what each one holds and whether it can be combined with others. ## SHOW ```sql SHOW [, ...] ``` `SHOW` takes one or more metrics, separated by commas. | Form | Example | Result | |---|---|---| | A metric of the object | `SHOW count, won_value` | The catalog metric | | A related object's metric | `SHOW deals.won_value` | The metric of the linked records | | Renamed | `SHOW won_value AS revenue` | The column is called `revenue` | | Scaled | `SHOW won_value * 12 AS ARR` | The metric times a number | | Math | `SHOW won_value / won_count AS avg_won` | A calculated metric | | A function of a field | `SHOW avg(amount), sum(mrr)` | See [Functions](https://workstation.repzo.com/docs/analytics/repzoql/functions) | ### Math Combine metrics with `+ - * /` and parentheses: ```sql FROM deals SHOW won_value * 12 AS ARR, won_value / won_count AS avg_won, won_count * 100 / count AS win_pct GROUP BY owner ``` Dividing by zero shows an empty value. In tables, a calculated rate is totaled from its parts, so the totals row stays correct. Money stays money: `won_value / won_count` is shown as currency, while `won_value / value` is a plain number. ### Related metrics When the object can be [combined](https://workstation.repzo.com/docs/analytics/report-queries#related-records), show the metrics of linked records next to its own: ```sql FROM contacts SHOW count, deals.count, deals.won_value, orders.total GROUP BY source ``` Each object keeps its own permissions and [data visibility](https://workstation.repzo.com/docs/administration/departments). ## Examples ```sql -- Revenue and order count this month FROM orders SHOW total, count DURING this_month ``` ```sql -- Average won deal per owner FROM deals SHOW won_value / won_count AS avg_won GROUP BY owner DURING this_year ON won_at ``` ## Related pages - [Functions](https://workstation.repzo.com/docs/analytics/repzoql/functions) - [Objects](https://workstation.repzo.com/docs/analytics/repzoql/objects) - [WHERE](https://workstation.repzo.com/docs/analytics/repzoql/where) --- # WHERE > Count only the records that match: comparisons, lists, text, numbers, dates, empty values, and groups of conditions. `WHERE` keeps only the records that match its conditions. ```sql FROM deals SHOW count, value WHERE stage IN ("Proposal", "Negotiation") AND owner = me ``` ## Syntax ```sql WHERE [AND | OR ...] ``` `AND` is applied before `OR`. Use parentheses to group conditions, and `NOT (…)` to turn a group around: ```sql WHERE (source = "Website" OR source = "Referral") AND NOT (stage = "Lost") ``` ## Conditions | Condition | Example | |---|---| | Equal, not equal | `stage = "Won"`, `stage != "Lost"` | | One of a list | `stage IN ("Proposal", "Won")`, `stage NOT IN ("Lost")` | | Text | `name CONTAINS "renewal"`, `STARTS WITH`, `ENDS WITH`, and their `NOT` versions | | Numbers | `amount > 1000`, `>=`, `<`, `<=`, `amount BETWEEN 100 AND 500`, `NOT BETWEEN` | | Dates | `close_date >= -30d`, `created_at = last_month`, `won_at < startOfYear(0y)` | | Empty or not | `close_date IS NULL`, `close_date IS NOT NULL` | | Yes / no | `budget_confirmed IS TRUE`, `IS FALSE`, `IS NOT TRUE` | | People | `owner = me`, `owner = "Sam Seller"` | Options (stages, sources, owners…) are written by name, in double quotes. A date range name means its whole range: `created_at = last_month` matches every day of last month. ## Related fields Filter on a linked object's field with its name and a dot: ```sql FROM deals SHOW count WHERE accounts.industry = "Software" AND contacts.source = "Website" ``` ## WHERE or HAVING `WHERE` filters records before they are counted. To filter on a number you show, such as "owners with more than 5 deals", use [HAVING](https://workstation.repzo.com/docs/analytics/repzoql/having). Functions like `sum(amount)` can't be used in `WHERE` for the same reason. ## Related pages - [HAVING](https://workstation.repzo.com/docs/analytics/repzoql/having) - [SINCE, UNTIL, DURING](https://workstation.repzo.com/docs/analytics/repzoql/since-until-during) - [Syntax overview](https://workstation.repzo.com/docs/analytics/repzoql/syntax) --- # GROUP BY > Split the numbers by fields, related fields, roles, and time units, and keep only the biggest groups with TOP. `GROUP BY` splits the numbers into rows, one for each value of a field. ```sql FROM deals SHOW count, won_value GROUP BY owner, stage ``` ## Syntax ```sql GROUP BY [ONLY] [TOP ] [OVERALL][, ...] ``` | Grouping | Example | |---|---| | A field of the object | `GROUP BY stage`, `GROUP BY owner` | | A custom property | `GROUP BY customer_tier`, `GROUP BY "Customer tier"` | | A related object's field | `GROUP BY accounts.industry` | | One specific reference | `GROUP BY decision_maker.title` | | A time unit | `GROUP BY month`, `GROUP BY day_of_week` | ## Time units `day`, `week`, `month`, `quarter`, `year`, `day_of_week`, `hour_of_day`, `week_of_year`, and `month_of_year`. `GROUP BY month` lists only the months that have data. To list every month in the period, with zeros where nothing happened, use [TIMESERIES](https://workstation.repzo.com/docs/analytics/repzoql/timeseries). ## Related fields and roles `accounts.industry` follows every link between the record and accounts. To follow one specific reference instead, write the reference's name and a dot, for example a deal's decision maker: ```sql FROM deals SHOW count GROUP BY decision_maker.title ``` ## TOP Keep the biggest groups and fold the rest into an **Other** row: ```sql FROM deals SHOW won_value GROUP BY TOP 5 owner ``` | Form | Result | |---|---| | `TOP 5 owner` | The five biggest owners, plus Other | | `ONLY TOP 5 owner` | The five biggest owners, no Other row | | `TOP 5 owner OVERALL` | With two groupings, ranks owners across everything instead of within each value of the first grouping | Groups are ranked by the first metric you show. ## Related pages - [TIMESERIES](https://workstation.repzo.com/docs/analytics/repzoql/timeseries) - [HAVING](https://workstation.repzo.com/docs/analytics/repzoql/having) - [ORDER BY and LIMIT](https://workstation.repzo.com/docs/analytics/repzoql/order-by-and-limit) --- # TIMESERIES > Split the numbers by day, week, month, quarter, or year, with every period listed. `TIMESERIES` splits the numbers by time and lists every period, with zeros where nothing happened. It's the clause for trend lines. ```sql FROM orders SHOW total TIMESERIES month DURING last_12_months ``` ## Syntax ```sql TIMESERIES day | week | month | quarter | year | day_of_week | hour_of_day ``` ## Default period Without `SINCE` or `DURING`, `TIMESERIES` picks a window for its unit: | Unit | Window | |---|---| | `day` | The last 30 days | | `week` | The last four weeks | | `month` | The last three months | | `quarter` | The last four quarters | | `year` | The last three years | ## With GROUP BY `TIMESERIES` can be combined with a grouping. Time comes first, then the field: ```sql FROM deals SHOW won_value TIMESERIES month GROUP BY owner DURING this_year ON won_at ``` `GROUP BY month` also groups by month, but lists only the months that have data. Use it for tables; use `TIMESERIES` for charts over time. ## Running totals Add `WITH CUMULATIVE_VALUES` to add each period to the ones before it. See [WITH](https://workstation.repzo.com/docs/analytics/repzoql/with). ## Related pages - [GROUP BY](https://workstation.repzo.com/docs/analytics/repzoql/group-by) - [SINCE, UNTIL, DURING](https://workstation.repzo.com/docs/analytics/repzoql/since-until-during) - [COMPARE TO](https://workstation.repzo.com/docs/analytics/repzoql/compare-to) --- # SINCE, UNTIL, DURING > Set the report's period with relative dates, exact dates, date functions, or named ranges, and choose which date it uses with ON. The period decides which records count. Use `DURING` for a named range, or `SINCE` and `UNTIL` for your own. ```sql FROM deals SHOW won_value DURING this_quarter ON won_at ``` ## Syntax ```sql DURING SINCE [UNTIL ] ON ``` Use either `DURING` or `SINCE`, not both. With no period, a report covers the last 30 days ([TIMESERIES](https://workstation.repzo.com/docs/analytics/repzoql/timeseries) picks a window for its unit instead). ## DURING `DURING` takes a named range: `today`, `yesterday`, `this_week`, `this_month`, `this_quarter`, `this_year`, `last_week`, `last_month`, `last_quarter`, `last_year`, `last_7_days`, `last_30_days`, `last_90_days`, `last_12_months`, `all_time`. ## SINCE and UNTIL ```sql SINCE -90d SINCE 2026-01-01 UNTIL 2026-03-31 SINCE startOfMonth(-1m) UNTIL endOfMonth(-1m) -- last month SINCE this_year UNTIL today ``` `UNTIL` defaults to today. With `TIMESERIES`, `UNTIL` can stand alone and the start comes from the unit's default window. ## Dates | Form | Examples | Meaning | |---|---|---| | Relative | `-7d`, `-4w`, `-6m`, `-1q`, `-1y` | Days, weeks, months, quarters, or years ago | | Named day | `today`, `yesterday`, `now` | | | Exact date | `2026-01-31` | | | Start or end of a period | `startOfMonth(-1m)`, `endOfQuarter(-1q)` | See [date functions](https://workstation.repzo.com/docs/analytics/repzoql/functions#date-functions) | | Range name | `this_year`, `last_month` | In `SINCE` its first day, in `UNTIL` its last day | ## ON By default the period applies to the date each record was created. `ON` picks another date field: ```sql FROM deals SHOW won_value DURING this_year ON won_at -- revenue by the day deals were won ``` Common choices: `won_at` and `close_date` on deals, `paid_at` and `issue_date` on invoices, `start_date` on subscriptions, `listed_at` and `sold_at` on listings. Orders use the store's order date when they have one. ## Time zones Add `WITH TIMEZONE 'America/New_York'` to read "today", "this month" and date functions in a specific time zone. See [WITH](https://workstation.repzo.com/docs/analytics/repzoql/with). ## Related pages - [COMPARE TO](https://workstation.repzo.com/docs/analytics/repzoql/compare-to) - [Functions](https://workstation.repzo.com/docs/analytics/repzoql/functions) - [TIMESERIES](https://workstation.repzo.com/docs/analytics/repzoql/timeseries) --- # COMPARE TO > Compare the report's period with an earlier one: the previous period, last year, or exact dates. `COMPARE TO` runs the same report for a second period and shows both side by side. ```sql FROM deals SHOW won_value TIMESERIES month DURING this_year COMPARE TO previous_year ``` ## Syntax ```sql COMPARE TO ``` | Target | Compares with | |---|---| | `previous_period` | The same length of time just before | | `previous_year` | The same dates a year earlier | | `previous_year_match_day_of_week` | A year earlier, lined up by weekday | | `previous_quarter`, `previous_month`, `previous_week`, `previous_day` | The period of that length just before | | A range name, such as `last_year` | That range | | `2025-01-01 UNTIL 2025-01-31` | Exact dates | One comparison per query. ## What you see - Charts draw both periods. - Each table cell shows the comparison value with the change under it, green when it's good news. - `WITH PERCENT_CHANGE` adds `percent_change_` columns (see [WITH](https://workstation.repzo.com/docs/analytics/repzoql/with)). - In a [cohort report](https://workstation.repzo.com/docs/analytics/repzoql/cohort), `COMPARE TO previous_period` compares the totals (the All cohorts row and the headline). ## Related pages - [SINCE, UNTIL, DURING](https://workstation.repzo.com/docs/analytics/repzoql/since-until-during) - [WITH](https://workstation.repzo.com/docs/analytics/repzoql/with) --- # WITH > Add totals, percent change, running totals, group subtotals, a currency, or a time zone to a report. `WITH` adds extras to a report. ```sql FROM deals SHOW won_value GROUP BY owner WITH TOTALS, PERCENT_CHANGE DURING this_quarter COMPARE TO previous_quarter ``` ## Syntax ```sql WITH [, ...] ``` `WITH` can follow `GROUP BY` or `TIMESERIES`, or stand on its own line. | Modifier | What it adds | |---|---| | `TOTALS` | A totals row (in the API, a `totals` field) | | `PERCENT_CHANGE` | The change against the comparison, as `percent_change_` columns (needs `COMPARE TO`) | | `CUMULATIVE_VALUES` | A running total along the time grouping | | `GROUP_TOTALS` | Subtotals for each value of the first grouping | | `CURRENCY 'EUR'` | Money in that currency (the default is the workspace's base currency) | | `TIMEZONE 'Asia/Amman'` | "Today" and "this month" read in that time zone | ## Examples ```sql -- Running total of won revenue this year FROM deals SHOW won_value TIMESERIES month WITH CUMULATIVE_VALUES DURING this_year ON won_at ``` ```sql -- Orders in euros FROM orders SHOW total GROUP BY payment_status WITH CURRENCY 'EUR' ``` ## Related pages - [COMPARE TO](https://workstation.repzo.com/docs/analytics/repzoql/compare-to) - [TIMESERIES](https://workstation.repzo.com/docs/analytics/repzoql/timeseries) --- # HAVING > Keep only the groups whose numbers match, after grouping. `HAVING` filters the grouped rows by a number you show. Use it for questions like "owners with at least 3 won deals". ```sql FROM deals SHOW won_count, won_value GROUP BY owner HAVING won_count >= 3 ``` ## Syntax ```sql HAVING [AND | OR ...] ``` A condition compares a shown metric (or its `AS` name, or a function such as `sum(amount)`) with a number: | Condition | Example | |---|---| | Compare | `count > 5`, `>=`, `<`, `<=`, `=`, `!=` | | Between | `value BETWEEN 1000 AND 5000`, `NOT BETWEEN` | | One of | `count IN (1, 2)`, `NOT IN` | | Empty | `avg_won IS NULL` | Join conditions with `AND` and `OR`, and group them with parentheses. A condition on a field you group by works too, and acts like a [WHERE](https://workstation.repzo.com/docs/analytics/repzoql/where) condition. ## Examples ```sql -- Industries where the average account is big FROM accounts SHOW avg(annual_revenue), count GROUP BY industry HAVING avg(annual_revenue) > 100000 ``` ```sql -- Sources with many contacts or a high win rate FROM contacts SHOW count, deals.won_count * 100 / deals.count AS win_pct GROUP BY source HAVING count >= 50 OR win_pct > 30 ``` ## Related pages - [WHERE](https://workstation.repzo.com/docs/analytics/repzoql/where) - [GROUP BY](https://workstation.repzo.com/docs/analytics/repzoql/group-by) --- # ORDER BY and LIMIT > Sort the rows by metrics or fields, keep the first ones, and page through the rest. `ORDER BY` sorts the rows; `LIMIT` keeps the first ones, and `OFFSET` skips some before that. ```sql FROM deals SHOW won_value GROUP BY owner ORDER BY won_value DESC LIMIT 5 ``` ## ORDER BY ```sql ORDER BY [ASC | DESC][, ...] ``` Sort by anything you `SHOW` or `GROUP BY`, by an `AS` name, or by a function you show (`ORDER BY sum(amount) DESC`). `ASC` is the default. Later columns break ties: ```sql ORDER BY stage ASC, value DESC ``` ## LIMIT and OFFSET ```sql LIMIT [OFFSET ] ``` `LIMIT 10 OFFSET 10` shows rows 11 to 20. A report returns at most 1,000 rows. In a [cohort report](https://workstation.repzo.com/docs/analytics/repzoql/cohort), `LIMIT` sets how many periods each cohort follows. ## Top N For "top 5 owners", either sort and limit, or use [TOP](https://workstation.repzo.com/docs/analytics/repzoql/group-by#top) to keep the rest as an **Other** row: ```sql GROUP BY TOP 5 owner ``` ## Related pages - [GROUP BY](https://workstation.repzo.com/docs/analytics/repzoql/group-by) - [VISUALIZE](https://workstation.repzo.com/docs/analytics/repzoql/visualize) --- # COHORT > Follow people from their first record: retention by week, month, or quarter, who starts a cohort, the first-record column, and comparisons. A cohort report follows people from their first record. Each row is a cohort, the people whose first record fell in the same week, month, or quarter; each column is a period after that. ```sql -- Of the contacts who bought for the first time each month, how many bought again? FROM invoices SHOW customers, retention_rate COHORT contact BY month DURING last_12_months VISUALIZE retention_rate TYPE cohort_grid ``` ## Syntax ```sql COHORT [BY week | month | quarter] [STARTING WITH ] [INCLUDING FIRST] ``` | Part | What it does | |---|---| | `` | Who to follow: the object itself (`COHORT contact` on contacts) or a reference on it (`contact`, `account`, `owner`) | | `BY` | The cohort interval; `month` by default | | `STARTING WITH` | Only people whose **first** record matches start a cohort. Their later records all count. | | `INCLUDING FIRST` | Adds a **First** column with the first records themselves | `LIMIT` sets how many periods each cohort follows (12 by default). `WHERE` filters every record a cohort counts. `GROUP BY` and `TIMESERIES` don't apply: a cohort report groups by cohort and period itself. ## The periods - **First** (with `INCLUDING FIRST`): the records that put each person in the cohort. - **Period 0**: people who came back in the same period as their first record. - **Period 1, 2, …**: people active in each period after that. Periods that haven't happened yet are left out, so recent cohorts have fewer columns. ## Metrics | Metric | Meaning | |---|---| | `customers` | People active in the period | | `retention_rate` | Active people as a share of the cohort | | `cohort_size` | People in the cohort | | Counts and totals of the object | For example `count`, `total`, `won_value`, `sum(amount)` | | Math | For example `total / cohort_size AS per_customer` | Show it as `cohort_grid` (one row per cohort, shaded by value) or `retention_curve` (one line per cohort). The **All cohorts** row averages each period over the cohorts that have reached it, weighted by size. ## Who starts a cohort `STARTING WITH` takes the same conditions as [WHERE](https://workstation.repzo.com/docs/analytics/repzoql/where), applied to each person's first record: ```sql -- Retention of customers whose first order was paid online FROM orders SHOW customers, retention_rate COHORT contact STARTING WITH payment_status = "paid" DURING last_12_months ``` The difference from `WHERE`: `WHERE payment_status = "paid"` would also drop their later unpaid orders, while `STARTING WITH` only decides who is in. ## Comparing totals ```sql COMPARE TO previous_period ``` Runs the same cohorts for the period before and shows the earlier value and the change in the headline and the All cohorts row (in points for retention). ## In the report builder Switch a report from **Freeform** to **Cohorts** to build one without writing it: - **Metric**, **Records**, **Follow**, **Chart**, **Interval**, and **Periods**. - **Cohort starts with**: the filter icon sets the `STARTING WITH` conditions. - **Show first record**: the `INCLUDING FIRST` column. - **Filters**: the `WHERE` conditions. - **Compare** (at the top): individual cohorts, or totals against the previous period. Like in Shopify, switching between Freeform and Cohorts starts a new report. ## Related pages - [Report queries](https://workstation.repzo.com/docs/analytics/report-queries) - [WHERE](https://workstation.repzo.com/docs/analytics/repzoql/where) - [COMPARE TO](https://workstation.repzo.com/docs/analytics/repzoql/compare-to) --- # VISUALIZE > Pick the chart, the metric it draws, bar-and-line combos, and how many items it shows. `VISUALIZE` picks the chart and the metric it draws. Without it, the report picks a chart that fits the data: a single number, a line over time, or bars for groups. ```sql FROM deals SHOW won_value GROUP BY owner VISUALIZE won_value TYPE horizontal_bar MAX 10 ``` ## Syntax ```sql VISUALIZE [] [TYPE ][, TYPE ...] [MAX ] ``` - The metric must be one you `SHOW` (or its `AS` name). - `MAX` sets how many items the chart shows. - Give two metrics different types for a combo chart: ```sql VISUALIZE value TYPE bar, count TYPE line ``` When the two metrics of a combo chart have very different sizes, each gets its own panel on the same axis instead of a second scale. ## Chart types | Type | Best for | |---|---| | `metric`, `gauge` | One number | | `line`, `area` | Trends over time | | `bar`, `stacked_bar`, `grouped_bar`, `horizontal_bar`, `stacked_horizontal`, `grouped_horizontal` | Comparing groups | | `combo` | Bars for one metric and a line for another | | `breakdown_bar`, `donut`, `pie`, `treemap` | Share of a total | | `sunburst` | Two groupings as nested rings (the first inside, the second outside) | | `rfm_grid` | Contacts by RFM segment (see below) | | `funnel`, `waterfall` | Steps and how they add up | | `heatmap`, `calendar_heatmap` | Patterns across two groupings, or across days | | `scatter`, `bubble`, `radar` | Comparing several numbers per group | | `histogram` | How values are spread | | `table`, `list_by_metric`, `list_by_dimension` | Exact values | | `cohort_grid`, `retention_curve` | [Cohort reports](https://workstation.repzo.com/docs/analytics/repzoql/cohort) | In the report builder, the chart picker searches these types and recommends the ones that fit. For tables, **Show all rows** in the Visualization section switches between every row and only the first ones. ## RFM grid `rfm_grid` shows contacts by **RFM segment**, Shopify's customer segments. Every contact who bought (an issued invoice or an order that wasn't canceled) gets a score from 1 to 5 for how recently they bought, and one for how often and how much, compared with the workspace's other buyers. The pair places them in a segment: Champions, Loyal, Active, New, Promising, Needs attention, At risk, Previously loyal, Almost lost, or Dormant. Contacts without purchases are Prospects. ```sql FROM contacts SHOW count GROUP BY rfm_group VISUALIZE count TYPE rfm_grid ``` The grid puts recency across and frequency + spend up; each segment shows its value and its share of buyers. `rfm_group` also works in `WHERE`, for example `WHERE rfm_group IN ("At risk", "Previously loyal")`. ## Related pages - [Reports](https://workstation.repzo.com/docs/analytics/reports) - [COHORT](https://workstation.repzo.com/docs/analytics/repzoql/cohort) --- # Functions > sum, avg, min, and max of any number field, math between metrics, and date functions for periods. ## Aggregate functions `sum()`, `avg()`, `min()`, and `max()` work on any number or money field, including custom properties, on the object or a related one: ```sql FROM accounts SHOW avg(annual_revenue), sum(mrr), max(number_of_employees), sum(deals.amount) GROUP BY industry ``` | Function | Result | |---|---| | `sum(field)` | The total | | `avg(field)` | The average, over records that have a value | | `min(field)` | The smallest value | | `max(field)` | The largest value | Use them anywhere a metric fits: in math (`sum(amount) / count`), [HAVING](https://workstation.repzo.com/docs/analytics/repzoql/having), [ORDER BY](https://workstation.repzo.com/docs/analytics/repzoql/order-by-and-limit), and [VISUALIZE](https://workstation.repzo.com/docs/analytics/repzoql/visualize). Each one is also named after its function and field, so `ORDER BY avg_annual_revenue` works too. Money fields are converted to the report currency when the field has a base-currency amount or its own exchange rate (deal amounts, invoice and order totals, subscription MRR and similar). Prefer a catalog metric when one fits: `won_value` already knows which deals are won. ## Math Combine metrics with `+`, `-`, `*`, `/` and parentheses, and name the result with `AS`: ```sql SHOW won_value / won_count AS avg_won, won_count * 100 / count AS win_pct ``` See [FROM and SHOW](https://workstation.repzo.com/docs/analytics/repzoql/from-and-show#math). ## Date functions Date functions give the start or end of a period, offset from today: | Function | Example | Means | |---|---|---| | `startOfDay`, `endOfDay` | `startOfDay(-30d)` | Midnight, 30 days ago | | `startOfWeek`, `endOfWeek` | `startOfWeek(-1w)` | Monday of last week | | `startOfMonth`, `endOfMonth` | `endOfMonth(-1m)` | The last day of last month | | `startOfQuarter`, `endOfQuarter` | `startOfQuarter(0q)` | The first day of this quarter | | `startOfYear`, `endOfYear` | `startOfYear(0y)` | January 1st | The offset uses `d`, `w`, `m`, `q`, or `y`. Use them in [SINCE and UNTIL](https://workstation.repzo.com/docs/analytics/repzoql/since-until-during) and in date conditions: ```sql SINCE startOfMonth(-1m) UNTIL endOfMonth(-1m) -- last month WHERE close_date < startOfQuarter(0q) ``` ## Related pages - [FROM and SHOW](https://workstation.repzo.com/docs/analytics/repzoql/from-and-show) - [SINCE, UNTIL, DURING](https://workstation.repzo.com/docs/analytics/repzoql/since-until-during) --- # Objects > Every object you can report on with FROM, what it holds, its main metrics, and which objects can be combined. `FROM` takes one of these objects. Objects marked **Combinable** can be mixed in one report, for example `FROM contacts SHOW deals.count, orders.total`. The others are reported on their own. | Object | What it holds | Combinable | Main metrics | |---|---|---|---| | `deals` | Sales opportunities, their value and stages | Yes | `count`, `value`, `avg_value`, `min_value`, `max_value`, `won_count`, … | | `accounts` | Companies you sell to | Yes | `count`, `new`, `unique_industries`, `unique_countries`, `unique_owners` | | `contacts` | People, leads and where they came from | Yes | `count`, `new`, `active_leads`, `new_leads`, `contacted_leads`, `hot_leads`, … | | `activities` | Calls, meetings, tasks, emails and notes | Yes | `count`, `calls`, `meetings`, `tasks`, `emails`, `notes`, … | | `price_offers` | Quotes sent to customers | Yes | `count`, `value`, `avg_value`, `min_value`, `max_value`, `pending`, … | | `invoices` | Billing, payments and balances | Yes | `count`, `total`, `avg_value`, `min_value`, `max_value`, `collected`, … | | `tickets` | Support requests and their status | Yes | `count`, `open`, `resolved`, `closed`, `pending`, `unique_requesters`, … | | `projects` | Delivery projects and their progress | Yes | `count`, `not_started`, `in_progress`, `completed`, `on_hold`, `unique_owners`, … | | `milestones` | Project milestones | No | `count`, `in_progress`, `completed`, `pending_approval`, `avg_progress`, `unique_projects` | | `project_jobs` | Jobs inside projects | No | `count`, `pending`, `in_progress`, `completed`, `blocked`, `estimated_hours`, … | | `appointments` | Bookings, check-ins and durations | Yes | `count`, `booked`, `confirmed`, `completed`, `avg_duration`, `total_duration`, … | | `requests` | Internal requests and approvals | Yes | `count`, `submitted`, `approved`, `rejected`, `pending`, `completed`, … | | `orders` | Orders, sales, payments and fulfillment | Yes | `count`, `total`, `avg_value`, `subtotal`, `tax_total`, `shipping_total`, … | | `carts` | Carts and whether they became orders | Yes | `count`, `total`, `avg_value`, `converted_count`, `open_count`, `unique_customers` | | `line_items` | Products on orders, carts and subscriptions | No | `count`, `quantity`, `amount`, `avg_unit_price`, `discount`, `tax`, … | | `products` | Your catalog: prices, costs and categories | No | `count`, `active`, `avg_price`, `avg_cost`, `unique_suppliers` | | `product_variants` | Product variants and stock | No | `count`, `inventory`, `avg_price` | | `subscriptions` | Recurring billing, MRR and churn | Yes | `count`, `live`, `mrr`, `live_mrr`, `arr`, `avg_mrr`, … | | `listings` | Property listings, prices and sales | Yes | `count`, `total_value`, `avg_price`, `sold_count`, `sold_value`, `avg_sold_price`, … | | `campaigns` | Marketing campaigns, budget and spend | Yes | `count`, `active`, `completed`, `budget`, `spent`, `budget_used`, … | | `articles` | Content hub articles | No | `count`, `published`, `draft`, `avg_word_count`, `avg_reading_time` | | `forms` | Forms and their submissions | No | `count`, `published`, `submissions`, `avg_submissions` | | `suppliers` | Suppliers and payment terms | No | `count`, `active`, `on_hold`, `avg_payment_terms` | | `widget_events` | Website widget visits and clicks | No | `count`, `unique_visitors`, `unique_channels`, `opens`, `prompt_views`, `prompt_clicks`, … | | `inbox_conversations` | Customer conversations, response and resolution times | No | `count`, `open`, `pending`, `snoozed`, `resolved`, `closed`, … | | `inbox_messages` | Messages sent and received in the inbox | No | `count`, `inbound`, `outbound`, `agent_replies`, `bot_replies`, `notes`, … | | `agent_runs` | AI agent runs, tokens and cost | No | `count`, `completed`, `failed`, `handoffs`, `waiting_for_approval`, `cancelled`, … | | `goals` | Goal targets and progress | No | `current`, `target`, `attainment`, `targets_count`, `achieved_count` | Each object's fields come from [Properties](https://workstation.repzo.com/docs/administration/properties), including custom properties. In the query editor, the book icon lists every metric and field of the selected object; click a name to add it to the query. ## Access Every object's [data visibility](https://workstation.repzo.com/docs/administration/departments) applies, so you only count the records you're allowed to see. Reports on orders, carts, line items, products, product variants, suppliers, subscriptions, listings, campaigns, articles, forms, and goals also need that object's view permission and a plan that includes its module. A report that combines objects needs the view permission of each one. ## Related pages - [FROM and SHOW](https://workstation.repzo.com/docs/analytics/repzoql/from-and-show) - [Report queries](https://workstation.repzo.com/docs/analytics/report-queries#related-records) --- # Accounts > Manage companies, account hierarchies, contacts, and commercial relationships. Accounts represent companies, organizations, or other business entities. They provide a shared place for company data and connect contacts, deals, service work, and commercial records. ## Account data The standard Account properties cover: - Name, type, status, lifecycle stage, owner, industry, source, and description - Website, company domain, additional domains, email, phone, LinkedIn, and primary address - Billing address - Annual revenue, number of employees, and founded year - Parent account, last activity date, and system dates Administrators can add custom and computed fields in [Properties](https://workstation.repzo.com/docs/administration/properties), so a workspace may require or display additional information. ## Creating an account 1. Open **Accounts**. 2. Select **New Account**. 3. Enter the account name. 4. Add the owner, type, status, lifecycle stage, industry, and contact details you know. 5. Choose a parent account when this organization belongs to a larger company. 6. Save the account. Accounts can also be created through imports, supported integrations, and automatic account matching (below). When you type a domain that another account already uses, the form warns you and links to the existing account so you don't create a duplicate. ## Lifecycle stage **Lifecycle Stage** says where the company is in your journey with it. Every workspace starts with an **Account Pipeline** with these stages: | Stage | Meaning | |---|---| | Lead | You know about the company, nothing more yet | | Prospect | You are actively working on it | | Opportunity | There is a real chance to sell | | Customer | The company buys from you | | Former customer | The company used to buy from you | A new account starts in the first stage unless you pick another one. Accounts created by the ERPNext sync start in **Customer**, because ERPNext only sends paying customers. Rename, reorder, or add stages in [Pipelines](https://workstation.repzo.com/docs/sales/pipelines), the same way as for contacts and deals. The stage sits next to two other properties, each with its own job: - **Account Type** is the kind of company it is to you: customer, partner, vendor, competitor, or other. - **Account Status** is how healthy the relationship is right now: active, at risk, inactive, or churned. A new account has no status until there is a relationship to describe. - **Lifecycle Stage** is the step in your journey with the company. Partners, vendors, and competitors usually have no lifecycle stage, because they are not part of your sales journey. Moving an account to another stage is recorded in its history and sends the `account.stage_changed` [webhook](https://workstation.repzo.com/docs/administration/webhooks). ## Company domains and automatic matching **Company domain** is the account's main web domain, such as `acme.com`. Use **Additional domains** for other domains the same company uses, one per line. Domains are entered without `https://` or a path. Workstation uses these domains to match people to companies: - When someone creates a contact with a work email, the form suggests the account that owns that email domain. - When **Create and link accounts automatically** is on, saving a contact with a work email links it to the matching account, and creates the account if none exists yet. Free email providers such as Gmail and Outlook are ignored; the contact's website is used instead. Administrators manage this in **Settings → Objects → Accounts → Automation**. Use **Excluded domains** for your own domain, partners, or resellers whose staff should never be linked to an account. Turning the option on can also process existing contacts in the background. ## Account hierarchy Use **Parent Account** to model a company structure: ```text Acme Group ├── Acme Jordan └── Acme UAE ``` Keep separate accounts when branches have different contacts, deals, addresses, billing details, or service history. Use one account when the distinction is only a reporting label that can be handled by a property. ## Contacts and related records An account can have multiple [Contacts](https://workstation.repzo.com/docs/sales/contacts), and one contact can be marked as the account's primary contact. Contacts can also be associated with more than one account when needed. Account records can connect to Deals, Tickets, Appointments, Projects, Carts, Invoices, Subscriptions, Campaigns, Price Offers, Activities, Emails, and attachments. These associations make the account a useful company-level history without copying the same information into several records. ## Account list The Accounts page provides a paginated list with: - Built-in **All accounts**, **My accounts**, and **Unassigned** tabs - Quick filters for account owner, lifecycle stage, industry, and create date - A **Kanban** board, with one column per lifecycle stage - Search, sorting, configurable columns, saved views, and Excel export - Row selection for bulk assign, bulk edit, delete, and task creation On the board, drag a card to another column to change the account's stage. When the workspace has more than one account pipeline, pick the pipeline next to the search box. Use the board settings to group by another property, such as Account Type or Owner, or to choose which fields the cards show. Bulk actions run in the background, so you can keep working while a large selection is processed. The list refreshes when the job finishes. Selecting an account opens it in the shared record flyout, an overlay on top of the list. The URL keeps the open record, so you can share the link or use **Open full page**. Use [Table Views](https://workstation.repzo.com/docs/administration/table-views) to save list configurations for personal or shared use. ## Duplicates Select **Manage duplicates** on the Accounts page to find and merge duplicate companies. Workstation matches accounts by company domain, email, phone, and name, and you can add your own detection rules. See [Contacts → Duplicates](https://workstation.repzo.com/docs/sales/contacts#duplicates) for how review and merging work; the same page handles both contacts and accounts. ## Working from the account record The default record page has **About**, **Activities**, **Emails**, **Invoices**, **Comments**, and **Timeline** tabs, with account details in the left sidebar and related-record cards on the right. The **Activities** tab is a timeline of notes, calls, tasks, and meetings linked to the account. You can leave a note, log a call, create a task, or schedule a meeting from it. See [Activities on a record](https://workstation.repzo.com/docs/engagement/activities#activities-on-a-record). Administrators can change the card order, visible tabs, property placement, and association-card behavior in [Settings → Objects](https://workstation.repzo.com/docs/administration/objects). The actual record page may therefore differ from the system default. ## Visibility Accounts are globally visible within the organization to users with the appropriate Account permissions. They are not restricted by owner-based department visibility. Ownership still supports assignment, **My Accounts**, and reporting. ## Import and export Use **Settings → Import / Export** ([Data Import and Export](https://workstation.repzo.com/docs/administration/data-import-export)) to import CSV or Excel data, including custom properties. Choose Create Only, Upsert, or Replace based on how existing records should be handled. Review duplicates and parent-account references before importing a hierarchy. ## Related documentation - [Contacts](https://workstation.repzo.com/docs/sales/contacts) - [Deals](https://workstation.repzo.com/docs/sales/deals) - [Pipelines and Stages](https://workstation.repzo.com/docs/sales/pipelines) - [Price Offers](https://workstation.repzo.com/docs/sales/price-offers) - [Activities](https://workstation.repzo.com/docs/engagement/activities) - [Properties](https://workstation.repzo.com/docs/administration/properties) - [Objects](https://workstation.repzo.com/docs/administration/objects) - [Table Views](https://workstation.repzo.com/docs/administration/table-views) --- # Contacts > Manage people, prospect lifecycle data, relationships, and customer history. Contacts are people your organization sells to, supports, markets to, or works with. A contact can be an early prospect, a decision maker, a customer, or an end user. Workstation uses Contacts for the prospect lifecycle. There is no separate Leads module: a prospect is a contact, and you qualify it with properties such as Lead Status, owner, source, pipeline, stage, rating, and Lead Score. ## Contact data The standard Contact properties cover: - Identity: name, salutation, birth date, gender, and profile details - Work context: title, department, company, account, and reporting relationship - Communication: email, secondary email, phone, mobile, preferred method, language, and time zone - Address, including latitude and longitude, and social profiles - Consent and compliance: email opt-in, do-not-call, and tax-exempt status - Qualification: lead status, owner, source, channel, industry, pipeline, stage, rating, lead score, company size, revenue, budget, and expected close date - Marketing attribution: referral, UTM fields, click IDs, and originating ad - Description, staff alert, last activity date, and system dates Administrators can add custom and computed fields in [Properties](https://workstation.repzo.com/docs/administration/properties). Required fields and available fields may therefore differ by workspace. On the Contact properties screen, **Add computed properties** installs an **Insights** group of read-only rollups, such as total deal value, number of deals, number of appointments, upcoming appointments, and total spend. You can show them on the record, use them as list columns, and filter or segment by them. ## Creating a contact 1. Open **Contacts**. 2. Select **New Contact**. 3. Enter the first name and any known contact details. Last name is optional unless your workspace requires it. 4. Assign an owner, source, pipeline, and stage when relevant. 5. Associate the contact with an account or other records. 6. Save the contact. While you type, the form checks for existing records: - An email or secondary email that another contact already uses blocks the save and links to the existing contact. If you can't see that contact, ask an administrator for access. - A phone number that another contact already uses shows a warning, but you can still save, since phone numbers are sometimes shared. - A work email domain that matches an [Account](https://workstation.repzo.com/docs/sales/accounts#company-domains-and-automatic-matching) offers **Link to account**, and shows other contacts you can see at that domain. You can also create contacts through imports, forms, Inbox conversations (everyone who writes in gets a contact automatically, see [Inbox](https://workstation.repzo.com/docs/operations/inbox)), meeting-link bookings, connected apps, and other workflows. When Apollo is connected, **Find people** provides a prospecting entry point from the Contacts page. ## Lifecycle and qualification A contact can belong to a Contact pipeline and stage. This lets teams model steps such as New, Attempted, Connected, Qualified, or Disqualified without converting the person into a different record type. Contact qualification and Deal progression are separate: - The Contact pipeline describes the person's lifecycle or readiness. - The Deal pipeline describes a specific revenue opportunity. - One contact may be associated with multiple deals over time. See [Pipelines and Stages](https://workstation.repzo.com/docs/sales/pipelines) for stage configuration, transition rules, and stage-required fields. ## Accounts and relationships A contact can have a primary [Account](https://workstation.repzo.com/docs/sales/accounts) and additional account associations. One account-contact relationship can be marked primary for that account. Contacts can also be related to deals, tickets, appointments, carts, projects, invoices, activities, emails, and other records. Use associations to keep the customer history connected rather than duplicating the person. ## List and Kanban views The Contacts page supports List and Kanban views. - Built-in tabs include **All contacts**, **My contacts**, and **Unassigned**. - Quick filters include owner, lead status, stage, ad contact status, create date, and account. - Kanban can group by Stage, with a pipeline picker, or by other supported properties. - Selecting a row or card opens the contact in the shared record flyout. The URL keeps the open record, and **Open full page** goes to the full detail page. Use [Table Views](https://workstation.repzo.com/docs/administration/table-views) to save filters, columns, sorts, view mode, and Kanban grouping. ## Duplicates Open the **More actions** menu on the Contacts page and select **Manage duplicates**. The same page handles [Accounts](https://workstation.repzo.com/docs/sales/accounts) and [Deals](https://workstation.repzo.com/docs/sales/deals#duplicates). 1. Select **Scan for duplicates**. After the first scan, scans refresh daily. 2. Review suggestions on the **To review** tab. Each one shows why the records match, such as the same email, the same phone, the same company domain, or the same name and related details. 3. Open a suggestion, choose the primary record, and pick the value to keep for each property. Select **Merge and review next**, or **Not a duplicate** to dismiss it. Merging is permanent. Linked records move to the primary record, and marketing opt-outs are preserved. You can also merge several selected pairs or groups at once, keeping the oldest, newest, or most recently active record. Use **Detection rules** to match on your own properties, such as a national ID custom field. Dismissed suggestions appear under **Rejected** and can be restored for 14 days. **History** lists past merges and can be exported. Managing duplicates requires view and update-all permission for the object. Merging also requires delete-all permission. ## Working from the contact record The default record page has these tabs: **About**, **Activities**, **Emails**, **Conversations**, **Invoices**, **POS Sales**, **Memberships**, **Loyalty**, **Comments**, **Events**, **Calls**, and **Timeline**. Users with clinical-notes access also see **Clinical history**. The header has **Edit** and **Delete**, plus **Call** when calling is set up and the contact has a phone number, and **Send Email** when the contact has an email address. Quick actions log a call, create a task, or schedule a meeting. The **Activities** tab is a timeline of notes, calls, tasks, and meetings linked to the contact. See [Activities on a record](https://workstation.repzo.com/docs/engagement/activities#activities-on-a-record). The exact card and tab arrangement can differ because administrators can customize Contacts in [Settings → Objects](https://workstation.repzo.com/docs/administration/objects). Property cards support inline editing when the field and the user's permissions allow it. ## Staff alert Use the **Staff Alert** property for something every teammate should see before talking to this person, such as "Prefers Arabic" or "Allergic to latex". When it is set, an amber **Staff alert** banner appears at the top of the contact record and on the client's appointments. Clear the property to remove the banner. ## Bulk actions Select contacts on the list page to assign an owner, edit standard or custom properties, delete records, or create follow-up tasks. Bulk actions run in the background, and the list refreshes when they finish. Property validation and conditional requirements are checked during supported bulk updates as well as normal edits. ## Visibility Contact visibility follows the owner-based data-visibility scope set in [Departments](https://workstation.repzo.com/docs/administration/departments): - **All** shows every contact. - **Department** shows contacts owned by visible department members. - **Own** shows only the user's own contacts. - Unassigned contacts remain visible under the shared visibility rules. Permissions still control whether a user can create, edit, delete, or reassign contacts. ## Import and export Use **Settings → Import / Export** ([Data Import and Export](https://workstation.repzo.com/docs/administration/data-import-export)) to load Contact data from CSV or Excel. Map columns to native and custom properties, then choose Create Only, Upsert, or Replace. Stabilize property internal names, option values, and pipeline stages before a large import. See [CRM Setup](https://workstation.repzo.com/docs/sales/crm-setup) for the recommended order. ## Related documentation - [Accounts](https://workstation.repzo.com/docs/sales/accounts) - [Deals](https://workstation.repzo.com/docs/sales/deals) - [Price Offers](https://workstation.repzo.com/docs/sales/price-offers) - [Activities](https://workstation.repzo.com/docs/engagement/activities) - [Properties](https://workstation.repzo.com/docs/administration/properties) - [Objects](https://workstation.repzo.com/docs/administration/objects) --- # Deals > Track revenue opportunities through configurable pipelines and outcomes. Deals represent specific revenue opportunities. They connect a sales process to an amount, expected close date, owner, company, people, activities, quotes, invoices, and delivery work. Every deal belongs to a Deal pipeline and stage. ## Deal data The standard Deal properties include: - Name, priority, owner, pipeline, stage, and probability - Account, primary contact, decision maker, country, and lead source - Amount, currency, payment status, payment terms, and contract term - Deal type, forecast category, close date, next step, and competitor information - Won timestamp, lost reason, subscription start date, and won-deal administration details - Description and system dates Administrators can add custom and computed Deal fields in [Properties](https://workstation.repzo.com/docs/administration/properties). They can also require fields always, conditionally, or only when a deal enters a particular stage. ## Creating a deal 1. Open **Deals**. 2. Select **New Deal**. 3. Enter a deal name. 4. Choose the pipeline and stage. 5. Add an amount, currency, probability, and expected close date when known. 6. Associate the account and primary contact. 7. Assign an owner and save. If a pipeline exists, Workstation can use its first stage as the initial stage. A stage's default probability is applied when the deal does not provide a different probability. A Price Offer is not required before creating a deal. Create or associate a [Price Offer](https://workstation.repzo.com/docs/sales/price-offers) when the opportunity needs a formal quote. ## List and Kanban views The Deals page supports List and Kanban views. - Built-in tabs include **All deals**, **My deals**, and **Closing this month**. - Quick filters include owner, stage, account, close date, updated date, and created date. - Kanban groups by Stage by default and can use other supported properties. - Deal cards can display configurable properties, associations, activity context, and card actions. - Deals that have gone stale in their stage show a **Stale** badge on the row and card. - Selecting a row or card opens the deal in the shared record flyout. The URL keeps the open record, and **Open full page** goes to the full detail page. Use [Table Views](https://workstation.repzo.com/docs/administration/table-views) to save filters, columns, sorting, view mode, and Kanban grouping. ## Duplicates Select **Duplicates** on the Deals page to open **Manage duplicates** on its **Deals** tab. It works the same way as [contact duplicates](https://workstation.repzo.com/docs/sales/contacts#duplicates): scan, review each suggestion, pick the values to keep, and merge. - Deals match when they have the same name (ignoring capital letters and spacing) on the same account or the same contact. Add **Detection rules** to match on other properties. - Merging moves everything linked to the duplicate onto the deal you keep: contacts, activities, emails, quotes, invoices, subscriptions, conversations, comments, files, and tags. - A deal's pipeline and stage always come from the same deal, and so do its amount and currency. Picking one picks the other. - A merge can be undone through the API with `POST /api/v1/deals/merge/{mergeId}/undo`. ## Stale deals [Stage Health](https://workstation.repzo.com/docs/sales/pipelines#stage-health) watches open deals and flags the ones that sit too long in a stage, have no recent activity, or have no next task. A flagged deal gets the **Stale** badge, and the pipeline can notify the owner, create a follow-up task, or move the deal automatically. The flag clears when the deal moves to another stage, or at the next hourly check once the problem is fixed, for example after you log an activity or schedule a task. Stale deals also feed [Radar](https://workstation.repzo.com/docs/analytics/radar), and a deal's **Radar Findings** card lists the problems Radar found on it. ## Moving between stages Change a deal's stage from its record page, list controls, or Kanban board. Before a move completes, Workstation checks: - Whether the pipeline uses Free or Strict transitions - Whether the destination stage is allowed from the current stage - Whether standard and custom stage-required fields are filled - Whether property validation and conditional requirements pass See [Pipelines and Stages](https://workstation.repzo.com/docs/sales/pipelines) for configuration details. ## Won deals Moving a deal into the pipeline's Won stage opens a **Mark as Won** dialog. Winning a deal: - Sets the Won timestamp - Sets the close date to the win date when entering Won - Applies the stage's default probability when appropriate - Requests any custom properties configured for the won dialog - Records audit history and triggers the configured won and stage-change automation Won-deal information can include administration contacts, payment details, subscription dates, and documents. Which custom fields appear in the win dialog depends on the workspace configuration. ## Lost deals Moving a deal into the pipeline's Lost stage opens a **Mark as Lost** dialog that requires a Lost Reason. Workstation records the stage change and triggers the configured lost and stage-change automation. Use specific, consistent reasons so reports can distinguish pricing, timing, competition, qualification, and other causes. ## Relationships and record page A deal can have an account, a primary contact, a decision maker, and additional contact relationships. It can also connect to Price Offers, Tickets, Invoices, Subscriptions, Projects, Activities, Emails, Comments, Attachments, and other records. The default record page has **About**, **Comments**, **Activities**, **Emails**, **Invoices**, and **Timeline** tabs, with the stage and key details in the header and related-record cards on the side. - The **Activities** tab is a timeline of notes, calls, tasks, and meetings linked to the deal. See [Activities on a record](https://workstation.repzo.com/docs/engagement/activities#activities-on-a-record). - The **Invoices** tab lists linked invoices with their status, total, and amount due. **New Invoice** creates an invoice already linked to the deal. To split the amount into a down payment and installments, turn on **Payment plan** when creating the invoice. See [Invoices → Payment plans](https://workstation.repzo.com/docs/commerce/invoices#payment-plans). Administrators can change the layout in [Settings → Objects](https://workstation.repzo.com/docs/administration/objects), so visible tabs and card placement may vary by workspace. ## Bulk actions Select deals on the list page to assign an owner, edit standard or custom properties, delete records, or create follow-up tasks. Bulk actions run in the background, and the list refreshes when they finish. Bulk stage changes still need to satisfy the applicable property and stage rules. ## Visibility Deal visibility follows ownership and the workspace's configured data-visibility scope: - **All** shows all accessible deals. - **Department** includes deals owned by visible department members. - **Own** limits records to the current user's ownership scope. - Unassigned deals remain visible under the shared visibility rules. Permissions still control whether a user can create, edit, delete, or reassign deals. ## Reporting Deal properties, stage probability, dates, owners, and outcomes are available to [Reports](https://workstation.repzo.com/docs/analytics/reports). Common measures include pipeline value, weighted value, win rate, average size, stage conversion, and time to close. Keep stage and outcome data current; report accuracy depends on the record state. ## Related documentation - [Pipelines and Stages](https://workstation.repzo.com/docs/sales/pipelines) - [Activities](https://workstation.repzo.com/docs/engagement/activities) - [Invoices](https://workstation.repzo.com/docs/commerce/invoices) - [Contacts](https://workstation.repzo.com/docs/sales/contacts) - [Accounts](https://workstation.repzo.com/docs/sales/accounts) - [Price Offers](https://workstation.repzo.com/docs/sales/price-offers) - [Properties](https://workstation.repzo.com/docs/administration/properties) - [Objects](https://workstation.repzo.com/docs/administration/objects) --- # Listings > Track real-estate properties for sale or rent, with pricing, measurements, agents, sellers, buyers, and showings. Listings are properties your team is selling or renting, such as a villa, an apartment, an office, or a plot of land. A listing keeps the property's price, address, size, rooms, and marketing details in one record, and connects it to the seller, interested buyers, deals, and showings. Use Listings when your workspace works in real estate. Each listing belongs to a pipeline, so its stage tells you where the property is in the market, for example Active, Under Contract, or Sold. ## Turning Listings on Listings appears under **CRM** in the sidebar when your plan includes it and you have the `listings.view` permission. Administrators can hide or show it in **Settings → General → Feature Modules**. ## Listing data A listing can include: - **Listing information**: name, type, transaction, MLS number, pipeline, stage, agent, co-agent, and description - **Pricing**: price and currency, price frequency, original list price, sold price, HOA or service fee, annual property tax, and commission rate - **Location**: address, city, state or province, postal code, country, neighborhood, subdivision or compound, parcel number, and latitude and longitude - **Property details**: bedrooms, bathrooms, living area, lot size, year built, floors, parking and garage spaces, furnishing, condition, heating, cooling, view, and whether pets are allowed - **Parties**: seller contact, seller account, and buyer contact - **Lifecycle**: listed, available from, expires, and sold dates - **Marketing**: listing URL, virtual tour URL, video URL, public remarks, and showing instructions **Type** covers residential, land, and commercial properties, such as House, Apartments, Villa, Penthouse, Lots/Land, Office, Retail, and Warehouse. **Transaction** is For sale, For rent, For lease, or Auction. For rentals, set **Price frequency**, such as Per month, so the price shows as "1,200 per month". There is no separate status field. The pipeline stage is the listing's status. ## Creating a listing 1. Open **Listings**. 2. Select **New listing**. 3. Enter the listing name, for example "3-bed villa in Abdoun". 4. Choose the type and transaction, and enter the price. 5. Choose the agent, pipeline, and stage. 6. Select **Save listing**. The create form shows the essentials first. Open the listing and select **Edit** to fill in the full details, including the seller and buyer. If you leave them empty, the agent defaults to you, the listed date defaults to today, and the listing starts in the first stage of the workspace's listing pipeline. Administrators can change the fields on the create form in [Settings → Objects](https://workstation.repzo.com/docs/administration/objects). ## Areas and units Enter a size as a number and pick its unit: - **Living area**: square feet or square metres - **Lot size**: square feet, square metres, acres, or hectares Workstation stores every area in both square feet and square metres, and calculates price per square foot and price per square metre. You never convert by hand, and filters and sorting work in either unit. The workspace's measurement system decides which unit appears first and which unit new listings default to. Metric is the default. Lists and Kanban cards show the main unit, and you can add a column for the other one. The record's **Measurements** card shows both. Price per area is the price divided by the living area. For rentals, that means rent per square metre or square foot. ## Listing pipeline Every workspace starts with a **Listing Pipeline** with these stages: | Stage | Meaning | |---|---| | Coming Soon | Not yet on the market | | Active | On the market | | Under Contract | An offer was accepted | | Pending | Waiting to close | | Sold | Closed | | Withdrawn | Taken off the market | | Expired | The listing agreement ended | Change the stages, or add pipelines, in **Settings → Pipelines**. Listing stages have a name and color but no win probability. A listing can also have no stage. [Stage Health](https://workstation.repzo.com/docs/sales/pipelines#stage-health) works on listing pipelines. Use it to flag listings that sit too long in a stage or have no recent activity. Flagged listings show a **Stale** badge. ## List and Kanban views The Listings page supports List and Kanban views. - The **All listings** tab shows every listing you can see. Add standard views such as **For sale**, **For rent**, **Sold this year**, **Expiring soon** (expires in the next 30 days), and **Stale**. - Search matches the name, MLS number, address, city, neighborhood, postal code, and parcel number. - Default columns include type, transaction, price, living area, bedrooms, bathrooms, city, stage, and listed date. You can add price per area, lot size, MLS number, and the area in the other unit. - Kanban groups by stage by default. Drag a card to change its stage. Cards can show price, transaction, beds and baths, living area, address, and agent. - Selecting a row or card opens the listing in the shared record flyout. Use **Open full page** for the full record. Export the list to Excel from **More actions → Export to Excel**. Use [Table Views](https://workstation.repzo.com/docs/administration/table-views) to save filters, columns, and sorting. ## Working from the listing record The record header shows the name, address, transaction, and city, with **Open listing page** when a listing URL is set, **Edit**, and **Delete listing**. - The left sidebar shows price and key facts, pipeline and stage, address, property details, agents, dates, and tags. You can edit these properties in place. - The **Overview** tab shows the description, pricing, features, and marketing text. **Activities** and **Timeline** hold the listing's history. - The right side shows **Measurements**, **Seller**, **Deals**, **Interested Contacts**, **Accounts**, **Showings** (linked appointments), **Attachments**, and **Radar Findings**. Use **Interested Contacts** for buyers and enquirers, and **Deals** for the offers or transactions on the property. Deleting a listing archives it; its deals and activities are kept. Administrators can change the record layout in [Settings → Objects](https://workstation.repzo.com/docs/administration/objects). ## Permissions and visibility | Permission | Allows | |---|---| | `listings.view` | Open Listings | | `listings.create` | Create listings | | `listings.update` / `listings.update_own` | Edit any listing, or only your own | | `listings.delete` / `listings.delete_own` | Delete any listing, or only your own | By default, Users can view and create listings and edit or delete their own. Managers, Admins, and Owners have full access. Listing visibility follows the agent (the owner) and each member's data-visibility scope for Listings: **All**, **Department**, or **Own**. If no Listings scope is set, the member's general visibility applies. The co-agent can always see the listing. See [Departments](https://workstation.repzo.com/docs/administration/departments) for how data visibility is configured. ## Automation [Workflows](https://workstation.repzo.com/docs/administration/workflows) can start when a listing is created, updated, or changes stage. [Outbound webhooks](https://workstation.repzo.com/docs/administration/webhooks) also send `listing.created`, `listing.updated`, `listing.deleted`, and `listing.stage_changed` events. ## Related documentation - [Pipelines and Stages](https://workstation.repzo.com/docs/sales/pipelines) - [Deals](https://workstation.repzo.com/docs/sales/deals) - [Contacts](https://workstation.repzo.com/docs/sales/contacts) - [Appointments](https://workstation.repzo.com/docs/engagement/appointments) - [Objects](https://workstation.repzo.com/docs/administration/objects) - [Table Views](https://workstation.repzo.com/docs/administration/table-views) --- # Price Offers > Create quotes with line items, approvals, PDFs, sharing, signing, and invoice conversion. Price Offers are customer quotes. They combine products or custom line items with pricing, discounts, taxes, approval, a document template, sharing, and optional electronic signing. A Price Offer can be created before or during a Deal and associated with Contacts, Accounts, and Deals. It is not a prerequisite for creating a contact or deal. ## Offer data Each offer can include: - An automatic serial number, name, owner, status, and validity date - Currency, exchange rate, price list, subtotal, discount, tax, and total - Notes, terms, description, billing cycle, and template variables - A print template and generated PDF files - Contact, Account, Deal, and Invoice associations, plus an optional buyer contact - Signing status, signer details, consent, and a frozen signed document Administrators can add custom or computed fields in [Properties](https://workstation.repzo.com/docs/administration/properties) and place supported fields on the record page in [Objects](https://workstation.repzo.com/docs/administration/objects). ## Creating a Price Offer 1. Open **Price Offers** and select **New Price Offer**. 2. Enter a name and choose the customer associations. 3. Select the currency, price list, validity date, and quote template. 4. Add products, services, or custom line items. 5. Review quantities, unit prices, line discounts, tax, and totals. 6. Complete any required properties and save. When a matching approval workflow exists, Workstation creates an approval request and keeps the offer pending or processing. Without a matching workflow, a newly created offer can be approved automatically. ## Line items and totals Each line item can include a product, description, quantity, unit price, discount, tax rate, and calculated total. Offers support both line-level discounts and an overall percentage or fixed discount. When you pick a product, its catalog name fills **Name on quote**. You can change that name and the description for this offer only; the product in the catalog stays the same. Workstation calculates subtotal, discount amount, tax amount, and total. When multi-currency is used, base-currency totals support consistent reporting. ## Status and approval Offer statuses include: | Status | Meaning | |---|---| | Draft | Still being prepared | | Pending | Waiting to enter or continue approval | | Processing | Approval is in progress | | Approved | Approved for customer use | | Rejected | Rejected by the approval process | | Sent | Shared with the customer | | Accepted | Accepted by the customer | | Expired | Passed its validity date after being sent | The record's approval area shows the workflow steps and whether each step is pending, current, completed, or rejected. Authorized approvers can act from the offer record. ## Buyer contact The **Buyer contact** decides who appears as the buyer on the printed quote. Leave it blank to use the associated contact. Use it when the person signing is not the main contact, for example a purchasing manager at the same account. ## Templates and PDFs Each offer uses a **Quote template** from **Settings → Print Templates**. Choose the template on the offer record; the organization default is used when none is selected. Use **PDF/Print** to preview, download, or print the document. Generated PDFs appear on the Price Offer record. ### Editing one quote's document Sometimes a single quote needs different wording, such as an extra clause or a custom introduction. Select **Customize for this quote** under the template picker to change this quote's document without changing the template. Once the quote is customized, the button becomes **Edit document**. - The quote shows a **Customized** badge, and only this quote uses the new wording. - Styles, paper size, logo, and company details always come from the template. - Template blocks marked **Lock on documents** can't be changed and always show the template's current content. - The customization belongs to the template it was made with. Switching to another template hides it; switching back restores it. - A signed quote can't be edited. Saving or resetting a customized document requires the `price_offers.edit_document` permission. Users without it can open the editor read-only. ## Sharing and signing Select **Send quote** to email the quote from a connected mailbox. Choose the recipient, template, and message, and optionally add a bill-to contact or account and a PO number. Workstation adds a **Review and e-sign quote** button below your message. You can also use **Copy link** to share the quote page yourself. Signing has separate states: Not applicable, Awaiting signature, Signed, and Declined to sign. The record's audit trail shows when the quote was sent, viewed, signed, or declined. After signing, the signed PDF is frozen with its integrity information. Editing or resending behavior may be restricted so the accepted document remains unchanged. ## Converting an approved offer to an invoice An approved Price Offer can be converted to an [Invoice](https://workstation.repzo.com/docs/commerce/invoices) with **Convert to Invoice**. Choose the issue date, due date, and optional notes. Workstation copies the offer's commercial data and associations and prevents a second invoice from being created from the same offer. If an invoice already exists, use **View Invoice** from the Price Offer record. ## List page and bulk actions The Price Offers list includes **All offers**, **My offers**, and **Pending** tabs. Quick filters include owner, status, valid-until date, and create date. Select rows to assign an owner, edit supported fields, delete records, or create follow-up tasks. Bulk actions run in the background, and the list refreshes when they finish. Selecting a row opens the offer in the shared record flyout. Use [Table Views](https://workstation.repzo.com/docs/administration/table-views) to save filters, columns, and sorting. ## Visibility Price Offer visibility follows the configured owner-based data-visibility scope. Approval participants and users with broader permissions may also have access needed to review an offer. ## Related documentation - [Contacts](https://workstation.repzo.com/docs/sales/contacts) - [Accounts](https://workstation.repzo.com/docs/sales/accounts) - [Deals](https://workstation.repzo.com/docs/sales/deals) - [Invoices](https://workstation.repzo.com/docs/commerce/invoices) - [Approvals](https://workstation.repzo.com/docs/operations/approvals) - [Properties](https://workstation.repzo.com/docs/administration/properties) - [Objects](https://workstation.repzo.com/docs/administration/objects) --- # Meeting Links > Share a booking page so customers can book meetings with you or your team, synced to the CRM and your calendar. Meeting Links give customers a public page where they pick a time and book a meeting with you or your team. Each booking checks your availability and calendar, creates a Meeting [activity](https://workstation.repzo.com/docs/engagement/activities) on the customer's contact, adds the event to your calendar, and emails a confirmation. Use Meeting Links for sales calls, demos, and consultations. For client services with staff, resources, and checkout, use [Online Booking](https://workstation.repzo.com/docs/engagement/online-booking) for Appointments instead. Open **Meeting Links** from the **CRM** section of the sidebar. The page has four tabs: | Tab | Use it for | |---|---| | **Links** | Create, copy, edit, and delete meeting links | | **Calendar** | See booked meetings and calendar events for each host | | **Teams** | Group members for round robin and collective links | | **Settings** | Set your availability and connect calendars | ## Before you start Each host must set up availability once. A member who has not saved their availability can't be booked. 1. Open **Meeting Links → Settings**. 2. Under **Calendar connections**, select **Manage connections** to connect Google Calendar or Outlook in **Settings → Your Account → Email & Calendar**. 3. Choose the calendars to check for conflicts. Google lets you pick several calendars; Outlook uses the primary calendar. 4. Under **Add booked meetings to**, choose Google Calendar, Outlook Calendar, or Email invitation only. 5. Set your **Weekly availability**: one or more time ranges per day, in your time zone. Days with no hours are unavailable. 6. Add any **Days off**. 7. Select **Save availability**. Selected calendars are checked before times are offered and again when someone books. If a calendar connection fails, that host is shown as unavailable rather than risking a double booking. ## Creating a meeting link 1. Open the **Links** tab and select **Create meeting link**. 2. On **Details**, enter the meeting name and description, and choose the meeting type, duration, and locations. 3. On **Booking rules**, adjust buffers, notice, and limits. 4. On **Questions**, choose the form fields and any extra questions. 5. Select **Save meeting link**, or **Save inactive** to finish it later. A live preview of the booking page appears next to the editor. Previewing never creates a booking. ### Meeting types | Type | Who attends | |---|---| | **One-on-one** | One host, usually you | | **Round robin** | One available member of a scheduling team | | **Collective** | Every member of a scheduling team; a time is offered only when everyone is free | Round robin first tries the contact's existing owner when that person is free and **Prefer the contact's existing owner when available** is on. Otherwise it picks the available member with the fewest bookings relative to their weight. For collective links, choose a **Meeting organizer** whose calendar sends the invitation. ### Durations and locations Set a **Default duration**. Turn on **Let guests choose a duration** to offer up to six options. Add up to five locations. When there are several, the guest picks one: - **Google Meet** or **Microsoft Teams**: the video link is created automatically once the host's calendar is connected. - **In person**: an address. - **Custom video link**: an HTTPS URL. - **Phone call**: a phone number with country code. For in-person, custom, and phone locations, you can hide the details on the booking page. They are still sent in the confirmation. ### Booking rules | Setting | Default | What it does | |---|---|---| | Buffer before / after | 0 / 10 minutes | Free time kept around each meeting | | Minimum notice | 120 minutes | How soon a guest can book | | Booking window | 60 days | How far ahead a guest can book | | Start time interval | 30 minutes | Spacing between offered start times | | Daily limit | Unlimited | Maximum bookings per day | | Reminder before | 24 hours | When the guest gets a reminder email; 0 turns it off | | Change cutoff | 60 minutes | How close to the start a guest can still reschedule or cancel online | ### Questions The booking form always asks for first name and email, and includes last name and phone by default. You can add contact properties to the form and reorder the fields; answers are saved to the contact. You can also add up to ten free-text questions that are saved only on the meeting activity. ### Sharing the link Select **Copy link** on a row to share it. The address is built from your workspace, the host or team, and the link name, for example: ```text /meet/acme/sara/discovery-call ``` Set a custom **Link address** in the Sharing section if you prefer. Old addresses keep working after a rename. Mark one link as the **Default meeting link** for a host or team so the short address, such as `/meet/acme/sara`, opens it. Your first link becomes the default automatically. ## What the guest sees The guest opens the link, picks a duration and location if offered, and chooses a day and time in their own time zone. They fill in the form and select **Confirm meeting**. The confirmation page and email include the date, time, and join link, plus a **Manage booking** link. Until the change cutoff, the guest can reschedule (with the same host) or cancel. After the cutoff, the booking can no longer be changed online. ## What happens when someone books - **Contact**: Workstation matches the guest to a contact by email or phone. If there is no match, it creates a contact owned by the host. An existing contact only gets empty fields filled in; existing values are never overwritten. If the details match more than one contact, the booking is refused and the contacts are flagged for review in [Manage duplicates](https://workstation.repzo.com/docs/sales/contacts#duplicates). - **Activity**: a Meeting activity is created, owned by the host and linked to the contact and the contact's account. The description includes the guest's answers. - **Calendar**: an event is added to the host's chosen calendar with the guest as an attendee. - **Emails**: the guest and the hosts get a confirmation, and later any reschedule or cancellation. The guest gets the reminder. Manage the time, host, and cancellation from Meeting Links rather than from the activity. The activity still accepts notes and an outcome. ## Calendar tab The **Calendar** tab shows booked meetings next to hosts' Google Calendar events. Filter by team or member, and switch between Day, 3 days, Week, and Month. Select a meeting to join it, open the CRM activity, or reschedule or cancel it. If calendar sync failed, select **Retry calendar sync**. If the meeting was changed in both Google Calendar and Workstation, choose **Use Google changes** or **Keep Repzo changes**. Changes made in Google Calendar to a booked meeting's time, title, video link, or cancellation sync back to Workstation, usually within a minute. ## Teams Round robin and collective links need a scheduling team. On the **Teams** tab, select **Create team**, name it, and choose its members. Give each member a weight from 1 to 100: a member with weight 2 gets twice as many round robin meetings as a member with weight 1. ## Permissions | Permission | Allows | |---|---| | `meeting_links.view` | Open Meeting Links | | `meeting_links.create` | Create links | | `meeting_links.update` | Edit your own links and availability | | `meeting_links.delete` | Delete your own links | | `meeting_links.manage` | Edit or delete other members' links, and create links for them | | `meeting_links.view_bookings` | See the Calendar tab | | `meeting_links.manage_bookings` | Retry and resolve calendar sync | | `meeting_links.manage_teams` | Manage teams and create round robin or collective links | | `meeting_links.manage_availability` | Edit other members' availability and calendars | By default, Users can create one-on-one links for themselves and see their bookings. Managers, Admins, and Owners have every permission. Which members' links and bookings you see follows the Meeting Links data-visibility scope, which matches Activities unless set separately. ## Related documentation - [Activities](https://workstation.repzo.com/docs/engagement/activities) - [Activity Calendar](https://workstation.repzo.com/docs/engagement/calendar) - [Contacts](https://workstation.repzo.com/docs/sales/contacts) - [Online Booking](https://workstation.repzo.com/docs/engagement/online-booking) - [Team](https://workstation.repzo.com/docs/administration/team) --- # Activities > Manage calls, meetings, tasks, reminders, and related CRM work from one workspace. Activities is the shared workspace for scheduled work and customer follow-up. From one page, you can log calls, schedule or record meetings, create tasks, set reminders, and connect the work to other records. Every Contact, Account, and Deal also has an **Activities** tab that shows the same work as a timeline, with notes. The **New Activity** menu currently creates three activity types: | Type | Use it for | |---|---| | Task | A follow-up or action item with an optional due date and time | | Call | A scheduled or completed call with a start time and duration | | Meeting | An in-person or virtual meeting with participants and optional calendar sync | Notes are created from a record's **Activities** tab instead. Email and messaging history can also appear on record timelines, but they are not choices in the **New Activity** menu. ## The Activities workspace Open **Activities** from the CRM section of the sidebar. The page includes: - Standard tabs for **All**, **Due today**, **Overdue**, and **Upcoming** - Quick filters for assignee, creator, type, status, due date, updated date, and created date - Search, sorting, configurable columns, saved views, and personal standard-tab overrides - List, Kanban, and Calendar views - A Reminders panel for upcoming and sent reminders The initial list focuses on pending activities assigned to you. Change or save the filters when you need a team-wide or historical view. See [Table Views](https://workstation.repzo.com/docs/administration/table-views) for shared views, personal tabs, filters, and column settings. ## Creating an activity Select **New Activity**, then choose an action: - **Log Call** opens the activity editor as a Call. - **Schedule Meeting** opens the meeting scheduler for a future meeting. - **Log Past Meeting** records a meeting that already happened. - **Create Task** opens the activity editor as a Task. Every activity has a subject, type, status, priority, and owner. It can also have a rich-text description and associations to supported CRM records. ### Tasks A task can have a due date and time. The due date is optional, but it is required for overdue tracking and task reminders. See [Tasks](https://workstation.repzo.com/docs/engagement/tasks) for the task-focused workflow. ### Calls A call requires a start date and can include a start time, duration, participants, and reminders. Call records can also store an outcome such as Connected, Busy, No answer, or Left voicemail. ### Meetings A meeting requires a start date and supports: - A start time and duration - In-person or virtual meeting type - Google Meet, Microsoft Teams, or a custom meeting link - Contact participants and invitation details - Google Calendar or Outlook calendar sync - Up to four reminders - Meeting outcomes such as Scheduled, Completed, Rescheduled, No show, or Canceled Use the dedicated meeting scheduler when you want to schedule or log a meeting with the guided meeting flow. ### Meetings from other sources Some Meeting activities are created for you: - **Meeting Links bookings.** When a customer books through a [Meeting Link](https://workstation.repzo.com/docs/sales/meeting-links), Workstation creates a Meeting activity linked to the contact. Change the time, cancel, or delete these meetings from **Meeting Links → Calendar**, not from the activity. Notes and outcomes stay editable on the activity. - **Read.ai.** When the Read.ai app is connected from the [Marketplace](https://workstation.repzo.com/docs/configuration/marketplace), recorded meetings are imported as completed Meeting activities on matching contacts. The activity shows Read.ai's summary, action items, notes, topics, key questions, and transcript, with **Open report** linking to the original. Action items can become tasks. ## Activities on a record Contacts, Accounts, Deals, and other supported records have an **Activities** tab. It is a timeline of everything logged against the record, grouped by month with the newest first. - Use the sub-tabs **All activities**, **Notes**, **Calls**, **Tasks**, and **Meetings** to focus on one type, and the search box to find an entry. - On **All activities**, select **Log Activity** to choose **Create a note**, **Log a call**, **Create a task**, **Log a meeting**, or **Schedule a meeting**. Each filtered sub-tab shows only its own buttons. - Expand an entry to read the full description, or use **Expand all** and **Collapse all**. - Mark tasks complete, edit, or delete entries directly from the timeline. A **note** is a rich-text entry for something worth remembering, such as the outcome of a hallway conversation. A note has no separate subject; Workstation uses the start of the note text. Anything you create from the tab is linked to that record, so it shows up in the record's history. ## Associations and timelines An activity can be associated with more than one supported record, including Contacts, Accounts, Deals, Tickets, Projects, Invoices, Orders, Price Offers, and Campaigns. When you create an activity from a record page, Workstation can prefill that association. The activity then appears in the related record's activity history without duplicating the activity. The full activity record includes: - **About** for activity details, participants, reminders, attachments, and other information - **Comments** for internal discussion - **Timeline** for changes and audit history - Association cards for linked records List rows open the activity in the shared record flyout. Use **Open full page** when you need the complete record page. ## List view The List view supports server-side pagination, search, filters, sorting, and configurable columns. Use the completion control at the start of a row to mark an activity complete or reopen it. When rows are selected, bulk actions can: - Assign activities - Edit supported fields - Delete activities - Create follow-up tasks ## Kanban view The Kanban view can group activities by Status or another supported select property. Dragging a card updates the grouping value when that property is editable. For the Status grouping, the standard columns are Pending, Completed, and Cancelled. Cards support inline subject editing, configurable card fields, and quick actions. ## Calendar view The Calendar view places any Task, Call, or Meeting with a due date or start time onto a day, week, or month view. It is not limited to meetings. See [Activity Calendar](https://workstation.repzo.com/docs/engagement/calendar) for view behavior and external calendar sync. ## Reminders and automatic alerts You can add up to four reminders to a supported activity. Meeting reminders are relative to the meeting start; task and call reminders use a due date or a specific reminder date and time. Reminders are separate from the automatic **Activity Due Soon** and **Activity Overdue** notifications. See [Activity Reminders](https://workstation.repzo.com/docs/engagement/reminders) for the difference. ## Properties and record layout Administrators can manage native, custom, and computed Activity fields in [Properties](https://workstation.repzo.com/docs/administration/properties). Activity record cards and tabs can be arranged in [Objects](https://workstation.repzo.com/docs/administration/objects). Changing a property definition affects forms, filters, automation, reporting, and other surfaces that use the property. Hiding a property from a record card does not delete it. ## Calendar connections Connect Google Calendar or Outlook from **Settings → Your Account → Email & Calendar** before selecting those providers on a meeting. Workstation creates, updates, or removes the linked external event when the meeting changes. If the provider connection has expired or sync fails, the activity is still saved and Workstation shows a sync warning. ## Visibility and permissions Activity access follows the Activities data-visibility scope: - **All** can access organization activities. - **Department** can access activities owned by visible department members. - **Own** is limited to the user's activities. - Unassigned activities are included where the configured visibility permits them. Create, update, and delete actions also require the corresponding Activity permissions. ## Related documentation - [Tasks](https://workstation.repzo.com/docs/engagement/tasks) - [Activity Calendar](https://workstation.repzo.com/docs/engagement/calendar) - [Activity Reminders](https://workstation.repzo.com/docs/engagement/reminders) - [Meeting Links](https://workstation.repzo.com/docs/sales/meeting-links) - [Appointments](https://workstation.repzo.com/docs/engagement/appointments) - [Table Views](https://workstation.repzo.com/docs/administration/table-views) - [Notifications](https://workstation.repzo.com/docs/administration/notifications) --- # CRM Setup > Configure CRM data, record pages, pipelines, and team views in the right order. Workstation separates the definition of CRM data from the way that data is displayed. This makes it possible to add a field once, reuse it across forms and automation, and then choose where it appears on a record page. ## The CRM configuration model | Area | What it controls | Where to configure it | |---|---|---| | [Properties](https://workstation.repzo.com/docs/administration/properties) | Native fields, custom fields, computed values, validation, conditional logic, and groups | **Settings → Properties** | | [Objects](https://workstation.repzo.com/docs/administration/objects) | The cards, tabs, associations, and property placement on record pages | **Settings → Objects** | | [Pipelines](https://workstation.repzo.com/docs/sales/pipelines) | Ordered stages, stage colors, probabilities or open/closed categories, transitions, stage requirements, and Stage Health | **Settings → Pipelines** | | [Table Views](https://workstation.repzo.com/docs/administration/table-views) | List columns, filters, sorting, saved tabs, and Kanban grouping | A module's list page and **Manage views** | These areas work together but do not replace one another. For example, creating a Deal property makes the field available to the CRM. Adding it to a Deal property card in Objects decides where users see it. Adding it as a stage requirement decides when it must be filled. ## Recommended setup order 1. Review the standard fields for Contacts, Accounts, Deals, and Price Offers in [Properties](https://workstation.repzo.com/docs/administration/properties). 2. Create the custom properties and groups your process needs. 3. Add validation and conditional logic while the data model is still simple. 4. Configure contact and deal [pipelines](https://workstation.repzo.com/docs/sales/pipelines), including stage order and rules. 5. Arrange the record experience in [Objects](https://workstation.repzo.com/docs/administration/objects), and decide whether contacts should be [linked to accounts automatically](https://workstation.repzo.com/docs/sales/accounts#company-domains-and-automatic-matching). 6. Create shared and personal [Table Views](https://workstation.repzo.com/docs/administration/table-views) for daily work. 7. Import existing data after property internal names, types, and pipeline stages are stable. 8. Run a [duplicate scan](https://workstation.repzo.com/docs/sales/contacts#duplicates) after large imports. ## Core CRM records ### Contacts [Contacts](https://workstation.repzo.com/docs/sales/contacts) are people and also carry the prospect lifecycle. Use Lead Status, owner, source, pipeline, stage, rating, and Lead Score to qualify a person before or alongside creating a deal. There is no separate Leads module or lead-conversion step. ### Accounts [Accounts](https://workstation.repzo.com/docs/sales/accounts) represent companies or organizations. A contact can have a primary account and can also be associated with additional accounts. Accounts can be related to contacts, deals, tickets, appointments, projects, invoices, campaigns, price offers, and other records. ### Deals [Deals](https://workstation.repzo.com/docs/sales/deals) represent active revenue opportunities. Every deal has a deal pipeline and stage. Deal stages can carry a probability and may be marked as the pipeline's Won or Lost stage. ### Price Offers [Price Offers](https://workstation.repzo.com/docs/sales/price-offers) are quotes with line items, pricing, approvals, PDF output, sharing, and signing. They can be associated with contacts, accounts, and deals. A price offer is useful before or during a deal, but it is not required to create a contact or deal. ### Listings [Listings](https://workstation.repzo.com/docs/sales/listings) are properties for sale or rent, for real-estate teams. They have their own pipeline and link to sellers, buyers, deals, and showings. ### Activities and Meeting Links [Activities](https://workstation.repzo.com/docs/engagement/activities) hold the calls, meetings, tasks, and notes around every record. [Meeting Links](https://workstation.repzo.com/docs/sales/meeting-links) let customers book a meeting with a person or a team, and each booking becomes a Meeting activity. ## Organization-wide and personal settings Some CRM configuration affects everyone, while other settings are personal: | Configuration | Scope | |---|---| | Properties, groups, rules, and conditional logic | Organization-wide | | Pipelines, stages, and pipeline rules | Organization-wide | | Default record layout in Objects | Organization-wide | | Personal left/right record-card order, when allowed | Per user | | Saved private table views and standard-tab overrides | Per user | | Shared table views | Organization-wide visibility | Before saving a default object layout or changing a pipeline, review the change with the people who use that record type. Existing records use the updated configuration immediately. ## Related administration - Use [Team](https://workstation.repzo.com/docs/administration/team) and [Departments](https://workstation.repzo.com/docs/administration/departments) for permissions and data visibility. - Use [Data Validation](https://workstation.repzo.com/docs/administration/validations) to decide between property rules, conditional logic, and stage requirements. - Use [Settings](https://workstation.repzo.com/docs/administration/settings) for imports, feature modules, integrations, currencies, products, and other workspace configuration. --- # Pipelines and Stages > Configure record pipelines, stages, transition rules, and stage requirements. Pipelines organize records into ordered stages. They can model a contact lifecycle, an account lifecycle, a deal process, ticket resolution, project delivery, order fulfillment, or a property listing's market status. Open **Settings → Pipelines** to create a pipeline or select an existing one. ## Supported record types | Pipeline type | Typical use | Stage configuration | |---|---|---| | Contacts | Qualification and prospect lifecycle | Name, order, and color | | Accounts | Company lifecycle, such as Lead, Customer, or Former customer | Name, order, color, and Open/Closed category | | Deals | Sales opportunities | Name, order, color, probability, and Won/Lost outcome | | Tickets | Service workflow | Name, order, color, probability, and Open/Closed category | | Projects | Delivery workflow | Name, order, color, probability, and Open/Closed category | | Orders | Fulfillment workflow | Name, order, color, and Open/Closed category | | Listings | Property market status, such as Active, Under Contract, or Sold | Name, order, and color | Each record belongs to at most one pipeline of its type and one stage in that pipeline. Deals require both a pipeline and a stage. Other supported record types may be left without a pipeline or stage where their module allows it. ## Creating a pipeline 1. Go to **Settings → Pipelines**. 2. Enter a pipeline name. 3. Choose Deals, Contacts, Accounts, Tickets, Projects, Orders, or Listings. 4. Select the add button. 5. Open the new pipeline and add its stages. Every workspace starts with a **Listing Pipeline** for [Listings](https://workstation.repzo.com/docs/sales/listings): Coming Soon, Active, Under Contract, Pending, Sold, Withdrawn, and Expired. Create separate pipelines when the stages or movement rules genuinely differ, such as direct sales versus partner sales. Use saved views when only the audience or filters differ. ## Configuring stages Open a pipeline and use the **Configure** tab. ### Add and edit stages Every stage has a name and a position. Depending on the pipeline type, it can also have: - A display color - A default probability - A Won or Lost outcome - An Open or Closed status category Drag stages to reorder them. Name and outcome changes save from the stage editor. Color and probability changes are collected until you select **Save** at the bottom of the stage card. ### Deal outcomes A deal pipeline can have one Won stage and one Lost stage. Marking another stage as Won or Lost replaces the previous stage with that outcome. Moving a deal into an outcome stage triggers the corresponding won or lost behavior. Keep ordinary sales steps as neutral stages and reserve outcome flags for the final result. ### Probability Probability is available on Deals, Tickets, and Projects. For Deals, it supports weighted pipeline reporting: ```text Weighted value = Deal amount × Stage probability ``` For example, a 10,000 deal in a 60% stage contributes 6,000 to a weighted forecast. ### Open and closed categories Account, Ticket, Project, and Order stages use an Open or Closed status category. This lets each module distinguish active work from completed work even when organizations use different stage names. ## Pipeline rules Open a pipeline and select **Pipeline Rules**. ### Transition mode **Free Mode** lets records move to any other stage. **Strict Mode** allows only transitions enabled in the matrix. Each row is the current stage and each column is a destination stage. Select a cell to allow or block that move. **Enable All** allows every cross-stage move; **Restrict All** clears the matrix. Use Strict Mode only when skipping or reversing steps should be prevented. Otherwise, Free Mode is easier to maintain. ### Conditional stage properties For Contact and Deal pipelines, a stage can require standard or custom fields before a record enters it. 1. Open **Pipeline Rules**. 2. Choose a stage under **Conditional Stage Properties**. 3. Select the standard and custom fields required for that stage. 4. Move a test record into the stage and confirm the expected validation. Stage requirements are different from always-required properties. Use [Properties](https://workstation.repzo.com/docs/administration/properties) when a field must be present on every create or update, and use stage requirements when it becomes necessary only at a particular process step. ## Stage Health Stage Health flags records that stall in a stage, then runs follow-up actions. It is available for Deal, Ticket, Project, Order, and Listing pipelines. It is not available for Contact pipelines. Open a pipeline, select **Pipeline Rules**, and find the **Stage Health** card. 1. Choose **Pipeline default** to set the rule for every stage, or pick a stage to override the default for that stage only. 2. Turn on **Enable stale detection**. 3. Set **Mark record as stale after** a number of days. 4. Under **Based on**, choose one or more criteria and whether to match **any criterion** or **all criteria**: - **Time in stage**: the record entered the stage more than that many days ago. - **No activity**: no activity was logged in that many days. - **No next task**: the record has no open task and has been in the stage at least that many days. 5. Add **Actions** to run, in order, when a record goes stale: - **Notify owner** sends a "Pipeline Record Went Stale" notification. - **Create follow-up task** creates a task on the record for its owner. - **Move to stage** moves the record to another stage. - **Move to terminal stage** closes the record, such as moving a deal to Lost with an optional lost reason. 6. Select **Save**. Workstation checks open records every hour. Records in Won, Lost, or closed stages are skipped. When a record goes stale it gets a **Stale** badge on lists and Kanban cards, and the actions run once. The badge clears when the record moves to another stage or no longer meets the criteria. Stale records also appear as findings in [Radar](https://workstation.repzo.com/docs/analytics/radar). Start with **Notify owner** only. Add automatic stage moves after the team agrees the thresholds are right. ## Using pipelines on record lists [Contacts](https://workstation.repzo.com/docs/sales/contacts) and [Deals](https://workstation.repzo.com/docs/sales/deals) support list and Kanban views. In Kanban: - Choose the relevant pipeline when grouping by Stage. - Drag a card to move it when the configured transition allows the move. - Fill any required stage properties before the move completes. - Use other supported properties as the Kanban grouping when available. Saved table views can remember the view mode, filters, columns, and Kanban grouping. They do not change pipeline definitions. ## Deleting a stage When a stage contains records, Workstation asks what to do with them: - Deals must be moved to another stage. - Contacts, Tickets, Projects, Orders, and Listings may be moved to another stage or set to no stage. Review automations, reports, and conditional logic that reference the stage before deleting it. The Properties screen's Stage options and pipeline metadata update with the active configuration. ## Deleting a pipeline When a pipeline contains records, Workstation asks for reassignment: - Deals must move to another Deal pipeline that already has at least one stage. - Contacts, Tickets, Projects, Orders, and Listings may move to another same-type pipeline or be set to no pipeline. - A Deal pipeline cannot be deleted if it contains deals and no valid destination pipeline exists. Records moved to another pipeline are assigned to that pipeline's first stage. Confirm the destination stage and its requirements before deleting the source pipeline. ## Recommended practices - Use stage names that describe an observable state, not an activity someone intends to do. - Keep the number of stages small enough that users can choose the correct one quickly. - Set stage probabilities to match historical conversion where possible. - Add required fields gradually so pipeline movement does not become unnecessarily difficult. - Review workflows, reports, [Properties conditional logic](https://workstation.repzo.com/docs/administration/properties#conditional-logic), and saved views before renaming or deleting stages. - Test Strict Mode from both list and Kanban views before rolling it out. ## Related documentation - [CRM Setup](https://workstation.repzo.com/docs/sales/crm-setup) - [Contacts](https://workstation.repzo.com/docs/sales/contacts) - [Deals](https://workstation.repzo.com/docs/sales/deals) - [Listings](https://workstation.repzo.com/docs/sales/listings) - [Radar](https://workstation.repzo.com/docs/analytics/radar) - [Properties](https://workstation.repzo.com/docs/administration/properties) - [Data Validation](https://workstation.repzo.com/docs/administration/validations) - [Table Views](https://workstation.repzo.com/docs/administration/table-views) --- # Properties > Manage native, custom, and computed fields for Workstation records. Properties define the information stored on a record. Workstation presents native fields and custom fields in one place so administrators can manage labels, groups, validation, conditional behavior, formulas, usage, and data quality consistently. Open **Settings → Sales & CRM → Properties**, then choose an object from **Select an object**. ## Supported objects The Properties screen currently includes: - Contacts, Accounts, Suppliers, Deals, Tickets, Projects, Activities, Appointments, Session Notes, Requests, Price Offers, and Invoices - Campaigns, Articles, Products, Product Variants, Carts, Orders, and Line Items - Ad Campaigns, Ad Sets, Ads, and Inbox Conversations The available fields and options change with the selected object. Listings and Subscriptions are not in the object picker yet. ## Property types ### System properties System properties are native Workstation fields such as **Deal name**, **Pipeline**, **Stage**, or **Contact email**. Their values stay in the record's main data model. You can change a system property's display label, description, group, required setting, and supported validation rules for the workspace. Its internal name and field type remain locked because application features depend on them. ### Custom properties Custom properties store organization-specific data. When creating one, set: - Property label and optional description - Object type and property group - Internal name used by APIs, reports, filters, and automation - Field type, options, default value, and validation rules The internal name is generated from the label and can be adjusted before creation. It cannot be changed afterward. Pick a stable name that describes the data rather than a temporary business process. Available custom field types are single-line text, multi-line text, phone number, country, auto-number, single checkbox, multiple checkboxes, date picker, dropdown select, number, currency, file, Repzo user, URL, and email. **Auto-number** gives each new record the next number in a sequence and is always filled in. ### Computed properties Computed properties are read-only values calculated from other data. They do not store a manually entered value. Workstation supports: - **Calculations** using property references, arithmetic, comparisons, and functions such as `if`, `is_known`, `min`, `max`, `round`, and `concat` - **Rollups** that count, sum, average, find a minimum, or find a maximum across supported associated records - Optional rolling time windows in days, weeks, months, or years Use **Test formula** with sample values before saving a calculation. On Contacts, the **Add computed properties** button installs the standard **Insights** group (ready-made rollups such as total deal value, number of appointments, upcoming appointments, and total spend). The button only appears while that group is missing. ## Property tabs ### Properties The main table combines active system, custom, and integration-created properties. Search or filter by type, group, or creator. The table also shows where a custom property is used and its fill rate. Select a row to review its details, rules, formula, preview, usage, and data quality. ### Conditional logic Conditional logic changes what happens when a controlling property matches a condition. A rule can: - Show one or more dependent fields - Show and require dependent fields - Set a dependent value, either always or only when it is empty Rules support conditions such as **is any of**, **starts with**, **ends with**, **contains**, and **is known**, depending on the controlling field type. When Stage is the controlling property, filter stage options by pipeline before selecting values. Rules run from top to bottom. If more than one rule sets the same property, the lower matching rule wins. Active rules are enforced when supported records are created or updated; the form behavior is an aid, not the only validation layer. ### Groups Groups organize properties in Settings and property pickers. Create, rename, reorder, or remove custom groups from the **Groups** tab. A property's group is administrative metadata. Moving a property into a group does not place it on a record-page card. Use [Objects](https://workstation.repzo.com/docs/administration/objects) to control record-page placement. ### Archived Archive a custom property when it should no longer be used but its definition may need to be restored. Archived properties move to the **Archived** tab. Deleting a custom property is permanent and removes saved values. Review the **Usage** panel before archiving or deleting a property. ## Validation rules The **Rules** panel always includes **Required** and **Bulk edit** (whether the property can be changed with bulk edit), plus **Include in search** for properties that can be searched. Turning on **Include in search** lets the list search box match that property; keep it to fields people really search by, because each one makes searching a little slower. It also adds checks based on field type: | Field type | Available examples | |---|---| | Text | Minimum/maximum length, whitespace rules, regular expression, uniqueness | | Number and currency | Minimum/maximum value, decimal places, uniqueness | | Phone | Default country code | | Date | Future only, past only, weekdays only, or a specific range | | Multiple choice | Minimum and maximum selections | Rules apply to native and custom properties. See [Data Validation](https://workstation.repzo.com/docs/administration/validations) for choosing between always-on rules, conditional logic, and pipeline-stage requirements. ## Usage and data quality The **Usage** panel shows references from forms, workflows, validations, conditional logic, formulas, and integrations. Check it before changing or removing a property. The **Data quality** panel shows fill rate, clean values, detected formatting or validation issues, and sample records that need cleanup. Large datasets may be sampled to keep the scan responsive. ## Using properties on record pages Creating a property does not guarantee that it appears in a particular card. Go to **Settings → Objects**, edit the object's default view, and add the property to a left-sidebar or middle-column property card. See [Objects](https://workstation.repzo.com/docs/administration/objects) for layout behavior and [CRM Setup](https://workstation.repzo.com/docs/sales/crm-setup) for the recommended configuration order. --- # Objects > Customize organization-wide record pages, create forms, association labels, and related properties. Objects controls how each kind of record looks and behaves across the workspace: which cards and tabs a record page shows, which fields the create form asks for, how records relate to each other, and which linked-record properties people can add to tables. It uses the same catalog as [Properties](https://workstation.repzo.com/docs/administration/properties), but focuses on presentation. Open **Settings → Sales & CRM → Objects** and pick an object. ## Supported objects Contacts, Accounts, Suppliers, Deals, Tickets, Orders, Listings, Subscriptions, Price Offers, Products, Invoices, Forms, Activities, and Campaigns. Not every module with properties is in Objects. Projects, for example, have properties and pipelines but no customizable record page yet. ## Object tabs | Tab | Use it to | |---|---| | **Record customization** | Arrange the record page (cards, tabs, sections) | | **Create form** | Choose the fields on the "create" form and which are required | | **Associations** | Manage association labels and limits for this object | | **Related properties** | Let people add properties of linked records as table columns | | **Automation** | Accounts only: automatically create and link accounts for contacts | Only the tabs that apply to the selected object are shown. ## Record customization Each object has one **Default view** for all workspace users. If nothing has been saved, Workstation uses the system layout. Saving changes every record page for that object. Use the view's menu to reset it to the system layout. Open the Default view to edit it in a live preview built from a real record. ### The three columns - **Left sidebar**: record identity and key information, such as status, properties, and tags. - **Middle column**: tabs that organize the main workspace, such as About, Activities, Emails, Comments, and Timeline. You can rename, reorder, and hide tabs, create your own tabs, and split a tab into sections (up to 10 per tab). At least one tab must stay visible. - **Right sidebar**: associations, files, and other supporting cards. Drag cards to reorder them. Hide a card with **Hide card**, and bring it back from **Add card**. ### Add and create cards **Add card** opens the card library. Pick an existing card for the column, or open **Create card** to make a new one: | Card type | What it shows | |---|---| | **Property card** | A list of properties, in one or two columns | | **Insight card** | A **Data highlight** of a few key values, or a **Property history** chart of how a number has changed over time | | **Association card** | Linked records as a table, grouped by association label, or as a stage tracker | | **Module card** | A built-in card with its own behaviour, such as an activity timeline | An object can have up to 20 cards you created in the left sidebar and up to 30 elsewhere. A property card can show up to 50 properties. ### Edit a property card Click the pencil on a property card to change its title, add properties from the live catalog, drag them into order, remove them (no data is deleted), choose **One column** or **Two columns**, and preview real values. Adding a property to a card does not change its group in Properties. ### Configure an association card Association cards can have a custom title, up to six properties of the linked record, quick filters, label or primary-only filtering, and a default sort. Filters and sorting are applied before the card's row limit, so they decide which linked records appear first. ### Show cards only when they apply Click **Set conditional logic** on a card or tab to **Show** or **Hide** it based on a property of the record, for example show a "Renewal details" card only when Deal type is Renewal. ### Save, undo, and exit Changes are not saved automatically. Use **Undo** and **Redo** while editing, then **Save**. If you leave with unsaved changes, you are asked whether to keep editing. ### Personal card order The editor's **User customization** settings decide whether people may reorder the left sidebar, the right sidebar, both, or neither for themselves. A personal order never changes which cards are visible, card contents, or the middle column, and new workspace cards still appear for people who reordered theirs. ## Create form The **Create form** tab controls the form people see when they create a record of this object. - Add properties, drag them into order, and use **Remove from form** for fields you don't need. - Use **Require on create** or **Make optional on create** to change whether a field must be filled in when the record is created. - Fields that are always required (set in Properties) must stay on the form, and Pipeline must stay while Stage is on it. Restore the system create form from the form's menu. ## Associations The **Associations** tab (also reached from **Settings → Sales Pipeline → Associations**) shows how this object relates to others and manages **association labels**, such as `Billing contact` or `Decision maker`. When you create a label, choose: - **Label type**: a **Single label** that reads the same from both sides, or a **Pair of labels** where each side has its own name, such as `Manager ↔ Employee`. - **Limits**: optional caps on how many records can take the label, for example one Billing contact per account. Limits stop new links once a record reaches the cap; existing links are kept. Each label shows where it is used and its history. Developers can find the label ID and the API endpoints that accept it under **API details**. ## Related properties On objects that can be linked to others, **Related properties** lets admins choose properties from linked records, such as the account's industry on a contact. People can then add those as columns in the object's table. Values stay in sync with the linked record and can be included in the table's search. ## Account automation On Accounts, the **Automation** tab can automatically create an account and link it to each new contact. When you turn it on, you can also process existing contacts in the background. ## Properties, Objects, and views - Use [Properties](https://workstation.repzo.com/docs/administration/properties) to define and validate data. - Use Objects to place that data on record pages and create forms. - Use [Table Views](https://workstation.repzo.com/docs/administration/table-views) to set up list and board pages. - Use [Pipelines](https://workstation.repzo.com/docs/sales/pipelines) for stages and stage rules. These settings are independent. Hiding a field from a record card does not delete the property, remove it from reports, or hide its table column. --- # Tasks > Create, prioritize, filter, complete, and bulk-create task activities. Tasks are Activity records with the type **Task**. They are managed from the unified [Activities](https://workstation.repzo.com/docs/engagement/activities) workspace rather than a separate Tasks page. Use a task for work that needs to be done. Use a Call or Meeting when the work is a scheduled customer interaction. ## Creating a task 1. Open **Activities**. 2. Select **New Activity → Create Task**. 3. Enter the subject. 4. Add a description, priority, status, owner, and related records as needed. 5. Add a due date and time if the task should appear as due, overdue, or on the Calendar. 6. Add reminders when a due date is present. 7. Select **Create Activity**. The standard task statuses are Pending, Completed, and Cancelled. Priority can be Low, Medium, or High. You can also create a task from a record. Open the record's **Activities** tab and select **Create a task**; the task is linked to that record automatically. See [Activities on a record](https://workstation.repzo.com/docs/engagement/activities#activities-on-a-record). Some tasks are created for you: - [Stage Health](https://workstation.repzo.com/docs/sales/pipelines#stage-health) can create a follow-up task when a deal or other pipeline record goes stale. - [Workflows](https://workstation.repzo.com/docs/administration/workflows) can create tasks as an action. - Read.ai action items can be imported as pending tasks. ## Finding task work The Activities list starts with pending work assigned to you. To focus on tasks, add a **Type = Task** filter and combine it with the standard tabs: | Tab | Useful task view | |---|---| | Due today | Tasks whose due date is today | | Overdue | Pending tasks with a due date before today | | Upcoming | Pending tasks due after today | | All | All tasks that match the remaining filters | Save the result as a personal or shared [Table View](https://workstation.repzo.com/docs/administration/table-views) when the team uses it regularly. ## Completing and reopening tasks In List view, select the completion control at the start of a row. A pending task becomes Completed, and a completed task can be reopened as Pending. You can also: - Open the task record and select **Mark Complete** or **Reopen** - Move the card between status columns in Kanban view - Change Status while editing the activity Completed time is tracked separately from the last edit time so reports and KPIs can measure when the work was actually completed. ## Due dates and reminders A due date is optional. Add one when you need: - Due-today, upcoming, or overdue filtering - Placement in the Activity Calendar - A reminder on the due date or a number of days before it - Automatic due-soon and overdue notifications for the owner See [Activity Reminders](https://workstation.repzo.com/docs/engagement/reminders) for reminder timing and notification channels. ## Linking tasks to records Associate a task with the records that give it context. A single task can be related to multiple supported records, such as a Contact, Account, Deal, Ticket, Project, Invoice, or Campaign. Examples: - Associate “Send revised proposal” with the Contact, Account, and Deal. - Associate “Confirm implementation date” with the Account and Project. - Associate “Call customer about overdue balance” with the Contact and Invoice. ## Bulk task creation Supported record lists provide **Create tasks** as a bulk action. This creates one task per selected record or per record matching the current selection criteria, with each task associated with its source record. In the dialog, enter the **Task title** and optionally a priority, a due date (such as Today, Tomorrow, In 3 business days, or In 1 week), an assignee, and a description. When you leave **Assigned to** empty, the tasks are assigned to you. Task creation runs in the background, so large selections don't block the page. Use this for a defined follow-up campaign, then monitor the resulting work in Activities with Type, owner, due date, and status filters. ## Related documentation - [Activities](https://workstation.repzo.com/docs/engagement/activities) - [Activity Calendar](https://workstation.repzo.com/docs/engagement/calendar) - [Activity Reminders](https://workstation.repzo.com/docs/engagement/reminders) - [Table Views](https://workstation.repzo.com/docs/administration/table-views) - [Reports](https://workstation.repzo.com/docs/analytics/reports) --- # Activity Calendar > View dated tasks, calls, and meetings and sync meetings to Google or Outlook. The Activity Calendar is the Calendar view inside [Activities](https://workstation.repzo.com/docs/engagement/activities). It shows Tasks, Calls, and Meetings that have a due date or start time. This calendar is different from the [Appointments calendar](https://workstation.repzo.com/docs/engagement/appointments): | Activity Calendar | Appointments calendar | |---|---| | Follow-ups, calls, and meetings | Client services and bookings | | Uses Activity due dates and start times | Uses appointment date, time, staff, location, services, and resources | | Supports Google or Outlook sync for Meetings | Supports shifts, time off, block time, checkout, and online booking | [Meeting Links](https://workstation.repzo.com/docs/sales/meeting-links) also has its own **Calendar** tab. It shows booked meetings for each host next to their Google Calendar events, and it is where you reschedule or cancel a booking. Booked meetings are Meeting activities, so they appear in the Activity Calendar too. ## Opening the calendar 1. Open **Activities**. 2. Select the Calendar icon in the view switcher. 3. Use **Day**, **Week**, or **Month** to change the calendar range. Use the previous and next controls to move through the selected range, or select **Today** to return to the current date. The Activity view is stored in the `view` URL parameter, so a saved or shared Activities URL can reopen Calendar view. ## What appears on the calendar Workstation places an activity on its due date when one is set; otherwise, it uses the scheduled start time. Tasks normally use their due date, while Calls and Meetings normally use their start time. Activities without either a due date or start time do not appear. The month view shows the first three activities in each date cell and a count for additional items. Day and week cards show more context and open the activity editor when selected. ## Creating calendar work Create the record from the **New Activity** menu: - **Create Task** for work with an optional due date. - **Log Call** for a call with a scheduled start. - **Schedule Meeting** for a future meeting. - **Log Past Meeting** for a meeting that already happened. The activity appears after it has a due date or start time. Use the List or Kanban view when you need to create, bulk-edit, or reorganize several records. ## External calendar connections Meeting activities can create events in Google Calendar or Outlook. 1. Open **Settings → Your Account → Email & Calendar**. 2. Connect Google Calendar, Outlook Calendar, or both. 3. Schedule or edit a Meeting in Activities. 4. Choose an in-person or virtual meeting. 5. Enable calendar sync or select Google Meet or Microsoft Teams. Selecting Google Meet or Microsoft Teams automatically chooses the matching calendar provider and asks the provider to create the conference link. A custom virtual meeting uses the URL you enter. ## How sync behaves Calendar sync is managed from Workstation: - Creating the meeting creates the external event. - Editing a synced meeting updates the external event. - Turning sync off removes the linked external event. - Deleting a synced meeting removes the linked external event. If sync fails, Workstation still saves the Activity and shows a warning. Reconnect the provider from Email & Calendar settings when the warning says the connection needs attention. Do not assume that an edit made directly in Google or Outlook will update the Workstation activity. Use Workstation as the source of truth for CRM meeting details. The exception is meetings booked through Meeting Links: changes made in Google Calendar to their time, title, video link, or cancellation sync back, usually within a minute. ## Participants and invitations Meetings and calls can include contact participants. Calendar-connected meetings use participant email addresses when creating the provider event and invitations. Associations are separate from participants. Associate the activity with the relevant Contact, Account, Deal, or other record even when that person is also a participant. ## Related documentation - [Activities](https://workstation.repzo.com/docs/engagement/activities) - [Tasks](https://workstation.repzo.com/docs/engagement/tasks) - [Activity Reminders](https://workstation.repzo.com/docs/engagement/reminders) - [Meeting Links](https://workstation.repzo.com/docs/sales/meeting-links) - [Appointments](https://workstation.repzo.com/docs/engagement/appointments) - [Settings](https://workstation.repzo.com/docs/administration/settings) --- # Activity Reminders > Schedule personal email and in-app reminders for tasks, calls, and meetings. Activity Reminders notify the signed-in user at a chosen time before a Task, Call, or Meeting. Each activity can have up to four reminders. Reminders are configured on the activity itself and can use Email, In-App, or both channels. ## Reminder timing Timing depends on the activity type. ### Meetings Meeting reminders are relative to the meeting start: - 5, 10, 15, or 30 minutes before - 1 or 2 hours before - 1 day before The meeting must have a start time. ### Tasks and calls Task and call reminders can use: - The due date at a selected time - A number of days before the due date at a selected time - A custom date and time A Task needs a due date before the reminder section appears. Calls use their scheduled date or due date as the reminder anchor. Reminder times use the workspace timezone when Workstation calculates the delivery time. ## Adding a reminder 1. Create or edit a Task, Call, or Meeting. 2. Find **Reminders** near the end of the form. 3. Select **Add Reminder**. 4. Choose the timing. 5. Choose Email, In-App, or Email & In-App. 6. Repeat for up to four reminders. 7. Save the activity. Edit the activity again to change or remove future reminders. Saving the edited activity replaces its previous reminder configuration. ## Viewing all reminders Open **Activities** and select **Reminders** in the page actions. This replaces the activity list with a paginated reminder panel. The panel provides: - **Upcoming** for unsent future reminders - **History** for reminders already sent - **All** for both Each row shows the activity, reminder timing, channel, scheduled delivery time, and Pending, Overdue, or Sent state. Select a row to open the related activity. ## Delivery channels | Channel | Result | |---|---| | In-App | Creates an alert in the notification bell | | Email | Sends a reminder to the user's account email | | Email & In-App | Delivers both | The reminder worker checks for due reminders every minute. A reminder is marked sent after processing so it is not delivered repeatedly. Email delivery requires a working platform email configuration. In-app delivery remains available independently of the user's mailbox or calendar connection. ## Reminders versus automatic alerts Configured reminders are not the same as the system's Activity alerts: | Configured reminder | Automatic Activity alert | |---|---| | Added manually to an activity | Generated from the activity due date | | Uses the selected reminder time | Due Soon is within one hour; Overdue is after the due time | | Sent to the user who owns the reminder | Sent to the activity owner | | Email, In-App, or both | Follows notification-template and user channel settings | The automatic due-date check runs every five minutes for pending activities. It sends each Due Soon or Overdue event once and ignores activities that became overdue more than seven days ago. See [Notifications](https://workstation.repzo.com/docs/administration/notifications) for organization templates and personal event preferences. ## Appointment and meeting-link reminders Two other features remind customers, not team members. Neither appears in the Activity Reminders panel. - [Online Booking](https://workstation.repzo.com/docs/engagement/online-booking) emails clients before eligible online bookings, using the lead time configured on the booking portal. - [Meeting Links](https://workstation.repzo.com/docs/sales/meeting-links) emails the guest before a booked meeting, using the **Reminder before** setting on the link. ## Related documentation - [Activities](https://workstation.repzo.com/docs/engagement/activities) - [Tasks](https://workstation.repzo.com/docs/engagement/tasks) - [Activity Calendar](https://workstation.repzo.com/docs/engagement/calendar) - [Online Booking](https://workstation.repzo.com/docs/engagement/online-booking) - [Meeting Links](https://workstation.repzo.com/docs/sales/meeting-links) - [Notifications](https://workstation.repzo.com/docs/administration/notifications) --- # Projects > Plan delivery work with project views, milestones, jobs, templates, and project roles. Projects organize delivery work after a sale or for any internal initiative. A project can belong to an account, then break the work into milestones and jobs with owners, dates, priorities, and progress. ## Find and organize projects Open **Projects** from the Operations section. The page provides three views: | View | Best for | |---|---| | **Gantt** | Seeing projects, milestones, and jobs on one timeline and adjusting planned dates | | **List** | Sorting, filtering, editing, and selecting projects in a table | | **Kanban** | Following projects by **Status**, **Priority**, or stage | Gantt is the default view. List and Kanban use the same filters and saved [Table Views](https://workstation.repzo.com/docs/administration/table-views), so a team can keep views such as “Overdue Delivery.” The standard tabs are **All projects**, **My projects** (projects you own), **In progress**, **Overdue**, and **On hold**. Filters include: - **Project**, **Owner**, **Status**, and **Priority** - **Job Status** and **Job Assigned User**, to find projects by the work inside them - **Due Status**, such as any overdue, overdue milestones or jobs, or due soon - **Due date** (the expected end date) and **Create date** The list also shows a delivery status for each project, such as **On Track**, **3d Remaining**, **5d Overdue**, **On Time**, or **Delivered 2d late**. From List view, users with the required permissions can select projects and bulk edit, assign, delete, or create follow-up tasks. ## Create a project Select **New Project**. The form includes: - account (optional) - project name and description - template (optional) - owner - status and priority - expected start and end dates Actual start and end dates are available when you edit an existing project. Tags are added from the project's **Overview** tab. Project statuses are **Not Started**, **In Progress**, **On Hold**, **Completed**, and **Cancelled**. Priorities are **Low**, **Medium**, **High**, and **Critical**. ### Create from a template Choose a template while creating a project to generate its milestones and jobs. The end date is calculated from the template's durations. If the template uses project roles, an **Assign Team Members to Roles** step appears. Each role is pre-filled with its default member; change any of them before creating the project. Templates can define: - milestones and their order - jobs inside each milestone, with a **Start Day Offset**, **Duration (days)**, and weight - the role responsible for each job - **Default Milestone Behaviors**, such as auto-unlock, completion rule, and approval Configure reusable structures in **Settings → Project Templates**. ## Work from the project record Opening a project shows the project record without losing the list context. The record has these tabs: - **Overview** for project information, timeline, owner, tags, and the AI summary when available - **Milestones** for delivery phases and their jobs - **Comments** for internal collaboration - **Files** for project attachments - **Timeline** for record activity and changes Keep the expected dates current. Gantt, delivery status, and overdue filters depend on them, while actual dates show what happened during delivery. ## Milestones Milestones represent phases or deliverables. Their status can move through: ```text Locked → Unlocked → In Progress → Pending Approval → Completed ``` A milestone can carry expected and actual dates, progress, and these settings: | Setting | Effect | |---|---| | **Auto-unlock Next** | Unlocks the next milestone after completion | | **Completion Rule** | **Strict** (all jobs required) or **Weighted** (by job weight) | | **Allow Task Start Before Unlock** | Lets jobs start before the milestone unlocks | | **Require All Tasks Done** | Prevents completion until every job is done | | **Require Approval** | Sends the milestone to the selected **Approval Role** before it completes | | **Lock on Achieve** | Locks the milestone after it is completed | Choose Strict when every job must finish. Use Weighted when some jobs contribute more to progress than others. ## Jobs Jobs are the actionable work inside a milestone. A job has: - a name and description - **Pending**, **In Progress**, **Blocked**, or **Done** status - priority - an assigned project role and a specific user - start and due dates - a weight used by weighted milestone completion Open a job to see its **Details**, **Files**, and **Comments** tabs. Mention a teammate with `@` in a job comment to notify them; the notification links straight back to the job. Completing a job recalculates milestone and project progress. Depending on the milestone settings, completion can also finish the milestone and unlock the next one. ## Project roles Project roles describe responsibilities such as Project Manager, Designer, Developer, or QA. They are reusable across templates and projects. In **Settings → Project Roles**, administrators create roles, add the members who can fill each role, and choose a default member. When a project is created from a template, each role is filled with its default member unless you choose someone else. Jobs assigned to a role go to the person mapped to that role on the project. ## Properties Administrators can manage project properties in [Properties](https://workstation.repzo.com/docs/administration/properties). Project record layouts are not configurable in **Settings → Objects**. ## Visibility and permissions Project visibility follows workspace data-visibility rules. A user can also see a project when they are assigned to one of its jobs. Creating, updating, and deleting projects need the matching project permission. Separate permissions control assigning project roles, managing project templates, and approving milestones. ## Related pages - [Accounts](https://workstation.repzo.com/docs/sales/accounts) - [Properties](https://workstation.repzo.com/docs/administration/properties) - [Table Views](https://workstation.repzo.com/docs/administration/table-views) - [Team](https://workstation.repzo.com/docs/administration/team) - [Drive](https://workstation.repzo.com/docs/operations/drive) --- # Tickets > Manage support work with Desk, List, and Kanban views, SLA deadlines, duplicates, properties, pipelines, and automation. Tickets are the workspace help desk for questions, incidents, problems, and service tasks. They combine customer context, assignment, a team conversation, service-level deadlines, and automation in one record. ## Choose a ticket view Open **Tickets** from the Operations section. The module has three views: | View | Best for | |---|---| | **Desk** | Working a support queue without switching pages | | **List** | Reviewing, sorting, filtering, exporting, and bulk updating tickets | | **Kanban** | Following work by status or a supported custom select property | ### Desk Desk is the default view and opens on **My open tickets**. It has resizable panes: 1. A queue rail with live counts. 2. The list of tickets in the selected queue. 3. The selected ticket's conversation. 4. A details rail (on larger screens) with customer info, assignment, and the Fox AI panel. The **Mine** queues are **My open tickets**, **My waiting tickets**, **My closed tickets**, **Mentioned**, **Following**, **Reported by me**, **Due today**, **Overdue**, and **SLA at risk**. The **Workspace** queues are **Open**, **Waiting** (Pending), **Closed**, **Assigned**, **Unassigned**, **New today**, **Urgent + Critical**, **SLA breached**, **SLA at risk**, **Stale**, **Reopened**, and **All**. **Due today** and **Overdue** use the ticket's manual Due Date. Use **SLA at risk** and **SLA breached** to work by SLA deadlines. From Desk, an agent can reply, add attachments, and update status, pending reason, priority, type, categories, assignee, group, followers, and tags. Use **Submit as** to send a reply and change the status in one step. Account and contact are changed from the full ticket record. The Fox AI panel can **Summarize this ticket**, **Find similar resolved tickets**, **Suggest a KB article**, or **Draft a reply**. ### List and Kanban The standard tabs are **All tickets**, **My tickets**, **Unassigned**, **Open**, and **Breached**. Saved [Table Views](https://workstation.repzo.com/docs/administration/table-views) can preserve filters, columns, sorting, view mode, and Kanban grouping. List view supports bulk assign, edit, create tasks, and delete, plus export to Excel. Kanban cards can show the ticket number, category, assignee, priority, requester, account, due date, SLA due, and Stale or SLA breach badges. ### Find duplicates Select **Duplicates** in the page header to open **Check Duplicate Tickets**. It groups tickets that look like the same issue. Use **Merge Group** or **Merge All** to keep one ticket per group; comments from the others move onto the kept ticket and the others are deleted. ## Create a ticket Select **New Ticket** from the Tickets page. You can also create a ticket from: - an Inbox conversation, with **Create ticket** in the Details sidebar, optionally copying recent messages into the ticket as comments - a Chat message, with **Create → Ticket** - an [AI agent](https://workstation.repzo.com/docs/operations/ai-agents), when its tools allow it (agents can also be deployed to Tickets) The create form includes the associations configured for tickets in [Objects](https://workstation.repzo.com/docs/administration/objects), and Pipeline and Stage when a ticket pipeline is in use. ## Ticket fields Every ticket receives a workspace ticket number and subject. Common fields include: - description, status, priority, type, source channel, and language - assignee, owner, group, followers, and requester - optional external requester name and email - related account and contact - categories, tags, pipeline, and stage - Due Date (Task tickets only) and SLA deadlines ### Status, type, priority, and channel | Classification | Available values | |---|---| | **Status** | Open, In Progress, Pending, Resolved, Closed | | **Type** | Question, Incident, Problem, Task | | **Priority** | Low, Medium, High, Urgent, Critical | | **Channel** | Web, Email, Chat, Phone, Social, API, Portal | When a ticket is set to **Pending**, select a Pending Reason so the team knows what it is waiting for. Configure those reasons in **Settings → Tickets → Pending Reasons**. ### Two kinds of due date Tickets show two different deadlines: | Field | Where it comes from | |---|---| | **SLA Due** | Calculated from the SLA policy. It shows the first-response deadline until the first reply, then the resolution deadline. It reads “Due in 2h 40m” or “Overdue by 40m”, turns amber within an hour, and red when breached. On the record it is labelled **First response due** or **Resolution due**. | | **Due Date** | Set by hand, and only available when the ticket type is **Task**. Desk shows it as **Due**. | SLA Due is shown in the list, on Kanban cards, in Desk, and on the record. ## The ticket record The full record has **Conversation** and **Timeline** tabs. The sidebar groups Requester, Assignment, Ticket Details, Pipeline, Meta, and Tags. Side panels show **Insights** (AI summary and knowledge-base search), **Requester Context** (the account and contact), and **Radar Findings**. Tickets that have been inactive for too long show a **Stale** badge. ## Conversation and collaboration The ticket conversation supports rich text, attachments, and @mentions. Long conversations collapse to the first and latest messages. Replies and notes stay inside Workstation. The assignee, owner, and followers are notified when a reply is added. Ticket replies are not emailed to the requester; use [Inbox](https://workstation.repzo.com/docs/operations/inbox) to talk with customers. Followers can see followed tickets even when normal ownership visibility would exclude them. Use assignment for the person responsible for the next action and followers for people who need to stay informed. ## Service-level agreements An SLA policy sets response, update, and resolution targets. Each policy has targets for **Urgent**, **High**, **Normal**, and **Low**. Ticket priorities map onto them: Critical uses Urgent and Medium uses Normal. A policy can apply to every ticket or only when its conditions match (**Meet ALL** or **Meet ANY** of the conditions). The first active matching policy, in list order, applies when the ticket is created. Workstation supports seven SLA metrics, grouped into reply, update, and resolution metrics: | Metric | What it measures | |---|---| | **First Reply Time** | Creation to first agent response | | **Next Reply Time** | Customer message to the next agent response | | **Periodic Update** | Required update frequency | | **Pausable Update** | Update frequency that can pause while Pending | | **Requester Wait Time** | Total time the requester has waited | | **Agent Work Time** | Active agent working time | | **Total Resolution Time** | Creation to resolution | Time spent in Pending pauses SLA deadlines, and they move later when work resumes. Workstation sends a warning notification 15 minutes before a target breaches and can trigger SLA automation. Desk's **SLA at risk** queue shows tickets within an hour of a deadline. Configure policies in **Settings → Tickets → SLA Policies**. ## Categories and macros **Categories** have a name, description, color, and active state, and a ticket can have more than one. Use them for reporting and queue filters. Manage them in **Settings → Tickets → Categories**. **Macros** are saved replies. On a ticket record, select **Macro** to insert one into the reply. Macros are shared with Inbox and organized in folders. On a ticket only the macro text is inserted; status, tag, and assignment actions apply in Inbox only. Manage them from **Settings → Tickets → Macros**. ## Properties, Objects, and pipelines Tickets support native, custom, and computed [Properties](https://workstation.repzo.com/docs/administration/properties). Validation and conditional requirements apply to supported create, update, and bulk-edit paths. Use [Objects](https://workstation.repzo.com/docs/administration/objects) to arrange the Ticket record layout and supported cards. Use [Pipelines and Stages](https://workstation.repzo.com/docs/sales/pipelines) when the service process needs configurable stages in addition to ticket status. Ticket reports such as Tickets by Status and Tickets by Priority are available in [Reports](https://workstation.repzo.com/docs/analytics/reports). ## Automation [Workflows](https://workstation.repzo.com/docs/administration/workflows) can start from **Ticket Created**, **Ticket Updated**, **Ticket Status Changed**, **SLA Warning**, and **SLA Breached**. Ticket actions include **Create Ticket**, **Update Ticket**, and **Escalate Ticket**, which can change priority, assignee, and status. ## Visibility Ticket visibility combines the workspace visibility scope with direct assignment and followers. A ticket stays visible to its assignee and followers even when it falls outside their normal record scope. Tickets with no assignee and no owner are visible to everyone with ticket access. Permissions still control who may create, update, or delete tickets. ## Related pages - [Inbox](https://workstation.repzo.com/docs/operations/inbox) - [Properties](https://workstation.repzo.com/docs/administration/properties) - [Objects](https://workstation.repzo.com/docs/administration/objects) - [Pipelines and Stages](https://workstation.repzo.com/docs/sales/pipelines) - [Workflows](https://workstation.repzo.com/docs/administration/workflows) - [Radar](https://workstation.repzo.com/docs/analytics/radar) - [Notifications](https://workstation.repzo.com/docs/administration/notifications) --- # Appointments > Schedule client services across locations, team members, shifts, resources, bundles, and sales. Appointments is the service-booking workspace. It combines a location-aware calendar with staff schedules, bookable services, resources, client profiles, online booking, and checkout. An Appointment is different from a Meeting activity. Use an Appointment when a client books a service that may need a team member, location, resource, price, or sale. Use a [Meeting](https://workstation.repzo.com/docs/engagement/calendar) for ordinary CRM scheduling and external calendar sync. ## Before scheduling For a new workspace, configure appointments in this order: 1. Create active **Locations** in Settings. 2. Build the **Service Menu**, Service Categories, and any service bundles. 3. Configure team **Shifts** for each location. 4. Add rooms, chairs, equipment, or other **Resources** used by services. 5. Review appointment statuses, cancellation reasons, block-time types, business hours, and closing periods. 6. Configure [Online Booking](https://workstation.repzo.com/docs/engagement/online-booking) if clients will self-book. 7. Configure **Memberships** if clients can buy or redeem memberships and packages during [Checkout](https://workstation.repzo.com/docs/engagement/appointment-checkout). These options are grouped under **Settings → Appointments**: **Shifts**, **Configuration**, **Session Note Templates**, **Online booking**, **Memberships**, **Service Menu**, **Service Categories**, **Products**, and **Inventory**. ## The appointment calendar Open **Appointments** from the Operations section of the sidebar. ### Views | View | Purpose | |---|---| | Day | Detailed time grid with team-member and resource lanes | | 3 day | Short-range scheduling across three dates | | Week | Seven-day planning view | | Month | Monthly overview; selecting a date opens Day view | Use **Today**, the previous and next controls, or select the date in the toolbar (**Jump to date**) to pick any date. The selected date, view, location, and visible columns are kept in the URL so the calendar can reopen in the same context. The toolbar also links to the appointment settings and to [Online Booking](https://workstation.repzo.com/docs/engagement/online-booking). ### Locations and columns Choose a location before scheduling. The column selector offers: - **All team and resources** - **All team members**, or selected team members - **All resources**, or selected resources **All team members** shows people who have a shift or an appointment in the visible range. Columns fit the screen; when there are more than fit, use the arrows at the edge of the header to page through them. Select a column header for quick actions. A team member's menu can switch to their day, week, or month view, add an appointment, blocked time, or time off, edit their shift, or open their profile. A resource's menu can add an appointment or edit the resource. Resource columns use the resource's configured icon and color. Selecting a time in a resource lane starts a normal appointment and shows the services **Suitable for** that resource first. ### Calendar availability The Day view combines: - Business hours, location hours, and closing periods - Repeating shifts and one-day shift overrides - Team time off - Blocked time - Existing appointments - Resource availability and capacity Availability warnings identify overlaps, work outside a shift, time off, block time, or an unavailable resource. Staff-created appointments can intentionally overbook, so review warnings before saving. Overlapping appointments are shown side by side. Appointments booked online show a globe icon. In Day view, drag an appointment to a new time or team-member lane, or resize it. Completed appointments cannot be moved or resized. To move an appointment to another date, use [Reschedule](#rescheduling). ## Creating an appointment The **Add** menu offers **New Appointment**, **New sale**, **Blocked Time**, and **Time Off**. Use **Add → New Appointment**, or select an empty calendar slot and choose **Add appointment**. 1. Choose a client, or leave the appointment as a walk-in. 2. Select one or more services or bundles from the Service Menu. 3. Confirm the team member for each service. 4. Review the date, start time, duration, price, and currency. 5. Review availability and resource warnings. 6. Add appointment notes and save. An appointment can contain several services. Each service line can have its own team member, duration, price, start window, and resource requirements. The total appointment duration follows the scheduled services. The client picker searches Contacts. A saved client appointment can show date of birth, staff alert, appointment history, recent services, total sales, cancellation and no-show counts, segments, and active memberships. ## Managing services Open an appointment to: - Add a service or bundle - Edit a service's price, discount, duration, start time, or team member - Remove a service - Reuse services from one of the client's recent appointments - Review service-specific availability warnings The **Discount** option on a service offers **No discount**, 5% steps up to 100%, or a **Custom** percentage. The service then shows the discounted price with the original price crossed out. When a resource is required by a service, Workstation reserves that resource for the service's time window. This avoids blocking the resource for the full appointment when it is only needed for part of a multi-service booking. If you later change which resources a service needs, its upcoming appointments are re-reserved automatically. ## Service bundles A bundle sells several services together at one price, such as “Cut, colour and blow-dry.” When booked, a bundle becomes ordinary service lines, one per service, booked one after another, with the bundle price split across them. Create a bundle from **Settings → Appointments → Service Menu → Add → Bundle**. Bundles are listed on the **Bundles** tab. A bundle has: - **Bundle name**, **Category**, and description - at least two services, **Booked in sequence** - a **Price type**: **Service pricing**, **Custom pricing**, **Percentage discount**, or **Free** - **Allow clients to book this bundle online**, to offer it through [Online Booking](https://workstation.repzo.com/docs/engagement/online-booking) When adding services to an appointment, bundles appear in a **Bundles** group at the top of the picker. A booked bundle shows as a group in the appointment panel. Its services are locked except for the team member, and it can only be removed as a whole with **Remove bundle**. Bundle services can't be discounted individually. ## Rescheduling Open an appointment and choose **Quick actions → Reschedule**. The panel closes and a **Select a time to book** banner appears over the calendar. Navigate to any date and select the new slot; in Week, 3 day, or Month view, selecting a day opens Day view first. A **Reschedule appointment?** dialog checks availability and lists any warnings. Select **Reschedule** to confirm. The team member and resource reservations move with the appointment. Select ✕ on the banner to stop rescheduling. Completed appointments can't be rescheduled. ## Statuses and cancellation The standard system statuses are Booked, Confirmed, Completed, Canceled, and No-show. Administrators can add custom statuses with their own names and colors. Change status from the status menu in the appointment panel. **Quick actions** also offers **Reschedule**, **No-show**, and **Cancel**. Canceling opens the cancellation flow so you can select a configured reason and add notes. Cancellation time and user are recorded. Completed appointments show a fixed status. The appointment card uses the status color and also indicates whether an associated sale is paid, partially paid, or unpaid. ## Client and appointment details The appointment panel provides: - Client summary and an **Actions** menu to send a message, call the client, create a CRM note, add or edit a staff alert, or remove the client - Recently booked services that can be reused - Memberships available to the client - Services and their assigned professionals - Rich-text appointment notes, which stay editable after checkout - Status and cancellation actions - Checkout, or the sale record and outstanding balance Select **View profile** to open the client profile without leaving the calendar. It has **Overview**, **Appointments**, **Clinical history** (with permission), **Sales**, **Items**, **Notes**, and **Client details** sections, plus **Book now** and **Open full profile**. A Contact or Account record can also show its related Appointments. ## Session notes Clinics and practitioners can keep signed session notes for each visit. Open an appointment and select **Session notes & history**, or use **Notes to finish** in the calendar toolbar to see your drafts and completed appointments that still need a note. Start a note from **General session**, **SOAP**, **Therapy follow-up**, or a clinic template. A note links to the appointment service and can include attachments. Select **Sign & lock** to finish a note; after that, add a signed amendment instead of editing it. A note recorded by mistake can be marked **Entered in error**. All of a client's notes appear in **Clinical history** on the client profile and the Contact record. Manage clinic templates in **Settings → Appointments → Session Note Templates**. Session notes have their own view, create, update, delete, and manage-templates permissions. ## Team notifications Team members are notified when an appointment assigned to them is created, rescheduled, or cancelled. Each person controls these alerts in their own notification settings. See [Notifications](https://workstation.repzo.com/docs/administration/notifications). ## Blocked time Use **Add → Blocked Time** or select a calendar slot and choose **Add blocked time**. Blocked time includes a configured type, optional title, date, start and end time, team member, and recurrence. Recurrence can be daily, weekly, monthly, or a custom interval with an end date or occurrence count. Use blocked time for unavailable hours that are not leave, such as breaks, internal meetings, or training. ## Time off Use **Add → Time Off** for Annual Leave, Sick Leave, Training, or other time away. A time-off record includes the team member, date, time range, optional recurrence, description, and approval state. Time off appears on the calendar and in the Shifts workspace. Use Time Off rather than blocked time when the absence belongs to a team member's attendance record. ## Shifts Open **Settings → Appointments → Shifts** to manage weekly availability. The roster can be grouped by Location or Team member. It supports: - Multiple working intervals in one day - Weekly and every-two-weeks repeating schedules - Schedule start and end dates - One-day overrides - Not-working days - Time off alongside shifts - Location closing periods Editing a day from the appointment calendar changes that date only. Use the Shifts workspace to change the repeating schedule. ## Appointment configuration Open **Settings → Appointments → Configuration**. | Tab | What it controls | |---|---| | General | First day of the week and **Business hours** | | Statuses | System and custom appointment statuses and colors | | Cancellation Reasons | Active reasons shown during cancellation | | Block Time Types | Reusable blocked-time categories and colors | | Resources | Rooms, equipment, capacity, availability, links, and service usage | | Closing Periods | Global or location-specific closure date ranges | Business hours are the default for every location. In a location's settings, choose **Use business hours** or **Custom hours**. Business hours also decide when chat shows as after-hours and when the website chat widget and AI inbox agents treat the business as open. ### Resources A resource has a **Resource name**, **Resource type** (choose one or create a new type), description, **Capacity limit**, **Calendar color**, and active state. It can be **Always available**, or use **Limit resource availability** to set weekly hours and optional start and end dates. Link related resources when booking one should make another unavailable. For example, booking a combined room can also reserve the two smaller rooms it contains. The resource's Services section shows which Service Menu entries require it. Edit those relationships with **Required resources** on the service form, or select several services in the Service Menu and use **Assign** to set their locations, team members, and required resources together. ## Online booking, checkout, and reviews - [Online Booking](https://workstation.repzo.com/docs/engagement/online-booking) lets clients choose services, professionals, and available times through shareable links. - [Appointment Checkout](https://workstation.repzo.com/docs/engagement/appointment-checkout) converts services and products into a sale, invoice, payments, tips, discounts, loyalty, gift cards, and memberships. - [Reviews](https://workstation.repzo.com/docs/engagement/reviews) collects post-checkout ratings and lets the team reply or moderate them. ## Related documentation - [Online Booking](https://workstation.repzo.com/docs/engagement/online-booking) - [Appointment Checkout](https://workstation.repzo.com/docs/engagement/appointment-checkout) - [Reviews](https://workstation.repzo.com/docs/engagement/reviews) - [Activity Calendar](https://workstation.repzo.com/docs/engagement/calendar) - [Contacts](https://workstation.repzo.com/docs/sales/contacts) - [Invoices](https://workstation.repzo.com/docs/commerce/invoices) - [Notifications](https://workstation.repzo.com/docs/administration/notifications) - [Settings](https://workstation.repzo.com/docs/administration/settings) --- # Online Booking > Publish scoped booking links and control client availability, booking form fields, banners, emails, approval, and self-service changes. Online Booking gives clients a public, mobile-friendly flow for choosing services, professionals, and available times. It creates ordinary [Appointments](https://workstation.repzo.com/docs/engagement/appointments) marked as booked online. Open **Settings → Appointments → Online booking**, or use the Online booking shortcut in the appointment calendar toolbar. ## Prerequisites Before enabling the booking page: 1. Create at least one active location. 2. Add bookable services with duration and pricing. 3. Assign services to the team members who can perform them. 4. Configure team shifts and business hours. 5. Configure required resources and their availability. 6. Confirm the appointment statuses used for Booked and Confirmed. Public availability is calculated from services, staff, shifts, existing appointments, block time, time off, closing periods, resources, booking limits, and the selected link scope. When a required resource is fully booked, that time is not offered online, even though staff can still overbook it from the calendar. ## Enabling the booking page Turn on **Your booking page** to allow online booking. The booking page is not discoverable on its own. Clients can only enter through a booking link you create and share. The **Booking page address** sets the `/book/
` part of every link. Changing it breaks links and QR codes you have already shared. The page header uses the workspace logo. ## Booking rules | Setting | Purpose | |---|---| | **Require approval for bookings** | Creates the booking as Booked instead of Confirmed; the client sees it as pending approval | | **Clients can book** | Minimum lead time before the appointment | | **And no more than** | Maximum number of days into the future | | **Clients can cancel or reschedule** | How long before the appointment clients can still cancel | ### Schedule optimization Choose how the public flow offers time slots in **Time slots**: - **Show all slots (max availability)** offers every available time. - **Reduce calendar gaps** hides slots that would leave a gap shorter than **Allow gaps of at least (minutes)**. - **Eliminate calendar gaps** offers only slots next to existing appointments, plus the edges of the day chosen in **Allow bookings at**: start and end of day, start only, or end only. Optimization changes what clients can select; it does not change staff-created appointments. ## Booking form fields **Booking form fields** controls the contact details clients enter. The built-in fields are First name, Last name, Email, and Phone. Use **Choose CRM fields** to add Contact properties, arrange all fields with the arrows, and mark each one **Required** as needed. The order applies to every booking link. ## Notifications and automated emails **Staff notifications** decide who hears about online bookings, reschedules, and cancellations: - **Notify the booked team member** - **Also notify these team members** - **Also notify these emails (comma-separated)**, for people outside the workspace (email only) **Automated emails** to the client: - **Confirmation** - **Rescheduled** - **Cancelled** - **Reminder**, sent **Reminder lead time (hours)** before the appointment - **Show service prices in emails** - **Email language**: English or Arabic Booking emails include a calendar invite and a **Manage your booking** link. The reminder check runs every 15 minutes and looks up to about a week ahead, so keep the reminder lead time under seven days. These client reminders are separate from [Activity Reminders](https://workstation.repzo.com/docs/engagement/reminders). ## Creating booking links ### Link to everything Create one link for everything the client can book. In a multi-location workspace, choose a location or **All locations**. With a single location, the link is created straight away. ### Link to services Create a narrower link by choosing: - **All services** or selected services, picked by category with search - **All team members** or selected team members - a location, when the workspace has more than one A link with all services, all team members, and no location would be the same as Link to everything, so choose a location or specific team members instead. Use a descriptive **Link name** such as “Haircuts with Wael” so the team can identify it later. ## Managing links Each link row shows its type, location, views, and bookings. From a row you can: - copy the URL - show the QR code and **Download** it - edit the link (its address and QR code stay the same) - switch the link off, so it stops taking bookings without turning off the whole booking page - delete the link ## Bundles online [Service bundles](https://workstation.repzo.com/docs/engagement/appointments#service-bundles) appear on the booking page when **Allow clients to book this bundle online** is on and every service in the bundle can be booked online. Clients see what the bundle includes and book it like a single service. ## Banners **Banners** show a slider of up to six images at the top of your booking links, for example to promote a new service or a seasonal bundle. The Banners card appears once the booking page is on. Select **Add banner** and set: - **Image** — a 16:9 landscape image (PNG, JPEG, or WebP, up to 5 MB). Put any text in the image itself. - **Title (optional)** — used as alt text - **When tapped** — **Nothing (image only)**, **Open a service**, or **Open a bundle** - **Show from (optional)** and **Show until (optional)** — to schedule the banner New banners are saved as drafts. **Publish** a banner to show it; its status then reads **Published**, **Scheduled**, or **Ended**. Drag rows to change the order, and use the row menu to unpublish, edit, duplicate as a draft, or delete. Each banner counts its clicks. A banner that opens a service or bundle only shows on links that include it. Turn **Show banners** off on a link to hide banners there. Select **Preview** to create a private preview link for one booking link that expires after 24 hours or 7 days. The preview shows drafts and scheduled banners, and booking is turned off in it. ## Client booking flow Depending on the link scope, the client moves through: 1. **Select services** — services and bundles. 2. **Select professional** — **No preference** for maximum availability, or a professional per service. 3. **Select date and time**. 4. **Review and confirm** — contact details, optional comments, and your cancellation policy and important information. The client selects **Confirm**. The result screen says **Booking confirmed**, or **Booking requested** when approval is required. The booking matches an existing Contact by email, then phone, or creates a new one. The appointment stores the booking link, client comment, and confirmation token, and shows a globe icon on the calendar. ## Client cancellation and rescheduling The **Manage your booking** link opens a page where the client can **Reschedule** or **Cancel booking** an upcoming appointment, or **Book again** after a completed one. Cancelling is allowed until the cutoff set in **Clients can cancel or reschedule**. Rescheduling keeps the same services and professionals and requires a newly available time. Both trigger the matching client email, staff notifications, and appointment automation. ## Related documentation - [Appointments](https://workstation.repzo.com/docs/engagement/appointments) - [Appointment Checkout](https://workstation.repzo.com/docs/engagement/appointment-checkout) - [Reviews](https://workstation.repzo.com/docs/engagement/reviews) - [Client Loyalty](https://workstation.repzo.com/docs/operations/client-loyalty) - [Settings](https://workstation.repzo.com/docs/administration/settings) --- # Appointment Checkout > Turn appointment services into sales with products, discounts, tips, payments, gift cards, loyalty, and memberships. Appointment Checkout turns scheduled services into a sale and invoice. It can also create a standalone walk-in sale without an Appointment. Open an appointment and select **Checkout**, or use **Add → New sale** from the appointment calendar. ## Checkout flow Checkout has three steps, shown as **Cart › Tip › Payment**: 1. **Add to cart** for services, products, memberships, quantities, and discounts. 2. **Select tip** for no tip, a preset percentage, or a custom tip, and how it is split. 3. **Select payment** for one or more payment methods, gift cards, store credit, and loyalty rewards. The summary stays visible while you move through the flow, ending with the amount **To pay**. The main button changes with each step: **Continue to tip**, **Continue to payment**, then **Pay now**, **Save part-paid**, or **Save unpaid** depending on the payments entered. ## Cart Appointment services are added to the cart automatically. Use the **Services**, **Products**, and **Memberships** tabs to add more. A booked [bundle](https://workstation.repzo.com/docs/engagement/appointments#service-bundles) arrives as separate service lines with the bundle price split across them. Bundles can't be added from the checkout cart. Select a cart line to edit its **Price**, **Quantity**, **Discount**, and **Team member**. The discount picker offers **No discount**, 5% steps up to 100%, or a **Custom** percentage. Tax comes from each item's tax rate. The ⋮ menu offers: - **Add tip** - **Add cart discount**, as a **Percentage (%)** or **Fixed amount** - **Add sale note** - **Save as draft** - **Cancel sale** Workstation calculates subtotal, discounts, tax, tip, and the final total in the sale currency. For a tax-exempt customer, the Tax row shows **Exempt** with the note **Tax exempt customer — no VAT charged**. ## Client and walk-in sales Appointment checkout uses the appointment's client. A standalone New sale can remain a walk-in or use **Add client** to select a Contact. A client is required to sell a membership, redeem membership sessions, use loyalty rewards, or pay with store credit. ## Memberships Memberships and prepaid packages are configured in **Settings → Appointments → Memberships**. Select **New membership** to create a plan: | Setting | Options | |---|---| | **Pricing and payment** | **One-time payment** (a package, with **Valid for** and **Price**) or **Recurring payments** | | **Payment frequency** | **Weekly**, **Bi-weekly**, **Monthly**, **Quarterly**, or **Yearly**, for recurring plans | | **Length of membership** | **Until canceled**, a fixed number of months, or **Custom**, for recurring plans | | **Sessions** | **Limited** (with a number of sessions) or **Unlimited**, for the included services | A plan also has a tax rate, a color, **Enable online sales** and **Enable online redemption** switches, and **Terms & Conditions**. The Memberships page shows **Active members**, **Monthly recurring revenue**, and **Sessions redeemed**, with **Plans** and **Memberships sold** tabs. Open a sold membership to **Pause**, **Resume**, or **Cancel** it and review its activity. Recurring memberships renew automatically each cycle: Workstation creates a due invoice, resets the sessions, and moves the renewal date forward. Cards are not charged automatically, so collect the renewal invoice like any other invoice. At checkout, the **Memberships** tab has two parts: - **Cover services with a membership** — tick a service line to cover it with one of the client's memberships, shown with the sessions left - **Sell a membership** — add a plan to the cart A covered service is free on the sale. The session is used only when checkout completes, and voiding the sale gives it back. Client memberships also appear in the appointment panel and on the Contact record. ## Loyalty and discounts When [Client Loyalty](https://workstation.repzo.com/docs/operations/client-loyalty) is turned on, checkout can apply: - the client's tier discount, on lines that have no manual discount and are not covered by a membership - a reward, from **Redeem points** on the Payment step Redeem points shows the client's available points and the rewards they can afford. Select **Apply** to use one, or **Remove** to take it off. Remove any entered payments before changing the reward. A percentage cart discount can't be combined with a reward. In a cashback program, the Payment step shows how much cashback the sale will earn instead. ## Tips Choose **No tip**, **10%**, **18%**, or **25%**, or select **Custom tip** to enter an amount or percentage. Workstation assigns the tip to the team member who performed the service. When several team members performed services, the tip is split in proportion to service value. Select **Tips** in the summary to open **Edit or split tip**, where you can change each person's share or **Add team member**. The total tip becomes the sum of the shares. ## Payments Select **Add payment method** to add a payment. Add more than one for a split payment. Cash payments can record the amount received and calculate change. The default methods are Cash, Credit Card, Bank Transfer, Check, Online, and Other. Administrators choose, add, and order payment methods in **Settings → Point of Sale → Payment Methods**. ### Gift cards and store credit Use the **Gift card or store credit** panel to pay with a prepaid balance. Enter a gift card code and select **Check** to see its balance, or select **Use store credit** for the client's wallet, then **Apply** the amount. See [Gift Cards](https://workstation.repzo.com/docs/commerce/gift-cards). ### Unpaid and part-paid sales When no payment is added, the main button reads **Save unpaid**. When payments cover only part of the total, **Save part-paid** asks you to confirm. An appointment with an outstanding balance shows **Sale total** and **Left to pay**; select **Pay now** in the appointment panel to collect the rest. ## Checkout result Successful checkout: - Creates an Invoice and invoice line items - Records payments and the remaining amount due - Links the sale to the Appointment and Contact - Applies membership purchases and session use - Applies loyalty earning and redemption - Records tip allocation When the sale is fully paid (or the total is zero), the appointment is also marked complete and the **Appointment Checked Out** [workflow](https://workstation.repzo.com/docs/administration/workflows) trigger runs. Unpaid and part-paid sales don't do this until they are settled. The success screen shows **Payment complete** and the amount. Select **Go to client profile** to open the Contact, or **Continue** to return to the calendar. If the workspace reports invoices to ZATCA, checkout invoices are reported automatically in the background. A ZATCA failure never blocks the sale. ## Viewing the sale After checkout, select **View sale** from the appointment. The sale panel shows the sale number and date, the items, subtotal, tax, tip, total, and payments, with an **Activity** tab for the sale's history. The full invoice is available in [Invoices](https://workstation.repzo.com/docs/commerce/invoices). ## Reviews after checkout The optional “Thank you for visiting” workflow uses the checkout event to email the client a review request. See [Reviews](https://workstation.repzo.com/docs/engagement/reviews). ## Related documentation - [Appointments](https://workstation.repzo.com/docs/engagement/appointments) - [Online Booking](https://workstation.repzo.com/docs/engagement/online-booking) - [Client Loyalty](https://workstation.repzo.com/docs/operations/client-loyalty) - [Gift Cards](https://workstation.repzo.com/docs/commerce/gift-cards) - [Reviews](https://workstation.repzo.com/docs/engagement/reviews) - [Invoices](https://workstation.repzo.com/docs/commerce/invoices) - [Contacts](https://workstation.repzo.com/docs/sales/contacts) --- # Client Loyalty > Reward customers with points or cashback, tiers, rewards, bonus campaigns, challenges, referrals, and digital loyalty cards. Client Loyalty rewards Contacts for purchases and other actions. A program can give points that customers swap for rewards, or cashback that lands in their store-credit balance. On top of that you can add tiers, bonus campaigns, challenges, referrals, a public sign-up page, and Apple Wallet or Google Wallet cards. Open **Client Loyalty** from the Operations section. Use the switch at the top of the page to turn the program on or off. ## Points or cashback In **Settings → How customers are rewarded**, choose one: | Type | How it works | |---|---| | **Points** | Customers earn points and swap them for rewards. | | **Cashback** | Customers get a percentage of what they spend back as store credit, to use like cash. | Tiers and bonus campaigns work with both. In cashback mode, the **Cashback** card sets the cashback percentage, an optional **Most cashback per sale**, and **Days before it can be used**. Only purchases and paid subscription renewals earn cashback; reviews, online bookings, birthdays, referrals, and challenges stop giving points (challenges still award badges). Points customers already have stay usable after a switch. Cashback is paid into the customer's store-credit balance, which they spend at checkout like a [gift card](https://workstation.repzo.com/docs/commerce/gift-cards). ## Program tabs | Tab | Purpose | |---|---| | **Analytics** | Engagement, points, redemptions, sources, top rewards and members, tier distribution | | **Points** (or **Cashback**) | Ways to earn and ways to spend | | **Tiers** | Spend thresholds, tier discounts, and earning boosts | | **Referrals** | Referral point awards | | **Bonus campaigns** | Time-limited earning boosts | | **Challenges** | Goals that award bonus points and badges | | **Card design** | The digital loyalty card | | **Settings** | Program type, expiry, eligible items, orders, subscriptions, emails, sign-up, card page, and support details | ## Ways to earn points The Points tab has six earning rules: | Rule | When points are given | |---|---| | **Make a purchase** | An eligible appointment checkout, POS sale, or invoice payment. Orders also earn when [Rewards from orders](#orders-and-subscriptions) is on. | | **Leave a review** | The client submits their first [review](https://workstation.repzo.com/docs/engagement/reviews) for an appointment | | **Book online** | The client makes an [online booking](https://workstation.repzo.com/docs/engagement/online-booking) | | **Complete appointment** | The client completes a set number of appointments | | **Birthday** | On the client's birthday, at most once a year, using the Contact's date of birth | | **Subscription renewal** | Each paid subscription renewal, as fixed points or per amount paid | Each rule can be active or inactive. Purchase and renewal points can be a fixed amount per sale or a number of points per amount spent. Under **Earning limits** you can set a minimum purchase or appointment value and limit how many times a client can earn the rule. In **Settings → Eligible sale items**, choose which items count toward points and tier progress: services, products, memberships, gift cards, and service add-ons, and whether to include taxes and service charges. **Points expiry** can be 3, 6, 9, 12, 18, or 24 months, or **Never**. ## Rewards A reward turns points into a discount. Select **Add reward** under **Ways to spend points** and choose a **Reward type**: | Type | Effect | |---|---| | **Amount off** | A fixed amount off. Choose **Increments** or **Fixed** redemption. | | **Percent off** | A percentage off, with an optional **Maximum discount** | | **Free item** | One unit of a chosen product or service becomes free; the item must be in the sale | A reward can also limit what it applies to (services, products, memberships, or gift cards), require a **Minimum purchase**, allow use alongside other deals, and be limited to in-store use. Customers redeem rewards with **Redeem points** in: - [Appointment Checkout](https://workstation.repzo.com/docs/engagement/appointment-checkout) - the [POS](https://workstation.repzo.com/docs/pos) register - [Orders](https://workstation.repzo.com/docs/commerce/orders), when creating an order - [Subscription](https://workstation.repzo.com/docs/commerce/subscriptions) renewals, when **Use points on subscription renewals** is turned on for the contact Workstation reserves the points with the sale and gives them back if it fails. There is no online self-service redemption. ## Tiers Tiers recognize customers by how much they spend. You can have up to five, and each has: - a name and color - a spend threshold - a discount percentage - a **Points multiplier** (for example, 1.5 gives 50% more points), or a **Cashback %** in cashback mode Tier progress counts eligible spend over a rolling 12 months and is recalculated daily. The tier discount applies at appointment checkout and, with **Tier discount on subscriptions**, on subscription invoices. ## Bonus campaigns A bonus campaign boosts earning for a period, such as double points during Ramadan. Select **New campaign** and set: - the name and **When it runs** - **Multiply points by** (1–10) and **Extra points each time** - **Which ways to earn it boosts** - **Only for these tiers (optional)** Campaigns show as Running, Scheduled, Ended, or Off. When several campaigns run at once, the customer gets the best one; they don't stack. In cashback mode a campaign multiplies cashback instead. ## Challenges Challenges reward customers for reaching a goal, for example “Book 5 visits this month.” Select **New challenge** and set: - **What counts**, and **How to count** — number of times or amount spent - the **Goal** - **Starts again** — weekly, monthly, every 3 months, yearly, or never - **Bonus points when reached** (0 gives a badge only) - an optional date range - a **Badge** colour and icon Badges appear on the Contact and on the customer's card page. ## Referrals Enable referrals and set separate point amounts for: - the existing customer who refers someone - the new customer who joins through the referral link An enrolled Contact gets a unique referral link when referrals and the sign-up page are on. Referral points aren't given in cashback mode. ## Orders and subscriptions **Rewards from orders** lets [Orders](https://workstation.repzo.com/docs/commerce/orders) earn, including orders from connected stores, WhatsApp, and AI agents. Choose when an order earns: **When it's paid**, **When it's fulfilled or delivered**, or **When it reaches a stage**. Shipping doesn't count, and only orders placed after you turn this on can earn. The **Subscriptions** card adds: - **Milestones** — bonus points after a number of payments - **Win-back points** — for customers who come back - **Tier discount on subscriptions** ## Refunds and returns Loyalty follows the money back: - Voiding an invoice takes back the points and cashback it earned. - A partial return takes back points in proportion. Points spent on the sale come back only when the whole sale is returned. - Cancelled, refunded, or deleted orders take back their points. - Cashback that is still waiting is cancelled; cashback already released is taken from the store-credit balance. These show as **Reversed** entries in the customer's loyalty activity. ## Sign-up page and card page **Sign-up page** gives you a public link and QR code where customers join and add their card to Apple or Google Wallet. Name plus an email or phone are always required; add **Extra sign-up fields** as needed. Share it on your website, receipts, social media, or in store. With **Unique customer enrollment** on (the default), Workstation matches an existing Contact by email, then phone. Someone already in your records gets their card link by email instead of on screen, so nobody can open another person's card by typing their details. With it off, every sign-up creates a new Contact. **Customer card page** gives each member a private page, with no login, that shows their balance, tier progress, rewards, activity, referral link, challenges, wallet buttons, and terms. Add **Terms and conditions** and **Support & card back** contact details before publishing. ## Card design and wallet passes **Card design** controls the card's colours, points label, logo, icon, and strip image, and whether it shows the tier and member-since date. Preview both iOS and Android, including the back of the card, and check the contrast warning before saving. A logo is required for Google Wallet. In Settings, **Locations** can show a lock-screen message when a customer is near one of up to 10 venues. Apple Wallet and Google Wallet buttons appear on enrolled Contacts when the wallet services are configured. In cashback programs, the card shows the cashback balance instead of points. Cards update when the balance changes. ## Customer emails **Customer emails** can tell customers when they earn points, reach a new tier, unlock a reward, or have points about to expire (sent a set number of days before). ## Contact loyalty card The loyalty card on a [Contact](https://workstation.repzo.com/docs/sales/contacts) shows: - points balance, or cashback available and on its way - lifetime points and tier spend - current tier - recent earning, redemption, adjustment, expiry, and reversal activity - challenge badges - **Copy card link**, **Open card page**, and wallet actions - the referral link, when enabled - **Use points on subscription renewals** Users with loyalty update permission can make a positive or negative manual points adjustment and record the reason. ## Analytics Analytics shows engaged clients, points issued, redeemed, and outstanding, redemption rate, active rewards, a 30-day earned-versus-redeemed chart, **Where points come from**, **Most used rewards**, **Top members**, and members by tier. Cashback programs also show cashback given, waiting, and spent. Use outstanding points and redemption rate together: a growing balance with very low redemption often means rewards are hard to understand or reach. ## Automation [Workflows](https://workstation.repzo.com/docs/administration/workflows) can start from **Loyalty Points Earned**, **Loyalty Points Redeemed**, **Loyalty Tier Changed**, **Loyalty Reward Unlocked**, **Loyalty Points Expiring Soon**, and **Loyalty Challenge Completed**. The **Give Loyalty Points** action awards points from any workflow. ## Permissions Loyalty has view and update permissions. Program configuration and manual adjustments need update access; view-only users can review loyalty information without changing balances or rules. Gift cards and store credit have their own permissions. See [Gift Cards](https://workstation.repzo.com/docs/commerce/gift-cards). ## Related pages - [Contacts](https://workstation.repzo.com/docs/sales/contacts) - [Gift Cards](https://workstation.repzo.com/docs/commerce/gift-cards) - [Orders](https://workstation.repzo.com/docs/commerce/orders) - [Subscriptions](https://workstation.repzo.com/docs/commerce/subscriptions) - [POS](https://workstation.repzo.com/docs/pos) - [Appointment Checkout](https://workstation.repzo.com/docs/engagement/appointment-checkout) - [Online Booking](https://workstation.repzo.com/docs/engagement/online-booking) - [Reviews](https://workstation.repzo.com/docs/engagement/reviews) - [Workflows](https://workstation.repzo.com/docs/administration/workflows) --- # Appointment Reviews > Request, monitor, reply to, and moderate client reviews after appointment checkout. Reviews collects client ratings after a completed appointment sale. Each review belongs to an Appointment and can include a one-to-five-star rating and written comment. Open **Reviews** from the Operations section of the sidebar. ## Setting up review requests The Reviews page can provision a **Thank you for visiting** automation. 1. Open **Reviews**. 2. Select **Preview email** to check the message in English or Arabic. 3. Select **Set up now**. 4. Workstation creates an active workflow with: - Trigger: Appointment checked out - Action: Send review request 5. Review or customize the workflow in the automation editor. Creating the automation requires Workflow create permission. Once it exists, the Reviews page shows that the **Thank you for visiting** automation is on, with **Preview email** and **Manage automation**. Managing it requires the matching Workflow permissions. The setup action is idempotent: if the workspace already has the review workflow, Workstation reuses it instead of creating a duplicate. ## Email language and branding The review email uses the **Email language** set under **Settings → Appointments → Online booking**. That field appears once **Your booking page** is turned on. The Reviews preview can switch between English and Arabic without changing the saved setting. The real email uses the client, appointment, location, and workspace branding. When there are no appointments yet, the preview uses sample visit data. ## Client review flow After checkout, the workflow emails a secure review link. The client opens a public page, taps a star rating, can add an optional comment (up to 2,000 characters), and selects **Submit review**. Each appointment can have one review. The client can come back to the same link and **Update review** for 30 days. The link doesn't accept reviews for cancelled visits or visits that are not completed yet. A review is connected to the original Appointment so staff can return to the booking from the review card, which also shows the location. When [Client Loyalty](https://workstation.repzo.com/docs/operations/client-loyalty) is on, the **Leave a review** earning rule can award points for the first review of each appointment. Reviews are kept inside the workspace; they are not shown on the public booking page. ## Review summary The Reviews page shows: - Average rating - A rating label: Excellent, Great, Good, Okay, or Poor - Total review count - Rating distribution from one to five stars The summary counts published reviews only. Use filters to narrow the list by: - **Rating** - **Reply status** — Replied or Not replied - **Visibility** — Published or Hidden ## Replying Select **Reply** on a review, write the business response, and select **Save reply**. Use **Edit reply** to change it; saving an empty reply clears it. Keep the reply specific to the client's visit. Operational follow-up that should remain private belongs on the Contact, Appointment, Ticket, or internal Comments instead. ## Moderation The review menu supports: - **Hide review** to keep it in the workspace but mark it hidden - **Publish review** to restore a hidden review - **Delete** to remove the review Delete takes effect straight away, without a confirmation step. Hiding is preferable when the team may need the history later. ## Troubleshooting If review requests are not being sent: 1. Confirm the Thank you for visiting automation exists and is active. 2. Confirm the appointment was checked out, not only marked Completed. 3. Confirm the appointment has a client email address. 4. Preview the email to verify workspace branding and language. 5. Review the workflow execution history for errors. ## Related documentation - [Appointments](https://workstation.repzo.com/docs/engagement/appointments) - [Appointment Checkout](https://workstation.repzo.com/docs/engagement/appointment-checkout) - [Online Booking](https://workstation.repzo.com/docs/engagement/online-booking) - [Client Loyalty](https://workstation.repzo.com/docs/operations/client-loyalty) - [Workflows](https://workstation.repzo.com/docs/administration/workflows) - [Contacts](https://workstation.repzo.com/docs/sales/contacts) --- # Requests > Build internal request forms, submit and track requests, print them as PDFs, and route matching records through approvals. Requests provide structured internal intake for work such as leave, expenses, assets, IT support, travel, or document requests. Administrators define the form once, while team members submit and track individual requests. ## Work with requests Open **Requests** from the Operations section. The page has these standard tabs: | Tab | Purpose | |---|---| | **All requests** | All requests the current user is allowed to see | | **My requests** | Requests submitted by the current user | | **Pending my approval** | Requests waiting for the current user's decision, with a count badge | Use the **New Request** button to choose from active request types. The list can be filtered by status, request type, submitter, and create date. Each row shows the title and reference, type, status, submitter, and recent dates. ## Submit a request 1. Select **New Request**. 2. Choose an active request type. 3. Optionally enter a title, then complete the form. Without a title, the request is listed as **Request #** plus its reference. 4. Add files, linked records, signatures, or other values requested by the form. 5. Select **Submit Request**, or **Save Draft** when the request type permits drafts. A submitted request receives a reference number. If an active approval workflow matches it, the request becomes **Pending Approval**. If no workflow matches, Workstation approves it automatically. Required signature behavior depends on approval routing. Without a workflow, the submitter signs the required field. With a workflow, the approver signs during the approval step. ## Request statuses | Status | Meaning | |---|---| | **Draft** | Saved but not submitted | | **Submitted** | Entered the submission process | | **Pending Approval** | Waiting at an approval step | | **Approved** | Completed all required approval steps, or no workflow matched | | **Rejected** | Rejected by an approver | | **Cancelled** | Cancelled before completion | | **Completed** | Fulfillment is finished | Open a request to review it. The record has **Request Details** and **Comments** tabs, plus an **Approval Cycle** panel that shows each step and lets the current approver approve or reject with a reason. Switch between **Values submitted in this request** and **All form fields** to see either only the answered fields or the whole form. The submitter can edit a draft. During an active approval, editing is available only when the current approval step permits it and the signed-in user is the submitter or current approver. Completed and cancelled requests are read-only. ## Configure request types Open **Settings → Request Types** and select **New Request Type**. The list can be filtered to **All**, **Active**, **Draft**, or **Archived** types. Only active types are offered from the New Request dialog. The request type wizard has three steps: 1. **Basic Info** — set the name, description, color, **Allow Drafts**, and **Notify on Submit**. 2. **Form Builder** — add, arrange, and configure sections and fields. 3. **Review** — preview the form, save it as a draft, or activate it. After creation, a request type record provides **Overview**, **Form**, and **Templates** tabs. You can edit, preview, activate, archive, or delete it as permitted. ### Form fields The builder supports: | Group | Field types | |---|---| | **Text and contact** | Short Text, Long Text, URL, Phone, Email | | **Numbers and choices** | Number, Currency, Dropdown, Multi-Select, Yes/No | | **Dates and references** | Date, Date Range, User, Entity | | **Files and approval** | File Upload, Signature, Hidden | | **Content** | Paragraph, for rich-text instructions shown on the form | An Entity field links the request to an Account, Contact, Deal, or Project. Sections group fields. A section can use a 1, 2, or 3 column layout and can be **Collapsible** or **Start Collapsed**. Fields can define labels, descriptions, placeholders, required behavior, defaults, select options, minimum and maximum values, length and pattern validation, and other type-specific settings such as a signature's pen color. ### Conditional visibility Use **Conditional visibility** to show or hide a field based on other answers. Choose **Show** or **Hide**, then whether **All match** or **Any match**, and add conditions such as “is equal to” or “is empty.” For example, show a “Return flight date” field only when “Trip type” is “Round trip.” ### Start from a template Workstation includes ten system templates: - Annual Leave Request - Sick Leave Request - Asset Request - Expense Reimbursement - IT Support Request - New Employee Onboarding - Training Request - Facility Request - Travel Request - Document Request Starting from a template copies its form into the wizard. Choose **Start from Scratch** to build an empty form instead. Review every field before activation so the form matches the organization's policy. ## Print and download requests When a print template exists for requests, the request record shows a **Print template** selector, **Preview**, and **Download PDF**. The PDF follows the form's sections and columns. Design request templates in **Settings → Print Templates** on the **Requests** tab. Users with the **Edit Document** permission can select **Customize document** to change the wording of one request's PDF without changing the template. A customized request shows a **Customized** badge, and the button changes to **Edit document**. Users without that permission only see the badge. ## Approval routing Request approvals are configured separately in **Settings → Approvals**: 1. Create a workflow for the **Requests** module. 2. Add optional conditions, such as request type, status, submitter, or department. 3. Add the approver steps in order. 4. Select the specific users who can approve each step. 5. Decide whether a step can edit the request and whether approvers receive email notifications. 6. Activate and order the workflow. On submission, Workstation selects the first active workflow whose conditions match. Approval steps run sequentially. See [Approvals](https://workstation.repzo.com/docs/operations/approvals) for the reviewer and submitter experience. ## Visibility and permissions Request visibility is based on the submitter and the workspace's data-visibility scope. Approvers also receive the records that require their action. Request permissions cover view, create, update, delete, and edit document. Approving is controlled by the Approvals permission, and request types have their own view, create, update, delete, and activate permissions. ## Related pages - [Approvals](https://workstation.repzo.com/docs/operations/approvals) - [Properties](https://workstation.repzo.com/docs/administration/properties) - [Workflows](https://workstation.repzo.com/docs/administration/workflows) - [Notifications](https://workstation.repzo.com/docs/administration/notifications) --- # Drive > Upload, organize, preview, share, and recover workspace files. Drive is the workspace file manager. Use it for files that should be easy to find across the organization, and use a record's attachment area when a file only makes sense beside that record. ## Drive sections The left navigation separates files by how they are used: | Section | Contents | |---|---| | **My Drive** | Your folders and files | | **Shared with me** | Content shared directly or through a department | | **Recent** | Recently used files | | **Starred** | Files and folders you marked for quick access | | **Trash** | Deleted content that can be restored or permanently removed | **Linked Files** gathers attachments from Deals, Activities, Tickets, Projects, Accounts, Contacts, and Price Offers. Opening a linked file shows a preview with a **Source** link back to the record it belongs to. ## Organize and find content Use **New → New folder** in My Drive to create a folder, optionally with a color, and use breadcrumbs to move through folders. Keep folder trees shallow and names predictable so other users can find content later. Drive supports grid and list layouts. You can change the grid density, sort by **Last modified**, **Newest first**, **Name A→Z**, **Name Z→A**, or **Largest first**, and use **Search Drive** to find a file or folder by name. Select several items to act on them together, for example to move them all to Trash. ## Upload and preview files Select **New → Upload file**, or drag files onto the page, to add them to the current folder. Uploads go into **My Drive**; switch to it first if you are in another section. Upload progress stays visible while you keep working, and an upload in progress can be cancelled. Images, video, and audio can be previewed in Drive, and images open in a zoomable viewer. PDFs and other documents can be opened in a new tab or downloaded. Use **File information** to see a file's details. Files and folders can be renamed, starred, shared, or moved to Trash. In Trash, use **Restore** to recover an item or **Delete forever** to remove it permanently. Items in Trash are deleted forever automatically after 30 days. ## Sharing Folders can be private, shared with selected people or departments, or shared with **Anyone in your org**. Folder visibility is inherited by its contents. Files and folders can be shared with: - a workspace user - a department, from the **Team** tab - an external email address, from the **Email** tab Choose **Viewer** for people who only need to open or download content. Folders can also be shared as **Editor** when a collaborator should manage the folder's contents; files are always shared view-only. External invitees receive an email with a secure link that opens the shared folder or file without a workspace account. Review sharing at the folder level before sharing every file separately. A well-chosen shared root is easier to maintain. ## Drive or record attachments? Use Drive for reusable or organization-wide material such as policies, templates, brand assets, and shared delivery folders. Use record attachments for evidence or context that belongs to one [Project](https://workstation.repzo.com/docs/operations/projects), [Ticket](https://workstation.repzo.com/docs/operations/tickets), [Account](https://workstation.repzo.com/docs/sales/accounts), or [Price Offer](https://workstation.repzo.com/docs/sales/price-offers). Linked Files lets users find those record attachments from Drive without duplicating them. ## Permissions Drive has separate permissions for viewing, creating, updating, deleting, and sharing content. A shared link does not replace the workspace permissions required for internal management actions. ## Related pages - [Projects](https://workstation.repzo.com/docs/operations/projects) - [Tickets](https://workstation.repzo.com/docs/operations/tickets) - [Accounts](https://workstation.repzo.com/docs/sales/accounts) - [Content Hub](https://workstation.repzo.com/docs/knowledge/content-hub) --- # Inbox > Connect customer channels and manage shared conversations, assignment, rules, macros, social comments, and AI agents. Inbox is the shared workspace for customer conversations. It brings email, website and app chat, WhatsApp, Facebook Messenger, Instagram, Telegram, and phone calls into queues that sales, support, and success teams work together. For internal team conversations, use [Chat](https://workstation.repzo.com/docs/operations/chat) instead. ## Inboxes, channels, and conversations An **inbox** is a queue with members and assignment rules. A **channel** is a connected customer endpoint, such as a WhatsApp number or a Gmail address, that delivers messages into an inbox. A **conversation** is one customer thread. Conversations hold status, priority, assignee, inbox, tags, participants, messages, internal notes, and links to CRM records. ## Work the queue 1. Open **Inbox** from the Operations section. 2. Pick **All Inboxes** or one inbox from the switcher. 3. Choose a view, then open a conversation. 4. Assign it, reply to the customer, or add an internal note. 5. Add tags and link the right Contact, Deal, Account, or Ticket. 6. **Close** the conversation, or snooze it until it needs attention again. ### Views | View | Shows | |---|---| | **Assigned to me** | Conversations you own | | **Mentions** | Conversations where a teammate @mentioned you in a note | | **Unassigned** | Conversations waiting for an owner | | **AI handoffs** | Conversations an AI agent passed to a person | | **All** | Everything you can see | | **Email**, **Chat**, **WhatsApp**, **Messenger**, **Instagram**, **Telegram**, **Calls** | One channel type (shown only when that channel is connected) | | **All closed**, **Sent**, **Spam**, **Trash** | Closed conversations, conversations waiting on the customer, and filtered mail | Search with **Search conversations**, and sort by **Date started**, **Last activity**, **Waiting since**, **Next SLA**, **Priority**, or **Snoozed until**. Your sort choice is remembered. The list header can also start a **New WhatsApp conversation** from an approved template, open **Test an agent**, and **Sync emails now** when an email channel is connected. ## Reply, note, or instruct the AI The composer has three modes: | Mode | Who sees it | |---|---| | **Reply** | The customer, on their channel | | **Note** | Teammates only. Type `@` to mention someone; mentioned teammates are added to the conversation and see it under **Mentions**. | | **Instruct AI** | Only the AI agent working the conversation. See [AI in the inbox](#ai-in-the-inbox). | Replies support attachments, emoji, voice messages, and macros (**Use macro**). Email replies have **Cc Bcc**. On WhatsApp, Messenger, and Instagram you can hover a message and select **Reply** to quote it, or **React** with an emoji. When the WhatsApp 24-hour service window has closed, the text box is disabled and you send an approved message with **Send Template** instead. **Refine** rewrites your draft — **Make shorter**, **Make friendlier**, **Make more formal**, or **Translate to** another language — when the AI assistant is included in your plan. Press ⌘/Ctrl+Enter to send. Messages show delivery state (**Sending**, **Sent**, **Delivered**, **Seen**, **Failed**). Customer edits show an **(edited)** marker, and customer reactions appear as chips on the message. On website and app chat you can delete a message you sent; the visitor sees that it was deleted. ## Status, assignment, and snooze A conversation is **Open**, **Pending**, **Snoozed**, **Resolved**, or **Closed**. Use **Close** and **Reopen** in the header, or the **Status** field in Details for **Pending** and **Resolved**. A customer reply reopens a snoozed, resolved, or closed conversation. Snooze presets are **Later today**, **Tomorrow**, **Monday**, **One week**, **One month**, and **Custom**. You can also type a duration such as `1 hour` or `2 days`. Assign a conversation from Details: **Assign to You**, a teammate, or **Unassigned**. Only inbox members who have Inbox in their plan can be assigned. ## Configure inboxes Open **Settings → Inbox → Inboxes** and select an inbox. Its page has three tabs. **Access** — who works the inbox: **Available to everyone**, **Select departments**, or **Select users**. **Assignment** — how new conversations get an owner: - **Nobody** — the team picks it up from the queue - **Always this person** - **Round robin** — take turns across whoever is available - **Least busy** — whoever has the fewest open conversations You can also assign to the teammate who replies first, cap **Maximum open conversations per person**, limit assignment to business hours, and choose what happens **When nobody is available** (**Leave it in the queue** or **Assign it anyway**). A separate block controls **When the AI hands over to a human**: route like a new conversation, to someone specific, or to a department, optionally raising priority and sending repeat handoffs back to the same person. **Settings** — **Auto Close (days)**, customer **Conversation ratings** (CSAT) with reasons for a bad rating, and filters that automatically mark email as spam. ## Connect channels Open **Settings → Inbox → Channels** and select **Connect a channel**. | Channel | Setup | |---|---| | **Team email** | Connect a Gmail or Microsoft Outlook mailbox | | **Messenger** | The chat widget for your website and mobile apps | | **WhatsApp** | Connect a WhatsApp Business number | | **Facebook Messenger** | Connect a Facebook Page for private messages and public comments | | **Instagram** | Connect an Instagram Business or Creator account for DMs and comments | | **Telegram** | Connect a bot token | | **Phone Calls** | Connect or buy a phone number — see [Calls](https://workstation.repzo.com/docs/operations/calls) | From the channel list you can move a channel to another inbox, or disconnect it. WhatsApp channels also have **Manage templates** for message templates and **Manage Flows** for interactive WhatsApp Flows forms. The website chat widget has its own settings for appearance, mobile SDKs, outbound messages, installation, and security. ### Connect WhatsApp WhatsApp offers two ways to connect: - **Keep using the WhatsApp Business app** — the phone app and Workstation share the number. Messages you send from the phone also appear in Workstation. The number must be on a recent app version and active for at least 7 days. - **Move the number to the Cloud API** — Workstation takes over the number completely. ### Connect Telegram Telegram uses a bot created through the verified [@BotFather](https://t.me/BotFather) account: 1. Send `/newbot` to BotFather. 2. Enter a display name and a unique username ending in `bot`. 3. Copy the complete API token. 4. In Workstation, select **Settings → Inbox → Channels → Connect a channel → Telegram**. 5. Paste the token, choose the inbox, and connect the channel. 6. Open the bot in Telegram and send `/start` to test it. Treat the token like a password. If it is exposed, use BotFather's `/revoke` command and reconnect with the replacement token. A Telegram bot cannot start a private conversation. The customer must message the bot first. Telegram does not use WhatsApp templates or the WhatsApp service window. ## Social comments Public comments on your Facebook and Instagram posts and ads arrive through the connected Facebook Messenger and Instagram channels. The conversation shows the post, an **Ad** badge when it came from an ad, and the comment threads. For each comment you can **Reply** publicly, **Reply privately** with a direct message (valid for 7 days after the comment), or **Hide**, **Unhide**, or **Delete** it. ## Inbox Rules Rules handle common messages and comments automatically. Create them in **Settings → Inbox → Rules**, from scratch or from a template: - **Comment keyword → auto-DM the link** - **Reply menu (1 / 2 / 3 / 4)** - **Opt-out on STOP / إيقاف** - **Hide comments with banned words** A rule starts when **A new message is received** or **A new comment is received**, on the channels you pick. Conditions include **Contains keywords** (match any or all), **Is exactly**, **Contains a link**, **Contains only emojis**, and **Contains only mentions**. Actions: - **Send a reply** — for comments, sent as a private DM to the commenter - **Hide / delete comment** - **Add an inbox tag** - **Opt the contact out** — on this channel only, or on all channels - **Reply menu** — numbered options, each with its own reply or opt-out, plus a fallback reply Turn each rule on or off with its switch. Rules run on the [Workflows](https://workstation.repzo.com/docs/administration/workflows) engine; select **Open in workflow builder** to edit one. Keep conditions narrow so a broad auto-reply or moderation action doesn't catch legitimate messages. ## Macros Macros are saved replies with optional one-click actions. A macro can include attachments, **Set status**, **Add tag**, and **Assign** or unassign. Each macro has **Available for** (**Everyone** or **A specific inbox**) and **Available when** (**Replying** or **Adding notes**). Organize macros in folders, duplicate useful ones, and **Export** the library as JSON. Configure them in **Settings → Inbox → Macros**; owners and admins can create and edit macros. [Tickets](https://workstation.repzo.com/docs/operations/tickets) share the same macro library (also reachable from **Settings → Tickets → Macros**). On a ticket, a macro inserts only its text — its actions and attachments apply in the inbox only. ## Customer context and tickets Every person who writes in gets a Contact automatically. Workstation matches an existing Contact by email, then phone, and creates one when there is no match. Anonymous website visitors become Contacts once they share a name, email, or phone. The contact record's **Conversations** tab lists that person's conversations. Open **Details** to see and change the conversation: - **Assignee**, **Priority**, **Status**, and the AI agent's state - SLA timers such as **First reply due** - **Links** to a **Ticket**, **Deal**, or **Account** - the **Contact**, with **Contact notes**, **Recent conversations**, and **Recent orders** (**Create order**) - **Tags**, **Conversation attributes**, and **Suggested CRM updates** the AI noticed in the conversation - **From ad** or **From post** when the customer came from an ad You can drag Details sections into the order you prefer. When a Contact with a pipeline is linked, the header shows a stage picker (**Set contact stage**). To open a formal service record, select **Links → Ticket → Create ticket**. Turn on **Include conversation thread** to copy the messages into the new [Ticket](https://workstation.repzo.com/docs/operations/tickets). ## AI in the inbox An [AI agent](https://workstation.repzo.com/docs/operations/ai-agents) can be deployed to an inbox to suggest replies or answer customers on its own. - When the agent is answering, a banner says so. Select **Take over** to pause it and reply yourself, then **Resume AI** to hand back. - In suggest mode, an **AI suggested reply** card appears above the composer. Select **Use** to insert it. - **Instruct AI** sends the agent a private instruction, such as "offer the 10% discount". Use **Send & resume AI** to resume it in the same step. - When the agent hands a conversation to a person, it appears under **AI handoffs** with an **AI brief** in Details explaining why and suggesting the next step. - Rate any AI message with **Good reply** or **Bad reply**, and give a reason for bad ones. Ratings feed the agent's **Feedback** view. - **More actions → Improve the AI agent** analyzes what went wrong in this conversation and proposes knowledge or playbook changes you can apply. - **More actions → Show AI costs** shows what the conversation's AI work cost from your [AI balance](https://workstation.repzo.com/docs/commerce/ai-balance). ## Visibility and permissions You see a conversation when you are its assignee or owner, a participant (including by @mention), or a member of its inbox, within your workspace visibility rules. | Permission group | Actions | |---|---| | `inbox_conversations` | view, create, update, assign, close | | `inbox_messages` | view, reply, note | | `inboxes` | view, create, update, delete | | `inbox_channel_accounts` | view, create, update, delete | | `inbox_rules` | view, create, update, delete | Inbox requires the **Inbox & Calls** add-on. See [Plans & Add-ons](https://workstation.repzo.com/docs/commerce/plans-and-add-ons). ## Related pages - [Calls](https://workstation.repzo.com/docs/operations/calls) - [AI Agents](https://workstation.repzo.com/docs/operations/ai-agents) - [Tickets](https://workstation.repzo.com/docs/operations/tickets) - [Contacts](https://workstation.repzo.com/docs/sales/contacts) - [Chat](https://workstation.repzo.com/docs/operations/chat) - [Workflows](https://workstation.repzo.com/docs/administration/workflows) --- # Calls > Make and receive phone calls in the browser, route callers with call flows, let AI agents answer or dial, and review every call with recordings and summaries. Calls brings phone calls into Workstation. You connect or buy a phone number, and calls ring teammates in the browser. Missed calls, voicemails, recordings, and AI summaries land in [Inbox](https://workstation.repzo.com/docs/operations/inbox) as conversations, and the **Calls** page keeps the full call history. Calls is part of the **Inbox & Calls** add-on. Call minutes, numbers, and recordings are paid from your [AI balance](https://workstation.repzo.com/docs/commerce/ai-balance). ## Set up calling 1. [Connect a phone number](#connect-a-number). 2. Give teammates calling access and extensions in **Settings → Inbox → Calls**. 3. Adjust the number's ring, voicemail, recording, and business-hours settings. 4. Optionally edit the number's [call flow](#call-flows) to add a phone menu, extensions, or an AI agent. 5. Check your microphone and speaker in **Settings → Your Account → Audio settings**. ### Connect a number Open **Settings → Inbox → Channels → Connect a channel → Phone Calls**. 1. Choose a **Country**. 2. Under **Numbers assigned to you**, select **Connect** on a number already assigned to your workspace, or select **Select number** to buy one. You can search **By city**, **By area code**, or **Toll-free**. 3. Choose the inbox the number's conversations go to. 4. Confirm with **Add number**. A bought number renews monthly until you release it. You can turn on **Record answered calls** here. Some numbers need regulatory verification and can't be bought from this screen yet. ### Number settings Open the number from the channel list, or from **Settings → Inbox → Calls → Numbers**. | Section | What you set | |---|---| | **Ring & voicemail** | Channel name, extra numbers to ring, **Ring timeout (seconds)**, voice language, and the **Voicemail greeting** | | **Call recording** | On or off, and **Delete recordings after** 30 days, 90 days, 180 days, or 1 year | | **Business hours** | Time zone and opening hours. Outside these hours, calls skip the team and go straight to voicemail | | **Missed-call WhatsApp follow-up** | An approved WhatsApp template sent automatically after a missed call | | **Outbound calling** | The countries you allow outbound calls to. Outbound calling stays off until you add at least one | Recording calls may require the caller's consent where you operate. That responsibility is yours. ## Teammates and extensions **Settings → Inbox → Calls** has three tabs: - **Extensions** — turn **Calling access** on for each member and give them a 2–6 digit **Extension**. **Auto-assign all** numbers everyone in one step. - **Numbers** — every call number, with links to its settings, plus **Connect a number**. - **General** — your voice account status and outbound calling reach. A teammate needs calling access to place and receive calls in the browser. In **Settings → Team**, open a member to set the numbers they may call from and their **Default calling number**. ## Make and receive calls **Place a call** from: - the **Dialer** (keypad icon in the header), with **Keypad**, **Contacts**, **Team**, and **Recents** tabs. The keypad can dial a phone number or a teammate's extension. - the phone button on a contact record or an inbox conversation. Choose the number to call from in **Call from**. The phone button's menu also offers **Call with AI agent…**, which has an AI agent place the call for you; you give it the reason for the call and see a cost estimate before you **Start call**. **Incoming calls** show a card with the caller's number, the matched contact, and **Accept** or **Decline**. During a call you can mute, hang up, and open call details to check connection quality and switch microphone or speaker. ## Call flows A call flow decides what happens when someone calls a number. Open a number's settings and select **Call flow**. New numbers start with a **Default** flow that rings the team and then goes to voicemail. You can build other flows and choose which one is **Live**. Edits stay as **Unpublished changes** until you **Publish**. Flows are built from steps: | Step | What it does | |---|---| | **Ring users** | Ring teammates in the browser, plus any extra phone numbers | | **Voicemail** | Record a message after a greeting | | **Play message** | Speak a message to the caller | | **Forward call** | Send the call to another phone number | | **Phone menu** | "Press 1 for sales, 2 for support…" | | **Dial by extension** | Let the caller type a teammate's extension | | **Business hours** | Branch on whether the number is open or closed | | **Go to** | Continue at another step | | **AI agent** | Let one of your AI agents handle the call | Steps branch on results such as **If call is missed**, **Open** or **Closed**, or the digit pressed. The **Outbound AI calls** tab holds the flow for calls an AI agent places. It can check for an answering machine first and hang up or leave a message. ### AI on calls The **AI agent** step hands the call to one of your [AI agents](https://workstation.repzo.com/docs/operations/ai-agents) that supports calling. Choose the agent, then set a **Maximum call length**. On outbound flows you also set the **Purpose of the call**, which the agent says right after introducing itself. Everything else comes from the agent: its language, voice, welcome message, speaking style, and call functions such as transferring the caller to a teammate. The step shows a short summary of these settings and an **Open agent settings** link. Change them on the agent and publish it; every call flow that uses the agent picks up the change. The agent must have a published calling model and voice before you can publish the flow. If an AI step has no agent, the call continues on its **Fallback** branch. ## Call history The **Calls** page lists every inbound and outbound call: | Column | Shows | |---|---| | **Call** | Direction and number; missed calls are marked | | **Contact** | The matched contact, opened in a side panel | | **Team member** | Who handled it, or **AI agent** | | **Status** | Ringing, In Progress, Completed, Missed, No Answer, Voicemail, Busy, Failed, or Canceled | | **Outcome** and **Sentiment** | The AI's classification of the call | | **Recording** | Play the recording or voicemail | **From**, **To**, and **AI summary** columns can be added from the column picker. Use **Search calls** to find a call. While an AI agent is on a call, teammates with listen permission can select **Listen live** to hear it without being heard. Each call also appears as a card in the Inbox conversation, with the recording, AI summary, any extracted details, and the transcript. The contact record's **Calls** tab lists calls with that person. Calls don't create CRM activities; log one manually in [Activities](https://workstation.repzo.com/docs/engagement/activities) if you need it on the timeline. ## Outbound campaigns **Settings → Inbox → Outbound Campaigns** dials a list of numbers with an AI agent. 1. Select **New campaign** and set the name, **Calling line**, optional AI agent, and the objective. 2. Set **Concurrency** (calls at once), **Max attempts**, and the retry delay. 3. Open the campaign and paste numbers, one per line in international format. 4. Start, pause, or resume the campaign and follow each number's status. Numbers on your do-not-call list, contacts marked **Do Not Call**, opted-out contacts, and countries you don't allow are skipped automatically. ## Test and measure - **Settings → Inbox → Agent Testing** simulates callers against your AI agent before it goes live. Each scenario has a caller persona, goal, and a rubric of what a good call must do. A test run scores the call out of 100 with a transcript. Test runs never create real records. - **Settings → Inbox → Voice Analytics** shows call volume, answer rate, AI-handled calls, talk time, cost, response latency, sentiment, and outcomes for the last 7, 30, or 90 days. ## Permissions | Permission | Allows | |---|---| | `voice_calls.view` | Open the Calls page and Voice Analytics | | `voice_calls.call` | Place and receive calls | | `voice_calls.listen` | **Listen live** to AI calls | | `voice_calls.settings` | Manage numbers, call flows, extensions, campaigns, and agent tests | Sandbox workspaces can't connect numbers or place calls. ## Related pages - [Inbox](https://workstation.repzo.com/docs/operations/inbox) - [AI Agents](https://workstation.repzo.com/docs/operations/ai-agents) - [AI Balance & Packs](https://workstation.repzo.com/docs/commerce/ai-balance) - [Plans & Add-ons](https://workstation.repzo.com/docs/commerce/plans-and-add-ons) - [Contacts](https://workstation.repzo.com/docs/sales/contacts) --- # AI Agents > Build AI agents that answer customers in Inbox, work tickets, take phone calls, and help teammates in Chat. An AI agent answers customers for your team. You write how it should behave in a **playbook**, give it **knowledge** to answer from, choose the **functions** it may run (such as booking an appointment or creating a ticket), and deploy it to Inbox channels, Tickets, phone lines, or Chat. Agents live in **Settings → AI → AI Agents**. AI work is paid from your [AI balance](https://workstation.repzo.com/docs/commerce/ai-balance). ## Fox and your agents **Fox** is Workstation's built-in AI assistant. It appears in the agent list with a **System** badge. You don't build Fox; its page only controls which tools it may use, which actions need approval, and shows its activity. Fox is always available to teammates in [Chat](https://workstation.repzo.com/docs/operations/chat) and acts with the permissions of the teammate who asks. Every other agent is one you build. ## Create an agent 1. Open **Settings → AI → AI Agents** and select **New agent**. 2. Choose where it works: **Chat**, **Calling**, or **Chat & calling**. 3. Start from scratch or a template, such as **Receptionist**, **Customer Support**, **Lead Qualification**, **Appointment Booking**, **Shopping & Orders**, **Order Status**, **Lead Follow-up**, or **Appointment Reminder**. 4. Give it a name and pick Content Hub articles it can answer from. 5. Optionally connect it to inbox channels now, then select **Create agent**. **Quick** setup asks only for the essentials. **Advanced** setup adds identity, tone, language, and fallback behavior. You can also type a request in the **Ask Fox to build or change an agent** bar and let Fox draft it. ## The agent editor Opening an agent shows its editor. The playbook is on the left, and settings are grouped on the right. ### Playbook The playbook is one document that tells the agent how to behave: who it is, its tone, working hours, what to ask for, guardrails, and when to hand off. Use **Add section** for ready-made sections in English or Arabic, such as **Human handoff**, **Book an appointment**, or **Lead capture**. The toolbar inserts building blocks into the text: - **Insert variable** — a value such as the customer's name - **Hand off to a teammate** - **Apply a tag** - **Collect customer details** - **Insert function** — run one of the agent's functions - **Send a saved reply** — a fixed [macro](https://workstation.repzo.com/docs/operations/inbox#macros), or **Best match** - **Insert flow** — a multi-step procedure the agent follows exactly Keep facts such as prices and policies in **Knowledge**, not the playbook. Long playbooks dilute the agent's attention; the editor warns you as you approach the limit. **Generate from conversations** writes or improves the playbook from how your team actually handles conversations. Choose **Quick** (a few dozen conversations, about 30 seconds) or **Deep** (up to a few hundred, runs in the background), a period, and channels. The first run drafts a playbook; later runs suggest additions, replacements, and contradictions between the playbook and what the team really does. Nothing is saved until you review and save it. The estimated cost is shown before you start. ### Knowledge Knowledge is the set of facts the agent answers from. Select **Add content** and choose: - **Article** — from [Content Hub](https://workstation.repzo.com/docs/knowledge/content-hub) - **Uploaded file** — PDF, DOCX, TXT, MD, CSV, or JSON, up to 20 at a time - **Website sync** — crawl your website, with page limits and pages to include or exclude Each source shows its status (for example **Syncing**, **Indexing**, **Ready**, or **Failed**). Website sources can resync automatically daily, weekly, or monthly. Knowledge changes take effect immediately. ### Model, functions, and behavior | Section | What you set | |---|---| | **Model** / **Models & voice** | Chat model, calling model, voice, and language | | **Functions** | Actions the agent can run, such as creating or updating a contact, booking an appointment, creating an order or ticket, sending a WhatsApp template, or managing tags. Calling agents also get call functions such as **End Call** and **Call Transfer**. | | **Chat Settings** | Let the agent end a chat, and an inactivity timeout | | **Speech Settings** | Calling only: interruption sensitivity, response wait time, background sound, and pronunciation | | **Post-Chat Extraction** / **Post-Call Extraction** | Details to pull out after each conversation, such as a summary or sentiment | | **Behavior & guardrails** | Default phone country, external tool connectors, who owns records the agent creates, voice-message transcription, image analysis, and WhatsApp template fallback | | **Handoff to a person** | Extra handoff rules, the message the customer gets, who receives the conversation, whether the agent keeps helping until a teammate replies, and a case summary for the teammate | | **Deployment** | Where the agent works. See below. | The **Workflow** view shows the order of steps around each conversation: functions that run before, knowledge, extraction, and functions that run after. ## Test and publish Select **Test** to chat with the saved draft, or talk to it with your microphone. **Test in inbox** starts a test conversation in Inbox, where you write as the customer and choose **Simulate actions** or **Run real actions**. Until you publish a version, every save goes live (**Auto-publish**). After the first **Publish**, edits wait as **Unpublished changes** while customers keep using the published version. The versions panel lets you view old versions and create a draft from one. Knowledge and deployments always apply immediately. The header switch sets the agent **Live** or **Paused**. ## Deploy an agent In **Deployment**, select **Add a deployment** and choose a target: - **Inbox channel** — chat, email, WhatsApp, and social channels - **Tickets** — helpdesk tickets For each deployment, choose **What it does**: | Mode | Behavior | |---|---| | **Suggest a reply** | Teammates see a suggested reply to use or ignore | | **Auto-reply** | The agent answers customers itself (Inbox only) | | **Internal note** | The agent adds a note for the team | | **Action only** | The agent runs functions without replying | | **Triage only** | The agent classifies and routes | You can limit a deployment to selected channels and choose whether it handles direct messages, public Facebook and Instagram comments, or replies privately to comments. **Calling agents** are not deployed here. Add them to a phone number's call flow with the **AI agent** step. See [Calls](https://workstation.repzo.com/docs/operations/calls). ### Chat coworker The **Repzo Chat** card deploys the agent as a coworker in team [Chat](https://workstation.repzo.com/docs/operations/chat). Set its display name, whether teammates can message it directly, and which channels can @mention it. It acts with the permissions of the teammate who asks, and teammates approve its actions from cards in Chat. ## Working alongside the agent In [Inbox](https://workstation.repzo.com/docs/operations/inbox#ai-in-the-inbox), teammates can **Take over** a conversation from the agent, **Resume AI**, send it a private **Instruct AI** note, and rate its replies. Conversations it hands over appear under **AI handoffs** with a brief explaining why. ## Improve an agent The editor's **⋯** menu opens three views: - **Feedback** — replies teammates rated **Good reply** or **Bad reply**, grouped by what went wrong. **Improve agent** on a group proposes fixes. You can also turn rated replies into test sets, and review questions the agent couldn't resolve. - **Analyze** — run counts, answer and handoff rates, average cost, saved test cases, and evaluation datasets you can run and compare across versions. - **Activity** — recent runs with the reasoning behind each answer, tool calls, handoffs, a queue of actions waiting for **Approve** or **Reject**, and cost traces. From a single conversation, **More actions → Improve the AI agent** in Inbox analyzes what went wrong and suggests changes to knowledge, guidance, flows, or the playbook. Select **Apply** and then publish when ready. ## Permissions | Permission | Allows | |---|---| | `ai_agents.view` | See agents and their activity | | `ai_agents.create`, `ai_agents.update`, `ai_agents.delete` | Build and change agents | | `ai_agents.manage_knowledge` | Add and remove knowledge sources | | `ai_agents.deploy` | Deploy agents | | `ai_agents.approve` | Approve actions the agent asks to run | Owners and admins have all of these by default; managers can view. ## Related pages - [Inbox](https://workstation.repzo.com/docs/operations/inbox) - [Calls](https://workstation.repzo.com/docs/operations/calls) - [Chat](https://workstation.repzo.com/docs/operations/chat) - [Content Hub](https://workstation.repzo.com/docs/knowledge/content-hub) - [AI Balance & Packs](https://workstation.repzo.com/docs/commerce/ai-balance) --- # Chat > Use internal channels, direct messages and group direct messages with threads, rich messages, pods, AI coworkers, Fox cards, search, and notifications. Chat is for internal team communication. Use channels for shared topics, direct messages for one-to-one conversations, and [group direct messages](#group-direct-messages) for a quick conversation with a few people. Customer conversations belong in [Inbox](https://workstation.repzo.com/docs/operations/inbox), not Chat. ## Find your conversations Open **Chat** from the Operations section. **Home** greets you with your unread count, a **Catch up** shortcut, and your recent channels and direct messages. The sidebar lists channels and direct messages; direct messages can be shown as a flat list or grouped **By department**. Above the conversation lists: - **Activity** collects mentions, thread replies, reactions to your messages, and direct messages, with tabs for **All**, **DMs**, **Mentions**, **Threads**, and **Reactions**. Turn on **Unreads** to hide what you have already seen, or use **Mark all as read**. - **Saved items** lists messages you saved with **Save for later**. - **Scheduled** lists messages waiting to be sent. Unread counts, typing indicators, read receipts, and presence update as teammates work. Drafts are saved per user and conversation, and a conversation reopens at the message you left it on. The **Messaging** dock keeps recent direct messages open as small chat windows while you work elsewhere in Workstation. ## Channels Channels can be: - **Public** — anyone in the workspace can find and join - **Private** — invite only Create a channel with **New channel**, then give it a short name such as `support`, `sales`, or `project-acme`, plus an optional topic and description. Anyone can read a public channel, but must **Join** before posting. Each channel has two tabs: | Tab | Shows | |---|---| | **Messages** | The conversation | | **Files & links** | Everything shared in the channel, filterable by **Files**, **Media**, and **Links** | Open **Channel details** to see the topic, description, and members, edit the channel, or leave it. Authorized members can also archive or delete a channel. Pinned messages appear in the channel's **Pinned** list for everyone. Use **Jump to…** to move to last week, last month, the very beginning, or a specific date. ## Group direct messages A group direct message is a conversation with two to eight other people — up to nine people in all — without creating a channel. Use one for a quick back-and-forth, such as checking a quote with a sales rep and someone from finance. To start one on the web, select **New message**, pick each person in the **To** field, and select **Start conversation**. On the phone, select **New message**, then **New group**. Picking one person opens your direct message with them instead. A group is defined by its people: starting a conversation with the same people again opens the existing group rather than a new one, so its history stays in one place. Group direct messages work like direct messages: - They are listed under **Direct messages**, and every message notifies everyone in the group unless they muted it. - You can **Close conversation** to take a group out of your sidebar; it comes back when someone writes in it, joins, leaves, or renames it. - **Start pod** calls everyone in the group. Select the group's name at the top of the conversation to open its details, where you can: | Action | What happens | |---|---| | **Rename** | Gives the group a name everyone sees. Clear the name to go back to showing the members' names. | | **Add people** | Adds people to the same conversation, up to nine in all. They can read the earlier messages. | | **Leave conversation** | Removes you from the group. Anyone still in it can add you back. | Changes to the group appear in the conversation as short notes, such as "Lina added Omar". For a bigger or longer-lived group, [create a channel](#channels) instead. ## Write messages The composer supports: - bold, italic, underline, strike-through, lists, links, inline code, and code blocks - emoji, including custom **Team emoji** your workspace adds - @mentions of people, plus `@here`, `@channel`, and department mentions (Chat asks you to confirm before notifying a large group) - file attachments, with drawing on photos before sending - text snippets - voice messages and recorded video clips (camera, screen, or both) - polls in channels and group direct messages - **Rewrite** to have AI tidy a plain-text draft before you send it Use the arrow next to **Send** to schedule a message for later, such as **In 1 hour**, **Tomorrow morning**, or a custom time. When you write outside work hours, Chat can suggest sending at the next opening instead. If you are offline, messages wait in an outbox and send automatically when you reconnect. Polls can show who voted, allow multiple answers, let people add options, allow revoting, mark correct answers, close after a set duration, and hide results until they close. Polls are available in channels and group direct messages, but not in one-to-one direct messages or thread replies. ## Threads and message actions Reply in a thread when a discussion belongs to one message and should not interrupt the main channel. Depending on authorship and permissions, message actions include: - reacting with emoji - **Reply in thread** - **Save for later** - pinning to the channel or conversation - copying text or a link - **Forward** to other conversations - **Translate to** another language - editing and deleting your own messages - **Create** a **Task**, **Ticket**, **Contact**, or **Deal** from the message — the new record is linked back to the message Files shared in Chat get thumbnails and open in an in-app viewer, so teammates can read them without downloading. Previews cover PDFs, Word and PowerPoint files, spreadsheets and CSVs, Apple Pages, Numbers, and Keynote files, HEIC and TIFF photos, saved emails (`.eml`), Markdown, code, images, audio, and video. Long documents show a page strip, and **Find in file** searches the text. Archives and installers don't preview; download them instead. ## Pods A pod is a live audio or video call inside Chat. Select **Start pod** in a channel or direct message to start one. Teammates you call see a ringing prompt; others can join from the pod card posted in the conversation. In a pod you can mute, turn on video, share your screen, raise your hand, react, invite more people, and see who is in the call. The pod card shows who is in the call while it runs and when it ended. ## Fox, AI coworkers, and your Secretary Chat also hosts Workstation's AI helpers. Each appears as a bot in the sidebar. | Bot | What it does | |---|---| | **Fox** | The built-in AI coworker. Message Fox directly or @mention it in a channel to ask about or act on CRM data. Fox also sends you interactive cards — approvals, mentions, tickets, inbox conversations, invoices, low stock, and daily summaries — with buttons such as **Approve**, **Reject**, or **Reply** that act without leaving Chat. | | **AI coworkers** | AI agents an admin has deployed to Chat. They answer in the channels they are allowed in and, if enabled, in direct messages. See [AI Agents](https://workstation.repzo.com/docs/operations/ai-agents). | | **Secretary** | Your own private assistant. Select **Create your secretary** in the sidebar to set its name, picture, schedule, and what it watches. | Fox and AI coworkers act with the permissions of the teammate who asked. Actions that need approval show approval cards before anything changes. When anyone decides a card's request — in Chat, on the record's page, or through the API — every copy of the card updates, so nobody is left with buttons for something already handled. ### Secretary The Secretary sends a **Morning briefing**, an **End-of-day wrap-up**, and **Urgent nudges** between them. It can also prepare you before meetings, follow up after them, read your connected mailbox (opt-in), and take messages from teammates who @mention it. The Secretary runs on your own Claude Code or Codex subscription through the Repzo desktop app, so it does not use workspace AI credits. Only you can talk to it, and you can pause or remove it from its settings. ## Search Search covers messages, channels, and people, either across Chat or inside the current conversation. Filter by channel (**In**), author (**From**), **Date**, and **Has** (file, link, in thread), and sort by **Most relevant** or **Most recent**. You can also type filters such as `in:`, `from:`, `before:`, `after:`, `has:file`, `has:link`, and `is:thread`. Recent searches are kept for quick reuse. ## Notifications Each channel can notify you about: - **All new messages** - **Just mentions** — `@you` and `@channel` - nothing, by muting the channel Channels and direct messages can be muted for 30 minutes, 1 hour, 8 hours, 24 hours, or until you turn them back on. Under **This device**, choose whether to play a sound for mentions and direct messages. With web push or the Repzo desktop app, Chat shows native notifications and updates the app badge. ## Apps and bots Apps can post rich messages in Chat — cards, tables, charts, buttons and menus — and open forms when you click them. A bot's own conversation can also have a **Home** tab with a personal dashboard. Messages only you can see are marked **Only visible to you** and disappear when you reload. [Workflows](https://workstation.repzo.com/docs/administration/workflows) can also post to a channel or direct message with the **Send Chat Message** action. To build an app, see [Chat apps](https://workstation.repzo.com/docs/developers/chat-apps). ## Permissions Chat access is controlled by the `chat.view`, `chat.send`, `chat.create_channel`, and `chat.manage_channels` permissions. ## Related pages - [Inbox](https://workstation.repzo.com/docs/operations/inbox) - [AI Agents](https://workstation.repzo.com/docs/operations/ai-agents) - [Approvals](https://workstation.repzo.com/docs/operations/approvals) - [Chat apps](https://workstation.repzo.com/docs/developers/chat-apps) - [Team](https://workstation.repzo.com/docs/administration/team) - [Departments](https://workstation.repzo.com/docs/administration/departments) --- # Approvals > Configure and review sequential approval workflows for Requests and Price Offers. Approvals centralize decisions that must happen before a Request or Price Offer can continue. Reviewers see the items waiting for them, while submitters can track the workflow and its decision history. ## Supported records Approval workflows currently support: - [Requests](https://workstation.repzo.com/docs/operations/requests) - [Price Offers](https://workstation.repzo.com/docs/sales/price-offers) ## Review approvals Open **Approvals** from the Operations section. The page has two tabs: | Tab | Purpose | |---|---| | **Pending My Approval** | Records waiting at a step assigned to the current user | | **My Requests** | Approval requests submitted by the current user | A pending approval shows the module, workflow, current step, and submission date. Select **View Record** to review the source record, then select **Approve** or **Reject**. Add comments that explain the decision, especially when rejecting. **My Requests** shows the current status (**Pending**, **In Progress**, **Approved**, or **Rejected**), completed date, and approval history. Select **Resubmit** on a rejected item after the source record has been corrected; the workflow starts again from the first step. ### Decide from Chat Approvers also receive an approval card from Fox in [Chat](https://workstation.repzo.com/docs/operations/chat), with **Approve** and **Reject** buttons. A decision made in Chat, on the Approvals page, or through the API updates every approver's card, so nobody is left acting on a step that has already moved on. ## Configure a workflow Open **Settings → Approvals** (under Templates & Automation) and select the **Price Offers** or **Requests** tab. Select **Create Approval** to add a workflow. Each workflow defines: - name and description - module - optional matching conditions - active or inactive state - order relative to other workflows - one or more sequential approval steps Conditions can use module-specific fields and operators. For example, a Price Offer workflow can route by value or currency, while a Request workflow can route by request type, submitter, or department. Workstation evaluates active workflows from top to bottom and uses the first one whose conditions match. Drag workflows to change their order, and put narrow, high-priority rules before broad fallback rules. For example: 1. **High Value** — Total Amount greater than 10,000 → CEO approval 2. **International** — Contact Country not equal to Jordan → Regional Manager 3. **General** — no conditions (catch-all) → Team Lead A local offer of 2,000 skips the first two workflows and is caught by **General**. ## Configure approval steps Select **Add Step** to add a step. Each step has a name and one or more specific users under **Who Can Approve**. Two switches control the step: - **Can Edit Record** — approvers may edit the record before approving - **Email Notifications** — approvers are emailed when a record reaches the step Steps run sequentially: 1. The first step's approvers are notified. 2. An approval advances the request to the next step. 3. The final approval marks both the approval request and source record approved. 4. A rejection ends the current approval request and marks the source record rejected. The submitter is notified of the final decision, and the next approvers are notified as the workflow advances. ## Records without a matching workflow When a submitted Request or Price Offer does not match an active workflow, it is approved automatically and never appears in the Approvals queue. Settings shows a warning when a module has no catch-all workflow (one without conditions). To make sure every record is reviewed, add a catch-all workflow and place it last. Before activating a broad workflow, test one matching and one non-matching record so the fallback behavior is clear. ## Permissions `approvals.view` opens the Approvals page. `approvals.approve` allows deciding on approvals assigned to you and creating or editing workflows in Settings. ## Related pages - [Requests](https://workstation.repzo.com/docs/operations/requests) - [Price Offers](https://workstation.repzo.com/docs/sales/price-offers) - [Chat](https://workstation.repzo.com/docs/operations/chat) - [Notifications](https://workstation.repzo.com/docs/administration/notifications) --- # Campaigns > Plan marketing initiatives and track contacts, deals, creatives, budgets, and ad activity. A campaign keeps everything about one marketing initiative in a single record. Use it to connect planning and spend with the [Contacts](https://workstation.repzo.com/docs/sales/contacts) and won [Deals](https://workstation.repzo.com/docs/sales/deals) the initiative brings in. Campaigns, [Send](https://workstation.repzo.com/docs/marketing/send), [Segments](https://workstation.repzo.com/docs/marketing/segments), [Ads](https://workstation.repzo.com/docs/marketing/ads), and [Forms](https://workstation.repzo.com/docs/marketing/forms) are part of the Marketing add-on. See [Plans & Add-ons](https://workstation.repzo.com/docs/commerce/plans-and-add-ons). ## Campaign lifecycle Campaigns use four statuses: - **Draft** for planning. - **Active** while the campaign is running. - **Paused** when work is temporarily stopped. - **Completed** when the initiative is finished. The campaign type can be Email, Social Media, Paid Ads, Event, Content, Referral, or Other. The type only classifies the campaign; it doesn't send anything. Use [Send](https://workstation.repzo.com/docs/marketing/send) to message contacts and [Ads](https://workstation.repzo.com/docs/marketing/ads) for synced ad performance. ## Create a campaign 1. Open **Marketing → Campaigns**. 2. Click **New Campaign**. If your workspace has campaign templates, you can start from one instead of from scratch. 3. Add the name, type, owner, dates, and status. 4. Add a source, channel, audience, budget, goal, or expected revenue if useful. 5. Add UTM source, medium, campaign, content, and term values if links need tracking. 6. Save the campaign. To reuse a campaign's setup, open it and click **Clone**. ## How contacts are linked Contacts are linked to a campaign when: - a [Form](https://workstation.repzo.com/docs/marketing/forms) submission carries a `utm_campaign` value that matches the campaign's UTM campaign; - a synced ad lead form brings in a contact, and the form mapping or the ad is linked to the campaign (see [Ads](https://workstation.repzo.com/docs/marketing/ads)); - someone sets the campaign on the contact by hand. If a contact is linked again later, the newest campaign wins. The **Won Deals** tab shows won deals from those contacts, plus deals linked to the campaign directly. ## Work from the campaign record The record splits campaign work into tabs: | Tab | Use it for | | --- | --- | | **Overview** | Contacts, qualified contacts, won deals, budget, spend, and cost per contact, qualified contact, and converted contact. | | **Contacts** | Contacts linked to the campaign. Select them to edit, assign, or delete them, move them to another campaign, or remove them from this one. | | **Won Deals** | Revenue from those contacts. | | **Creatives** | Store campaign assets and move them through review. | | **Budget** | Compare planned budget items with actual spend. | | **Activity** | The campaign's timeline. | | **Comments** | Coordinate with teammates. | | **Synced ads** | Ads from connected ad accounts that belong to this campaign. | | **Settings** | Link ad accounts and external campaign IDs. | Creative statuses are Draft, Pending Review, Approved, Rejected, and Revision Requested. Review notes stay with the asset, so you can see why it was approved or sent back. Qualified and converted use the same definitions as [Ads](https://workstation.repzo.com/docs/marketing/ads#qualified-and-converted-contacts). ## Lists, views, and visibility Use the All campaigns, Draft, Active, Paused, and Completed tabs to narrow the list, and save table views for filters and columns you use often. Select campaigns to bulk-edit, assign, create tasks, or delete, where your permissions allow. Campaign access follows your workspace's visibility rules. Depending on setup, you may see all campaigns, your department's campaigns, or only your own. ## Related pages - [Send](https://workstation.repzo.com/docs/marketing/send) - [Segments](https://workstation.repzo.com/docs/marketing/segments) - [Ads](https://workstation.repzo.com/docs/marketing/ads) - [Reports](https://workstation.repzo.com/docs/analytics/reports) --- # Send > Build, approve, schedule, and measure outbound messages and multi-step sequences. Send is where you message contacts in bulk. It has two modes, shown as tabs at the top of **Marketing → Send**: - **One-time & ongoing sends**: a single message (email, WhatsApp, or a website Messenger banner, post, or chat) sent to an audience once, on a repeat schedule, or continuously. - **Sequences**: a series of email and WhatsApp steps with waits between them, which each contact moves through on their own. Send is part of the Marketing add-on. See [Plans & Add-ons](https://workstation.repzo.com/docs/commerce/plans-and-add-ons). ## Start a send 1. Open **Marketing → Send**. 2. Click **New campaign** and pick a template. You can filter templates by use case, channel, or type, or start from a quick starter. 3. Write the content and choose the sender. 4. Choose the audience: a saved [Segment](https://workstation.repzo.com/docs/marketing/segments) or custom rules made just for this send. 5. Choose how and when it sends, and optionally set a goal. 6. Fix anything listed under **Finish these to launch**, then click **Send now**, **Go live**, or **Schedule**. These templates can be launched today: | Template | Where it shows | | --- | --- | | **Email** | The contact's inbox. | | **WhatsApp** | WhatsApp. Marked **Setup** until a WhatsApp number is connected in **Settings → Inbox → Channels**. | | **Banner** | A one-line message at the top or bottom of your website Messenger. | | **Post** | A message card in your website or mobile Messenger. | | **Chat** | A chat message in your Messenger. Replies go to [Inbox](https://workstation.repzo.com/docs/operations/inbox). | Templates marked **Soon** (SMS, mobile push, product tour, tooltip, checklist, survey, news) can't be created yet. ## Categories Each send has a category that decides which consent rules apply: | Category | What it means | | --- | --- | | **Marketing** | Needs consent, respects frequency caps, and includes an unsubscribe link. | | **Sales** | Sales outreach with reply tracking. | | **Transactional** | Service messages. Skips subscription and frequency rules. Sent one-to-one, so there's no segment audience. | | **System** | Internal or platform messages. Also sent one-to-one. | ## Write the content **Email** uses a drag-and-drop editor. You can: - add a subject line and preview text. Subject line tips warn about things like ALL CAPS or spam words; - insert variables such as `{{contact.firstName}}` that fill in each contact's value; - load a **Saved template** from **Settings → Templates & Automation → Email Templates**, or import a design from an unlayer.com template link; - add **A/B variants** that split recipients by weight. Each contact always gets the same variant; - **Send a test** to an address or a contact. Test subjects start with `[TEST]`. Tests skip frequency caps and subscriptions, but suppressions still apply. **WhatsApp** sends a Meta-approved template, or a free-text session message if the contact wrote to you in the last 24 hours. Map each template variable to a contact field or type a fixed value. The send shows your WhatsApp daily limit. If the audience is bigger than the limit, you can turn on automatic retries so the rest go out over the next days. **Banners and posts** open in their own builder. You choose who sees them (visitors, signed-in users, or both), what clicking does, whether people can dismiss them, and when they show again. Their record has an overview with views, clicks, reactions, collected emails, and dismissals. ## Audience, schedule, and goal - **Audience**: pick a saved segment or build custom rules. The estimate shows how many contacts match now. The final number can be lower after opt-outs, suppressions, and frequency caps. - **How it sends**: **Send once** freezes the audience at launch and sends one time. **Send continuously** keeps sending to anyone who newly matches. You can't change this after launch. - **When to send**: send now or at a set date and time in the workspace's timezone. Continuous sends can also have an end date. - **Repeat**: send daily, weekly, or monthly. Each time, the audience is checked again. - **Subscription type**: when set, contacts who opted out of that subscription are skipped. - **Goal**: an event you want recipients to complete within 1, 3, 7, or 30 days. Analytics shows how many reached it. ## Approval and status A send needs approval before it goes out when it's a WhatsApp template send, uses a channel connected in the last 7 days, targets a very large audience (50,000 contacts by default), or matches one of your approval policies. People with the approve permission see **Approve** and **Reject** on the send. Statuses are Draft, Pending approval, Scheduled, Live, Paused, Completed, and Archived. One-time sends show **Sending…** and **Sent** instead of Live and Completed. You can pause a live or scheduled send, and clone any send. ## Deliveries and analytics The **Deliveries** tab lists every recipient with their status (such as Sent, Delivered, Failed, Bounced, Suppressed, Unsubscribed, or Deferred), attempts, and error. The **Analytics** tab shows sent, delivered, open, click, reply, bounce, unsubscribe, and goal numbers, plus why messages didn't deliver. Email also shows top clicked links, opens by client and device, engagement over time, and results per A/B variant. You can export the list to CSV. Open rates are approximate because some mail apps load images automatically. Detected machine opens are left out; clicks are the more reliable signal. ## Sequences A sequence sends a series of steps to each contact in a segment. Open **Marketing → Send → Sequences** and click **New sequence**. 1. Choose the **Contact segment**. Contacts who match now, and anyone who matches later, enter once. 2. If you'll send WhatsApp steps, choose the WhatsApp channel. 3. Add up to 30 steps: - **Message**: an email (with a sender address) or a WhatsApp template. - **Wait**: a delay in minutes, hours, or days. - **Update record**: change fields on the contact. 4. Optionally add **Outcome actions**: update the contact when they reply or when they fail. 5. Save, then click **Approve & launch**. Launching needs Send approval rights. A sequence stops for a contact when they reply by email or WhatsApp, when their stage changes, or when a message fails. Replies must reach a connected inbox or synced mailbox to count. After launch, steps and audience are locked. To remove a step, pause the sequence first. Contacts who enter after you resume skip the removed step; contacts already in the sequence keep their original steps. For other changes, clone the sequence into a new draft. The **Contacts** tab shows every contact's status (Active, Scheduled, Replied, Completed, Failed, Stopped) and current step. Select failed contacts to retry them or move them to the next step, or bulk-edit the selected contacts. ## Email sending setup Admins set up email sending in **Settings → Inbox → Email**: | Tab | Use it for | | --- | --- | | **Domains & addresses** | Add sender addresses, verify them, and authenticate your domain by adding the DNS records shown. Click **Check status** after updating DNS. | | **Email settings** | Marketing footer (company name and mailing address), open and click tracking, and requiring an authenticated domain for marketing and sales email. | | **Sending rules** | Warm-up limits that ramp up a new domain day by day, and quiet hours when nothing is sent. | | **Subscriptions** | Subscription types contacts can opt in to or out of. | | **Suppressions** | Addresses that must never receive email. Hard bounces and spam complaints are added automatically. | Every marketing email has an unsubscribe link and a preference page where contacts manage their subscriptions. Reusable email designs live in **Settings → Templates & Automation → Email Templates**. The same templates are available in Send and in the email composer. ## Related pages - [Segments](https://workstation.repzo.com/docs/marketing/segments) - [Campaigns](https://workstation.repzo.com/docs/marketing/campaigns) - [Contacts](https://workstation.repzo.com/docs/sales/contacts) - [Inbox](https://workstation.repzo.com/docs/operations/inbox) --- # Segments > Build reusable dynamic or static audiences from CRM and customer records. Segments are saved groups of records. They are most often used as the audience for [Send](https://workstation.repzo.com/docs/marketing/send) campaigns and sequences, but they are also useful for exports, bulk assignments, tasks, and focused follow-up. ## Dynamic and static segments - A **dynamic segment** uses saved conditions. Its members change as records change. - A **static segment** is a fixed list. You add and remove members by hand. Segments can be built for Contacts, Accounts, Deals, Tickets, Invoices, and Conversations. The record type can't be changed after the segment is created. Visibility can be **Private** (only you), **Department** (members of a department and its sub-teams), or **Organization** (everyone). ## Start from the starter set To get going quickly, click **Templates** on the Segments page. It offers a ready-made set of common audiences grouped as Clients, Engagement, Sales, and Billing, such as New clients, Lapsed clients, Hot leads, Email subscribers, Big deals, Won this quarter, and Unpaid invoices. All templates are selected by default. Uncheck the ones you don't want and add the rest in one step. Templates whose name already exists as a segment are skipped, so it's safe to run again. ## Build a dynamic segment 1. Open **Marketing → Segments**. 2. Click **New segment**. 3. Choose the record type and **Dynamic**. 4. Add conditions using native fields or custom [Properties](https://workstation.repzo.com/docs/administration/properties). 5. Choose whether records must match **all** or **any** of the conditions, and add groups for more complex logic. 6. Save, then open the segment to check its members. Conditions support text, number, choice, and date comparisons, including relative dates such as "in the last 30 days" or "more than 3 months ago". Start with a few rules and check the members before adding more. ### Conditions on related records Use **Add related records** to match records by what is linked to them. For example, "Contacts that have a matching record in Deals where stage is Negotiation", or "Accounts that have no matching record in Invoices". All conditions inside one related-records block must match the same related record. With no conditions, the block only checks whether any related record exists. ## Work with members From a segment record you can: - **Refresh** a dynamic segment's member count; - add or remove members of a static segment; - **Export CSV** of the current members; - take a **Snapshot** that freezes the current members; - select members to assign an owner, create tasks, or delete them, where your permissions allow. Snapshots are useful when you need the exact audience at a point in time, even if the rules match different records later. ## Use a segment in Send Send campaigns and sequences use **Contact** segments: - A **Send once** campaign freezes the segment's members at launch. - A **Send continuously** campaign keeps adding contacts who newly match. - A **sequence** enrolls current members and anyone who matches later, once per contact. The same rule builder is used for custom audience rules in Send and for the qualified and converted definitions in [Ads](https://workstation.repzo.com/docs/marketing/ads). ## Related pages - [Send](https://workstation.repzo.com/docs/marketing/send) - [Contacts](https://workstation.repzo.com/docs/sales/contacts) - [Properties](https://workstation.repzo.com/docs/administration/properties) - [Tasks](https://workstation.repzo.com/docs/engagement/tasks) --- # Ads > Compare paid-ad spend and engagement with the contacts and deals they bring in. Ads brings your advertising data into Workstation. Use it to go from network numbers (spend, impressions, clicks) to the contacts, qualified leads, and won deals those ads actually produced. ## Connect ad accounts Admins connect ad accounts in **Settings → Integrations & Developers → Ads**. Supported networks are **Meta**, **Google Ads**, and **LinkedIn**. TikTok is listed but marked as coming soon. The settings page has two tabs: - **Ad accounts**: connect, reconnect, or disconnect accounts. Turn on **Auto tracking** to add UTM parameters to new ads automatically, so the contacts they bring in are linked back to the ad. - **Contact syncing**: map lead forms from Meta, Google, and LinkedIn so each submitted lead becomes a contact. After an account is connected, click **Sync from networks** (or **Sync now**) on the Ads page to pull campaigns, ad sets, ads, creatives, and daily metrics. The page shows when each account last synced and any error that needs attention. ## Review performance 1. Open **Marketing → Ads**. 2. Pick a date range. 3. Switch between **Ad campaigns**, **Ad sets**, and **Ads**. 4. Filter by network, status, objective, or spend. 5. Click a row to drill down to its ad sets and ads, or open an ad to see its creative, daily performance, and attributed contacts. Columns include spend, reach, impressions, clicks, unique clicks, conversions, engagements, and video views, plus calculated values such as CTR, CPC, CPM, cost per contact, cost per qualified contact, and cost per converted contact. Use **Columns** to choose which ones to show. An ad campaign record has a **Funnel** tab that lists every contact attributed to it and where they are: no deal yet, has a deal, qualified, or converted. ## Qualified and converted contacts By default: - a contact is **qualified** when they have an open deal; - a contact is **converted** when they have a won deal. To match your own sales process, click **Configure metrics** on the Ads page, or open **Settings → Integrations & Developers → Ads Funnel Metrics**. For each metric, turn on **Customize** and choose what to match on: - **Deals**: the contact has a deal matching your conditions, such as "stage is Proposal". - **Contact fields**: the contact itself matches, such as "Lead status is Qualified". Conditions use the same rule builder as [Segments](https://workstation.repzo.com/docs/marketing/segments), including custom [Properties](https://workstation.repzo.com/docs/administration/properties). Your definitions apply to the Ads columns and the campaign funnel straight away. Attribution is only as good as the tracking behind it. If numbers look low, check that auto tracking is on, lead forms are mapped, and your [Forms](https://workstation.repzo.com/docs/marketing/forms) keep UTM values. ## Related pages - [Campaigns](https://workstation.repzo.com/docs/marketing/campaigns) - [Forms](https://workstation.repzo.com/docs/marketing/forms) - [Segments](https://workstation.repzo.com/docs/marketing/segments) - [Reports](https://workstation.repzo.com/docs/analytics/reports) --- # Forms > Build, publish, share, and automate multi-step forms. Forms collect information through a public link or a form embedded on your website. Use them for lead capture, newsletter sign-ups, event registration, contact requests, and other repeatable intake. ## Build a form 1. Open **Marketing → Forms**. 2. Click **Create Form** and pick a template (Newsletter, Contact Us, Event Registration, Talk to an Expert, Book a Meeting) or **Start from blank**. 3. Add fields and spread them across one or more steps. 4. Set up logic, styles, and settings. 5. Preview on desktop and mobile, then click **Publish**. Field types are single-line text, multi-line text, email, phone, URL, number, dropdown, multiple checkboxes, date, checkbox, file upload, country, section heading, and paragraph text. ## Builder panels | Panel | Use it for | | --- | --- | | **Add** | Add fields and steps. | | **Contents** | See the form's steps and fields. Click a field here or in the preview to edit its label, help text, validation, required state, width, and CRM mapping in the properties panel. | | **Logic** | Show or hide a field when all or any conditions match. | | **Styles** | Layout, colors, fonts, buttons, background, and progress bar. | | **Auto** | Open [Workflows](https://workstation.repzo.com/docs/administration/workflows) that run when the form gets a new submission. | | **Settings** | General options, submission handling, and sharing. | Map fields to Contact, Account, or Deal properties when submissions should create or update CRM records. ## Settings **General** - **Auto-create contacts** makes a new contact when the email isn't known yet. - **Pre-fill returning visitors** fills in fields for people who submitted before. - **Contact assignment** decides who owns new contacts: leave them unassigned, assign a specific user, or use **Round-robin** across selected team members. Existing contacts keep their owner. **Submissions** - **Notifications** go to the form creator by default. You can also notify the contact owner, chosen teammates, or outside email addresses. Submissions flagged as spam don't send notifications. - **Spam protection** can block chosen email domains, reject free email providers like Gmail and Yahoo, and add a hidden honeypot field to catch bots. - **On submission**, show a thank-you message or redirect to a URL. For embedded forms, choose whether the redirect opens in the **Entire browser page** (recommended) or only inside the embedded form. **Share** opens the share dialog with the direct link and the embed code. ## Review results Open a form to see three tabs: - **Performance**: submissions, conversion rate, records created, and spam blocked over the last 30 days. - **Analyze**: submissions by source, status breakdown, and how often each field is filled in. - **Submissions**: every response. Open one to see its answers and attribution (page URL, UTM values, Google and Facebook click IDs, and the matched campaign). Mark responses as **Processed** or **Spam**, delete them, or export the list. When a submission's `utm_campaign` matches a [Campaign](https://workstation.repzo.com/docs/marketing/campaigns), the contact is linked to that campaign. Forms can be duplicated, and archived when they should stop taking responses. Form statuses are Draft, Published, and Archived. ## Related pages - [Contacts](https://workstation.repzo.com/docs/sales/contacts) - [Campaigns](https://workstation.repzo.com/docs/marketing/campaigns) - [Workflows](https://workstation.repzo.com/docs/administration/workflows) - [Properties](https://workstation.repzo.com/docs/administration/properties) --- # Orders > Create or sync orders, track payment and fulfillment, redeem loyalty points, and turn order line items into invoices. Orders record what a customer purchased and how the order is progressing. They can be created in Workstation or synced from a connected commerce or ERP app such as Shopify, ERPNext, or Repzo SFA. Orders placed by the AI agent or through WhatsApp also land here. ## Create an order 1. Open **Commerce → Orders** and click **Create order**. 2. Pick the customer in the Contact card, or create a new Contact from the same search. 3. Click **Add product** to add catalog items, or **Add custom item** for a one-off line. Adjust the unit price and quantity on each line. 4. In the **Payment** card, use **Add discount** (percentage or fixed amount) and **Add shipping or delivery** when needed. Estimated tax is calculated from each product's tax rate. Customers marked tax exempt are not charged tax. 5. Set the currency, fulfillment status, pipeline, stage, and notes in the side cards. 6. Choose how to finish: - Tick **Payment due later**, then click **Create order** to save it as unpaid. - Or use **Collect payment** → **Credit card** or **Mark as paid** to save it as paid. The fields on the create form follow the layout your admins set in [Objects](https://workstation.repzo.com/docs/administration/objects). Use [Pipelines and Stages](https://workstation.repzo.com/docs/sales/pipelines) when the team needs a consistent order process. ### Redeem loyalty points When [Client Loyalty](https://workstation.repzo.com/docs/operations/client-loyalty) is active and the customer has points, a **Redeem points** section appears under the payment summary. Choose a reward and the discount shows as **Points reward** in the totals. Some rewards cannot be combined with other discounts, and free-item rewards need that item on the order. ## List and Kanban views The list shows the order, total, currency, payment status, fulfillment status, and processing dates. Use search, filters, saved [table views](https://workstation.repzo.com/docs/administration/table-views), and export to focus the list. Clicking a row opens the order in a side panel without leaving the list. Kanban groups orders by stage by default. A supported custom property can be used as the grouping field instead. Admins choose which fields appear on Kanban cards. A **Stale** badge marks orders that have stayed in their stage longer than the stage-health rule allows. ## Order record The order record has two tabs: - **Summary**: data highlights (total, subtotal, discount, refund), order details, shipping and billing addresses, attribution, and notes. - **Line Items**: each product with quantity, unit price, discount, tax, and amount. The left sidebar shows **About this order** (payment status, payment method, fulfillment, order status, source store), the pipeline and stage, customer details, dates, and tags. The right side shows the related Invoices, Contacts, Accounts, and Associated cart. You can add Contact and Account associations and choose which one is primary. When the order earned or used loyalty points, a **Loyalty** card shows the points earned, spent, taken back, or given back. Synced orders show **Open order** in the header, which opens the order in its source system. ## Create an invoice from an order When an order has line items but no invoice yet, the Invoices card shows **Create invoice**. Workstation carries the customer and line items into the invoice, where you confirm dates, terms, tax, and totals. See [Invoices](https://workstation.repzo.com/docs/commerce/invoices). ## Loyalty points from orders Orders can earn points or cashback for the customer, including orders synced from other systems. In **Client Loyalty → Settings**, turn on **Orders earn rewards** and choose when an order earns: when it is paid, when it is fulfilled or delivered, or when it reaches chosen stages. If an order is cancelled or refunded, the points come back off the customer's balance. See [Client Loyalty](https://workstation.repzo.com/docs/operations/client-loyalty). ## Synced orders Connections from [Marketplace](https://workstation.repzo.com/docs/configuration/marketplace) may supply source-specific statuses, external identifiers, cart and checkout IDs, and attribution data. Check the connection's mapping and last sync when a source order does not match the Workstation record. ## Related pages - [Invoices](https://workstation.repzo.com/docs/commerce/invoices) - [Subscriptions](https://workstation.repzo.com/docs/commerce/subscriptions) - [Client Loyalty](https://workstation.repzo.com/docs/operations/client-loyalty) - [Marketplace](https://workstation.repzo.com/docs/configuration/marketplace) - [Pipelines and Stages](https://workstation.repzo.com/docs/sales/pipelines) - [Properties](https://workstation.repzo.com/docs/administration/properties) --- # Subscriptions > Bill customers on a recurring schedule, track MRR and ARR, and let Workstation create an invoice on every billing date. A subscription bills a customer again and again for the same products, for example a monthly retainer or an annual license. Deals and quotes win the customer; the subscription keeps invoicing them. Each billing date, Workstation creates an [invoice](https://workstation.repzo.com/docs/commerce/invoices) for you. Subscriptions are for your customers. Your own Workstation plan is managed in [Billing](https://workstation.repzo.com/docs/commerce/billing). Open **Commerce → Subscriptions**. You need the `subscriptions.view` permission. ## Create a subscription 1. Click **Create subscription**. 2. In the **Associations** card, choose the customer: a contact, an account, or both. You can also link the deal or quote it came from. 3. In **Products**, click **Add product** or **Add custom item**. Set the unit price, quantity, and an optional **Discount %** for each line. Prices are per billing period. 4. In the **Subscription** card, enter a **Name** (for example "Pro plan — annual"), the **Owner**, and a description. 5. In the **Billing** card, set: - **Billing frequency**: from Daily to Every five years. Monthly, Quarterly, and Annually are the most common. - **Start date**: the first billing date. - **Number of payments**: how many invoices the customer committed to. Leave it empty to bill **Until canceled**. - **Renew automatically at the end of the term**, when there is a fixed number of payments. - **Currency**. 6. In the **Invoicing** card, keep **Create an invoice on every billing date** on, set **Payment terms (days)** (0 means due on receipt), and add **Invoice comments** to print on each invoice. 7. Check the **Billing summary** (total per billing period, MRR, ARR, and contract value), then click **Create subscription**. Tax uses your current tax settings, and each invoice uses the rates in force on its billing date. ### From a quote A recurring [Price Offer](https://workstation.repzo.com/docs/sales/price-offers) shows **Create subscription**. It opens the form filled in with the quote's customer and products. Nothing is saved until you click save. Only quotes with a recurring billing cycle can be converted. ## How billing works - Once a day, Workstation creates an invoice for every subscription whose billing date has arrived. It also runs right after you create, edit, or resume a subscription, so a subscription starting today is invoiced immediately. - Each invoice is issued as **Open**, dated on the billing date, and due after the payment terms. It is linked to the customer, the subscription, and the deal, and each line shows the service period. - There is one invoice per billing period, never duplicates. - Payments are collected manually. Record them on each invoice as usual. Workstation does not charge cards automatically. - If invoicing is turned off for a subscription, billing periods still advance but no invoice is created. When a fixed term ends, the subscription renews into a new term if auto-renew is on. Otherwise it expires the day after the term ends. ## Statuses | Status | Meaning | |---|---| | **Scheduled** | The start date is in the future | | **Active** | Billing normally | | **Past due** | One of its invoices is past its due date with money owed. Paying or voiding that invoice makes it Active again. | | **Paused** | No invoices are created until it is resumed | | **Canceled** | Canceled now, or a scheduled cancellation has passed | | **Expired** | A fixed term ended without auto-renew | Status changes only through the actions below, so Kanban cards cannot be dragged between columns. ## Pause, resume, and cancel These actions are in the subscription's header and need `subscriptions.update` (or `subscriptions.update_own` for your own records). - **Pause** stops invoicing. You choose the next billing date when you resume. - **Resume** asks for the **Next billing date**. The end of the term moves out by the length of the pause, so the customer keeps all their payments. - **Cancel subscription** offers **At the end of the billing period** (runs until the period already billed ends) or **Cancel now**, with an optional **Reason**. Invoices already issued stay open; refunds are not automatic. - **Keep subscription** removes a scheduled cancellation. After the first invoice, the start date and currency can no longer be changed. A changed billing frequency applies from the next period. A canceled or expired subscription can only change its name, description, owner, and notes. To delete a subscription that has already billed and is still running, cancel it first. Deleting keeps its invoices. ## The subscriptions list The header shows the workspace's **MRR**, the number of active subscriptions, and how many are past due. Use the **All subscriptions**, **My subscriptions**, **Active**, and **Past due** tabs. **Billing this week**, **Ending in 60 days**, **Paused**, and **Canceled or expired** are also available as [table views](https://workstation.repzo.com/docs/administration/table-views). The list shows the subscription and customer, status, amount per period, MRR, billing frequency, next billing date, and end date. Switch to Kanban to see subscriptions grouped by status. ## Subscription record The left sidebar shows the status, billing frequency, owner, start and next billing dates, end date, customer, MRR and ARR, and the number of billing cycles so far. | Tab | Shows | |---|---| | **Overview** | The billing summary (total per period, MRR, ARR, contract value, billed, collected, outstanding, billing cycles), line items, and custom properties. A banner appears if a scheduled cancellation is pending or the last invoice could not be created. | | **Invoices** | Every invoice the subscription created | | **Activities** | Activities linked to the subscription | | **Timeline** | The change history | The right side shows the related contacts, accounts, deals, quotes, invoices, and tickets. Contacts, accounts, and deals also show a **Subscriptions** card. Admins can change the record layout in [Objects](https://workstation.repzo.com/docs/administration/objects). ## Loyalty and automation - With [Client Loyalty](https://workstation.repzo.com/docs/operations/client-loyalty), customers can earn points on renewal payments, milestones, and win-back points when they choose to keep a subscription. Set this up in the **Subscriptions** card on the loyalty **Settings** tab. A contact can also use points automatically on each renewal invoice. - [Workflows](https://workstation.repzo.com/docs/administration/workflows) can start on **Subscription Created**, **Subscription Updated**, **Subscription Status Changed**, **Subscription Renewed**, and **Subscription Canceled**. ## Permissions | Permission | Allows | |---|---| | `subscriptions.view` | See subscriptions | | `subscriptions.create` | Create subscriptions, including from a quote | | `subscriptions.update` / `subscriptions.update_own` | Edit, pause, resume, and cancel any or only your own | | `subscriptions.delete` / `subscriptions.delete_own` | Delete any or only your own | By default, Managers have all of them. Users can view, create, and update their own, but not delete. ## Related pages - [Invoices](https://workstation.repzo.com/docs/commerce/invoices) - [Payments](https://workstation.repzo.com/docs/commerce/payments) - [Price Offers](https://workstation.repzo.com/docs/sales/price-offers) - [Deals](https://workstation.repzo.com/docs/sales/deals) - [Client Loyalty](https://workstation.repzo.com/docs/operations/client-loyalty) - [Workflows](https://workstation.repzo.com/docs/administration/workflows) --- # Gift Cards > Issue gift cards and store credit, let customers spend them at checkout, the register, or on invoices, and track every balance movement. Gift cards and store credit are prepaid balances that customers spend like cash. Use them for gifts, goodwill gestures, rewards, and refunds. There are two kinds: - **Gift card**: anyone with the code can spend it. Linking it to a customer is optional. - **Store credit**: belongs to one contact. Each contact has a single store-credit balance, and issuing more tops it up. Open **Commerce → Gift Cards**. Gift cards are part of [Client Loyalty](https://workstation.repzo.com/docs/operations/client-loyalty), and you need the `gift_cards.view` permission. Selling a gift card for money isn't supported yet. Cards issued here are free value, such as gifts, goodwill, and rewards. ## Issue a gift card or store credit 1. Click **Issue gift card**. 2. Choose the **Type**: Gift card or Store credit. 3. Enter the **Amount** and **Currency**. 4. Choose the **Customer**. It is optional for gift cards and required for store credit. 5. For a gift card, optionally enter your own **Code** (at least 8 letters or numbers). Leave it empty to generate one. 6. Optionally set **Expires on**. Leave it empty if it never expires. 7. For a gift card, optionally add the **Recipient name**, **Recipient email**, and a **Message**. 8. Choose the **Reason** (Gift or goodwill, or Reward), add an internal note, and click **Issue** (or **Add store credit**). No payment is taken. You can also add store credit from a contact's **Loyalty** tab. Store credit is also created when: - a credit note is refunded with the **Store credit** payment method; - a [loyalty program](https://workstation.repzo.com/docs/operations/client-loyalty) pays cashback, which lands in the customer's store credit. ## Spend a gift card or store credit Customers can spend a balance in three places: | Where | How | |---|---| | [Appointment Checkout](https://workstation.repzo.com/docs/engagement/appointment-checkout) and the [Point of Sale](https://workstation.repzo.com/docs/pos) | In the **Gift card or store credit** panel, enter the code and click **Check**, then **Apply**. **Use store credit** appears when the sale's customer has credit. | | [Invoices](https://workstation.repzo.com/docs/commerce/invoices#record-a-payment) | In **Record payment**, choose **Gift card** and enter the **Gift card code**, or choose **Store credit** when the invoice has a customer. | The amount applied is capped at what is still due. Spending a gift card always needs its code, and the card must be in the same currency as the sale. Store credit can only be used by its own customer. Returns and voids at the point of sale put the money back onto the original card. On payment records, the method shows as **Gift card •••• 1234** or **Store credit**. ## The gift cards list The list shows the **Code**, **Type**, **Customer**, **Balance** (remaining of issued), **Status**, **Expires**, and **Issued** date. Filter by type and status, and search by code, customer, or recipient. | Status | Meaning | |---|---| | **Active** | Has a balance and can be spent | | **Used up** | The balance has been spent | | **Expired** | Passed its expiry date. Any remaining balance is removed by a daily job. | | **Cancelled** | Cancelled by staff. It can't be used again. | Only people with `gift_cards.manage` see full codes. Everyone else sees the last four characters (for example **•••• 6789**) and can only search by those, or by the exact code. ## Gift card details Click a card to open its details: the code (with **Copy code** for managers), balance, customer, recipient, expiry, source, and message. The **History** list shows every movement: Issued, Spent, Returned, Adjusted, Expired, and Cancelled, each with the date, the related invoice, and the balance after. With `gift_cards.manage`, you can also: - **Adjust balance**: add value with a positive amount or remove it with a negative one. A reason is required. - **Cancel card**: removes the remaining balance. The card can't be used again. ## Accounting When [Accounting](https://workstation.repzo.com/docs/commerce/accounting) is enabled, unspent balances are a liability, not income: - Issuing or adding value posts to **Gift Card and Store Credit Promotions** (expense) and **Gift Cards and Store Credit** (liability). - Spending a balance relieves the liability instead of landing in cash. - Value removed by expiry, cancellation, or a negative adjustment posts to **Gift Card Breakage** (income). You can choose a different liability account in [Posting defaults](https://workstation.repzo.com/docs/commerce/accounting/chart-of-accounts#account-mappings). ## Permissions | Permission | Allows | |---|---| | `gift_cards.view` | See gift cards and look up a card's balance | | `gift_cards.manage` | Issue, adjust, and cancel cards, and see full codes | Cashiers and staff who take payments (`pos.sell`, `invoices.create`, `invoices.update`, or `appointments.update`) can also look up a card or a customer's store credit when taking a payment. ## Related pages - [Client Loyalty](https://workstation.repzo.com/docs/operations/client-loyalty) - [Invoices](https://workstation.repzo.com/docs/commerce/invoices) - [Payments](https://workstation.repzo.com/docs/commerce/payments) - [Appointment Checkout](https://workstation.repzo.com/docs/engagement/appointment-checkout) - [Point of Sale](https://workstation.repzo.com/docs/pos) --- # Invoices > Create customer invoices, split them into payment plans, record payments, print branded PDFs, issue returns, and report to ZATCA. Invoices track what a customer owes, what has been paid, and which commercial records produced the charge. They are customer records; [Billing](https://workstation.repzo.com/docs/commerce/billing) is the separate Configuration page for the organization's Workstation subscription. Invoices are also created for you by [Appointment Checkout](https://workstation.repzo.com/docs/engagement/appointment-checkout), the [Point of Sale](https://workstation.repzo.com/docs/pos), and [Subscriptions](https://workstation.repzo.com/docs/commerce/subscriptions), and you can create one from an [Order](https://workstation.repzo.com/docs/commerce/orders) or a [Price Offer](https://workstation.repzo.com/docs/sales/price-offers). ## Create an invoice 1. Open **Commerce → Invoices** and click **New Invoice**. 2. Pick the customer in the Contact card. The contact's Account is linked automatically. 3. Click **Add product** or **Add custom item**, then set the unit price and quantity on each line. 4. Use **Add discount** for a percentage or fixed discount. Estimated tax is calculated from each product's tax rate, and tax-exempt customers are not charged tax. 5. Optionally turn on **Payment plan** to split the invoice into installments (see below). 6. In **Invoice settings**, set the currency, billing cycle, owner, issue date, and due date. Add notes and payment terms if needed. 7. Click **Create invoice** to issue it, or **Save draft** to finish it later. The invoice number is assigned automatically from your numbering settings. The fields on the create form follow the layout your admins set in [Objects](https://workstation.repzo.com/docs/administration/objects). ## Status and amounts The stored statuses are **Draft**, **Open**, **Paid**, and **Voided**. An open invoice is also shown as **Overdue** after its due date, or **Partially Paid** once some money has been received. Invoice totals can include subtotal, discount, tax, tip, total, amount paid, and amount due. ## Payment plans A payment plan splits one invoice into a down payment and a series of installments. The invoice stays a single document; only the schedule changes. To add a plan, turn on **Payment plan** when creating the invoice, or open the invoice's **Payment** tab and click **Set up payment plan**. Then set: - **Down payment**, as an amount or a percent of the total, and its due date (**Down payment due**); - **Number of installments**; - **Frequency**: Weekly, Every two weeks, Monthly, or Every three months; - **First installment due**. The **Payment schedule** table shows each installment with its due date, amount, amount paid, and status (Upcoming, Due soon, Overdue, Partially Paid, or Paid). Click **Record** on a row to pay that installment. Payments are always applied to the earliest unpaid installment first. If you **Edit plan** after money has been received, the payments are re-applied to the new schedule, oldest first. **Remove plan** deletes the schedule but keeps the recorded payments, and the full balance becomes due on the invoice's due date. Add the **Payment schedule** block to an invoice print template to print the plan on the PDF. ## Record a payment Open the **Payment** tab and click **Record payment**. Enter the amount, payment date, payment method, an optional reference number, and notes. Workstation recalculates the amount due and marks the invoice paid when the balance reaches zero. Users with permission can delete an incorrect payment with **Delete Payment** and record it again. The available payment methods come from **Settings → Finance → Payment Methods**. When your workspace has Client Loyalty, **Gift card** (enter the card code) and **Store credit** (for invoices with a customer) also appear. Credit notes can refund to store credit, but not onto a gift card. See [Gift Cards](https://workstation.repzo.com/docs/commerce/gift-cards). Every payment also appears in [Payments](https://workstation.repzo.com/docs/commerce/payments). When [Accounting](https://workstation.repzo.com/docs/commerce/accounting) is enabled, opening an invoice and recording or removing payments also create balanced journal entries. The invoice's **Accounting** card lists those entries and links to each one; it says **Not posted to the ledger** when nothing has posted. The same invoices appear in **Accounting → Invoices**. See [Accounting sales](https://workstation.repzo.com/docs/commerce/accounting/sales) and [Accounting payments](https://workstation.repzo.com/docs/commerce/accounting/payments). ## Invoice record and actions The record has **Details**, **Payment**, **Comments**, and **Timeline** tabs. Depending on status, settings, and permissions, the header can show: | Action | When it appears | |---|---| | **Preview** / **Download PDF** | Always. The PDF is generated in the background and appears in the downloads center. | | **Edit** | Drafts, or open invoices with no payments when **Allow invoice editing** is on. | | **Open invoice** | Drafts. Issues the invoice. | | **Delete** | Drafts, or invoices with no payments when **Allow invoice deletion** is on. | | **Record payment** | Open invoices with an amount due. Credit notes show **Record refund**. | | **Create return** | Issued invoices with quantities left to return. | | **Void Invoice** | Issued invoices. Voided invoices cannot be edited or receive payments. | | **Submit to ZATCA** / **Retry ZATCA** | When ZATCA is connected and the invoice has not been accepted yet. | ### Returns **Create return** opens a dialog listing each line with its original, returned, and remaining quantity. Enter the quantities to return and a **Return Reason**. Workstation creates a credit note linked to the original invoice. When ZATCA is connected, the credit note is queued for ZATCA automatically. ## Print templates and the invoice PDF The invoice PDF uses a print template from **Settings → Templates & Automation → Print Templates**. The default template is used unless you pick another one in the **Print Template** card on the invoice. ### Edit one invoice's document Sometimes one customer needs different wording on their invoice. Under the **Print Template** card, click **Customize for this invoice** to open the document editor. Changes there apply to this invoice only; the template stays the same. A **Customized** badge shows the invoice has its own wording, and you can reset it to the template at any time. Blocks that are locked in the template cannot be changed. Changing the wording does not change the invoice's amounts or ZATCA data, so it stays available after the invoice is issued. This needs the **Edit document** permission (`invoices.edit_document`). ## ZATCA e-invoicing Saudi businesses can report invoices to ZATCA (FATOORA) through the **ZATCA** app in [Marketplace](https://workstation.repzo.com/docs/configuration/marketplace). Connecting it asks for a FATOORA OTP, the environment (simulation or production), the invoice profile, and the organization's tax details such as Tax Number, CRN number, and address. Once ZATCA is connected: - New open invoices use SAR, and a customer Contact is required. - With **Report invoices automatically** on (the default), every issued invoice, including appointment checkouts, is sent to ZATCA as soon as it is opened. When it is off, use **Submit to ZATCA** on each invoice. - Simplified invoices are reported. Standard invoices are sent for clearance and need the buyer's Saudi VAT number and address. - The **ZATCA** card on the invoice shows the environment, counter, submission status, and the ZATCA QR code. The QR code can also be printed on the PDF. - Voiding is disabled. Use **Create return** to issue a credit note instead. - Editing open invoices, deleting issued invoices, and changing invoice numbering are locked to protect the e-invoice chain. Rejected submissions are listed in the ZATCA app's logs with ZATCA's response. Fix the problem, then use **Retry ZATCA** on the invoice. ## Invoice settings Admins manage numbering and edit rules in **Settings → Finance → Invoice Settings**: - **Next invoice number**, **Edit prefix**, and **Update starting point for invoice numbers**. - **Allow invoice editing**: open invoices can be edited until a payment is recorded. - **Allow invoice deletion**: invoices can be deleted unless a payment is recorded. Deletion cannot be undone. ## Find and manage invoices Use the **All invoices**, **My invoices**, **Open**, and **Unpaid** tabs, or save a [table view](https://workstation.repzo.com/docs/administration/table-views) with your own filters and columns. Clicking a row opens the invoice in a side panel. With the required permissions, bulk actions can edit, assign, create tasks for, or delete invoices. Export is available for offline review. ### Reports The **Reports** tab next to **Records** summarizes invoices without leaving the module. Start from a template such as **Invoice overview**, **By account**, **By owner**, or **Outstanding invoices**, then change filters, grouping, measures (total invoiced, collected, outstanding, and more), and the chart. Save the result as a report, or export it. **Create report from view** turns the list's current filters into a report. Reports need the `reports.view` permission. ## Permissions | Permission | Allows | |---|---| | `invoices.view` | See invoices and payments | | `invoices.create` | Create invoices | | `invoices.update` | Edit invoices, record payments, and manage payment plans | | `invoices.delete` | Delete invoices | | `invoices.edit_document` | Customize one invoice's printed document | ## Related pages - [Payments](https://workstation.repzo.com/docs/commerce/payments) - [Orders](https://workstation.repzo.com/docs/commerce/orders) - [Subscriptions](https://workstation.repzo.com/docs/commerce/subscriptions) - [Gift Cards](https://workstation.repzo.com/docs/commerce/gift-cards) - [Accounting](https://workstation.repzo.com/docs/commerce/accounting) - [Accounting sales](https://workstation.repzo.com/docs/commerce/accounting/sales) - [Appointment Checkout](https://workstation.repzo.com/docs/engagement/appointment-checkout) - [Marketplace](https://workstation.repzo.com/docs/configuration/marketplace) --- # Payments > See every customer payment in one list, open payment details, report on collections, and configure payment methods. Payments lists every customer payment your team has recorded, wherever it was taken: on an invoice, at [Appointment Checkout](https://workstation.repzo.com/docs/engagement/appointment-checkout), or at the [Point of Sale](https://workstation.repzo.com/docs/pos). Use it to answer questions like "what did we collect today?" or "how much came in by card this month?" without opening each invoice. Open **Commerce → Payments**. You need the `invoices.view` permission. ## Where payments come from Payments are not created on this page. Each one belongs to an invoice: - **Invoices**: **Record payment** on the invoice's Payment tab. See [Invoices](https://workstation.repzo.com/docs/commerce/invoices#record-a-payment). - **Appointment Checkout**: each payment line at checkout. - **Point of Sale**: each tender taken at the register, and refunds given on returns. - **Connected apps**: payments synced from apps such as ERPNext or Repzo SFA. Payment entries made inside the [Accounting](https://workstation.repzo.com/docs/commerce/accounting/payments) workspace are ledger documents and are listed in **Accounting → Payments**, not here. To correct a payment, open its invoice and delete the payment from the Payment tab, then record it again. ## The payments list | Column | Shows | |---|---| | **Amount** | The amount and currency | | **Payment method** | The method used, with its logo when one is set | | **Invoice** | The invoice the payment belongs to | | **Payment date** | When the money was received | | **Reference** | The reference number entered with the payment | | **Recorded by** | The team member who recorded it | | **Provider** | The payment provider, for card payments taken through one | | **Created** | When the record was saved | Use the **All payments** and **Today** tabs, the **Method**, **Payment date**, and **Currency** quick filters, and search. Save your own filters and columns as a [table view](https://workstation.repzo.com/docs/administration/table-views). Export downloads the filtered list, dated by payment date. ## Payment details Click a row to open the payment in a side panel. It shows: - **Payment details**: amount, payment method, payment date, recorded by, reference, tip, provider, and provider transaction ID; - **Invoice**: the invoice number, status, total, and amount due; - notes and tags. Click **View invoice** to open the related invoice. When [Accounting](https://workstation.repzo.com/docs/commerce/accounting) is enabled, the ledger menu shows the journal entry the payment posted. ## Reports The **Reports** tab next to **Records** summarizes payments. Start from **Payment overview**, **By payment method**, **By recorded by**, or **By invoice**, then change the date range, filters, grouping, and chart. Measures include total received, payment count, and average payment. Save a report to your library or export it. Reports also need the `reports.view` permission. ## Payment methods Admins choose the methods people can pick when recording payments in **Settings → Finance → Payment Methods**: - Turn standard methods (Cash, Card, Bank transfer, Check, Online, Other) on or off. - Click **Add payment method** to add your own, for example a specific bank or wallet app. Give it a **Name**, a **Category**, and an optional logo, and choose whether it is **Available at checkout**. - Drag methods into the order your team should see them. **Gift card** and **Store credit** are added automatically when your workspace has [Client Loyalty](https://workstation.repzo.com/docs/operations/client-loyalty), which includes [Gift Cards](https://workstation.repzo.com/docs/commerce/gift-cards). The same list is used at the [Point of Sale](https://workstation.repzo.com/docs/pos) and opens from **Settings → Point of Sale → Payment Methods** too. When Accounting is enabled, each method's bank or cash account is set in [Posting defaults](https://workstation.repzo.com/docs/commerce/accounting/chart-of-accounts#account-mappings). ## Related pages - [Invoices](https://workstation.repzo.com/docs/commerce/invoices) - [Gift Cards](https://workstation.repzo.com/docs/commerce/gift-cards) - [Accounting payments](https://workstation.repzo.com/docs/commerce/accounting/payments) - [Appointment Checkout](https://workstation.repzo.com/docs/engagement/appointment-checkout) - [Point of Sale](https://workstation.repzo.com/docs/pos) --- # Accounting > Keep double-entry books alongside invoices, payments, bills, expenses, and inventory. Accounting is an optional workspace for keeping double-entry books inside Workstation. Once it is enabled, the invoices, payments, and point of sale activity your team already records post to a general ledger automatically, and you can add the rest of the books: supplier bills, expenses, bank reconciliation, journal entries, fixed assets, and financial statements. You do not need a separate accounting system for day-to-day bookkeeping, and nothing in the CRM changes for people who never open Accounting. Accounting is a paid [add-on](https://workstation.repzo.com/docs/commerce/plans-and-add-ons#accounting) with 3 users included. Each person who opens it needs an Accounting seat, and their role decides what they can do there. Workspaces without it keep invoicing and taking payments exactly as before. ## How transactions reach the ledger Every accounting document follows the same lifecycle: 1. **Draft.** You can edit or delete it. It has no effect on the ledger. 2. **Post.** Workstation checks it and writes a balanced journal entry. A posted document can no longer be edited or deleted. 3. **Cancel** (or **Void** for invoices). Workstation writes a reversing journal entry. The original stays in the ledger as history. This is deliberate. Posted history is never rewritten, so your reports for a past period always add up to what you saw at the time, and every correction is visible in the ledger. Some documents post without a separate step: - Opening an invoice, from Accounting or from **Commerce → Invoices**, posts it. - Payments recorded on an invoice in the CRM post as they are saved. - Completed point of sale sales and returns post automatically. - Issuing, adjusting, cancelling, and expiring [gift cards and store credit](https://workstation.repzo.com/docs/commerce/gift-cards#accounting) post automatically. For example, when you open a 1,150 SAR invoice with 15% VAT, the ledger receives: | Account | Debit | Credit | |---|---|---| | Accounts Receivable | 1,150.00 | | | Sales Revenue | | 1,000.00 | | Tax Payable | | 150.00 | When the customer pays, a second entry moves 1,150 from Accounts Receivable to your bank account. ## The Accounting workspace Open **Accounting** from the main sidebar. The workspace has its own sidebar, grouped like this: | Group | Pages | |---|---| | Operations | Overview, Journal entries, Invoices, Expenses, Bills, Landed costs, Payments, Banking, Fixed assets, Prepaid expenses, Currency revaluation | | Parties | Customers, Suppliers | | Reports | General ledger, Stock ledger, Trial balance, Profit & loss, Balance sheet, Receivables aging, Payables aging, Cash flow, VAT return, Customer statement, and four consolidated reports | | Configuration | Opening balances, Accounting settings | You only see the pages your role allows. See [Permissions](https://workstation.repzo.com/docs/commerce/accounting/permissions). The **Overview** page shows three figures for the selected company: **Total assets**, **Receivables outstanding**, and **Profit this month**. When a scheduled depreciation or prepaid entry could not post, it also shows a **Needs attention** list; see [Scheduled entries](https://workstation.repzo.com/docs/commerce/accounting/ledger#scheduled-entries). ### List pages Document lists such as Invoices, Bills, Expenses, and Payments work like other Workstation lists. Use the tabs at the top for common views (for example drafts or overdue documents), add quick filters, search, and save your own [table views](https://workstation.repzo.com/docs/administration/table-views). Click a row to open the document. ### Company selector If your organization keeps books for more than one legal entity, a company selector appears in the Accounting header. Every page works on the selected company. See [Companies](https://workstation.repzo.com/docs/commerce/accounting/setup#companies). ## Guides - [Setting up Accounting](https://workstation.repzo.com/docs/commerce/accounting/setup): the add-on, enabling, the start date, member access (Accounting seats), and companies. - [Chart of accounts and settings](https://workstation.repzo.com/docs/commerce/accounting/chart-of-accounts): accounts, posting defaults, payment terms, and document numbering. - [Sales](https://workstation.repzo.com/docs/commerce/accounting/sales): invoices, credit notes, write-offs, and customer settings. - [Purchases](https://workstation.repzo.com/docs/commerce/accounting/purchases): bills, vendor credits, expenses, landed costs, prepaid expenses, suppliers, and withholding tax. - [Payments](https://workstation.repzo.com/docs/commerce/accounting/payments): receiving and paying money, allocations, advances, and foreign currency. - [Banking](https://workstation.repzo.com/docs/commerce/accounting/banking): bank accounts, statement import, matching, deposits, and transfers. - [Ledger](https://workstation.repzo.com/docs/commerce/accounting/ledger): journal entries, opening balances, fixed assets, currency revaluation, deferred revenue, and eliminations. - [Closing the books](https://workstation.repzo.com/docs/commerce/accounting/closing): fiscal years, the period lock, and year-end close. - [Reports](https://workstation.repzo.com/docs/commerce/accounting/reports): ledgers, financial statements, aging, VAT, and consolidated reports. - [Permissions](https://workstation.repzo.com/docs/commerce/accounting/permissions): who can see and change what. ## Related pages - [Invoices](https://workstation.repzo.com/docs/commerce/invoices) - [Orders](https://workstation.repzo.com/docs/commerce/orders) - [Settings](https://workstation.repzo.com/docs/administration/settings) --- # Setting Up Accounting > Enable Accounting, choose a start date, give members access, and add companies. Accounting is a paid [add-on](https://workstation.repzo.com/docs/commerce/plans-and-add-ons#accounting). Once your workspace has it, it stays off until an administrator turns it on. Enabling it creates a chart of accounts and sets the date your books start. From that date, new invoices, payments, bills, and other documents post to the ledger automatically. Nothing from before the start date is copied in; you bring in the balances you still need on the [Opening balances](https://workstation.repzo.com/docs/commerce/accounting/ledger#opening-balances) page. Enabling Accounting **cannot be undone**, so read this page before you start. ## Before you start Check these four things first: 1. **The Accounting add-on.** Owners and members with `billing.manage` add it in **Billing → Plan**. Without it, **Settings → Accounting** and the Accounting workspace show **Accounting is an add-on** with a link to Billing. 2. **Base currency.** Set it under **Settings → Finance → Currencies**. The wizard reads it and it cannot be changed once your books have activity. 3. **Who else needs access.** Every member who uses Accounting, including you, needs an **Accounting seat** (see [Member access](#member-access)). The owner gets one when the add-on starts. 4. **Permission.** You need the `accounting.manage` permission. Owners and admins have it by default. See [Permissions](https://workstation.repzo.com/docs/commerce/accounting/permissions). ## Enable Accounting Open **Settings → Accounting → General**, or open **Accounting** from the main sidebar and go to **Accounting settings**. If Accounting is not enabled yet, you will see the **Accounting setup** wizard. It has three steps, and nothing changes until you click **Enable accounting** on the last one. ### 1. Start date - **Base currency** is read-only. It comes from your currency settings and is permanent once Accounting is enabled. - **Accounting start date** is the first day your books cover, usually the first day of a month or fiscal year. It cannot be in the future. - **Fiscal year starts** is the month your financial year begins. It sets the yearly boundaries for reports. Transactions dated on or after the start date post automatically. Invoices, bills, and payments dated before it are not posted. If you choose a start date in the past, the wizard warns you: records **already entered** between that date and today are not posted when you enable Accounting. New records you enter afterwards with a date on or after the start date post normally. To get earlier activity into the books, use [Opening balances](https://workstation.repzo.com/docs/commerce/accounting/ledger#opening-balances). ### 2. Account mapping The wizard shows where each kind of amount will post, for example **Customer balances**, **Sales revenue**, **Output tax**, **Bank receipts**, **Inventory value**, and **Temporary Opening**. The defaults come from the standard chart and are right for most businesses. Change a destination only if your reporting policy requires it. Each role only accepts an account of the matching type. **Temporary Opening** is a clearing account used while you enter opening balances. It must reconcile to zero before opening balances are finished. ### 3. Review Check the start date, base currency, fiscal year, and any changed account destinations, then click **Enable accounting**. ## What happens when you enable - A default **chart of accounts** is created with five root groups (Assets, Liabilities, Equity, Income, Expenses) and the system accounts Workstation posts to, such as Cash, Bank, Accounts Receivable, Accounts Payable, Input VAT, Tax Payable, Inventory, and Retained Earnings. See [Chart of accounts](https://workstation.repzo.com/docs/commerce/accounting/chart-of-accounts). - Payment methods are mapped: Cash and Other post to the Cash account; Bank Transfer, Credit Card, Check, and Online post to the Bank account. - A **fiscal year calendar** is created from the start month. - **Accounting access** is switched on for you (used only on [older plans](#workspaces-on-older-plans); on the current plans your Accounting seat already covers you). - New transactions begin posting automatically from the start date. Next, open **Accounting → Opening balances** to bring in what you still owe and are owed, your cash, stock, and other balances as of the start date. See [Opening balances](https://workstation.repzo.com/docs/commerce/accounting/ledger#opening-balances). ## Member access An **Accounting seat** is what lets a member open Accounting. The add-on includes 3 seats; a fourth person is billed as an extra user. See [Seats](https://workstation.repzo.com/docs/commerce/seats). To give someone a seat, open **Settings → Team**, select **Manage seats** on their row, turn on **Accounting** under **Add-ons**, and select **Save seats**. Take the seat away the same way. A member needs both the seat and a role that includes [Accounting permissions](https://workstation.repzo.com/docs/commerce/accounting/permissions). The seat opens Accounting; the role decides what they can do there. This applies to everyone, including the owner and Accounting administrators. Without a seat, Accounting shows **You don't have an Accounting seat** and tells them to ask an admin, and the server refuses Accounting requests. ### Workspaces on older plans Accounting isn't part of the older Starter, Professional, and Enterprise plans. If Workstation support has given your workspace Accounting, it covers everyone on your subscription, and a per-member **Accounting access** switch decides who uses it instead of seats. It is **off** for new members and switched on automatically for whoever enables Accounting. The owner and Accounting administrators (`accounting.manage`) don't need it. To turn it on, open **Settings → Team**, select the member, click **Turn on** (or **Edit access**) on the **Accounting** card, and switch on **Accounting access**. Only owners and users with `accounting.manage` see this card. Every change is recorded in the audit log. ## The General tab After enabling, **Accounting settings → General** holds the company-wide options: | Setting | What it does | |---|---| | Number precision | Decimal places for **Quantity** and **Unit price** (0–9, default 4). Totals follow the currency; exchange rates keep 9 decimals. | | Start date, Base currency | Read-only after enabling. | | Fiscal year starts | Can change only until the calendar is in use. After that, create a transition fiscal year instead. See [Closing the books](https://workstation.repzo.com/docs/commerce/accounting/closing). | | Payment allocation | **Automatic · Earliest due first** or **Manual**. Controls how new payments are matched to open documents. See [Payments](https://workstation.repzo.com/docs/commerce/accounting/payments). | | Customer receipt routing | **Direct to payment account** (default) or **Undeposited Funds**. See [Banking](https://workstation.repzo.com/docs/commerce/accounting/banking#undeposited-funds-and-deposits). | | Deferred revenue | **Auto for memberships** or **Manual only**, prorated by days or months, plus **Recognize through today**. See [Ledger](https://workstation.repzo.com/docs/commerce/accounting/ledger#deferred-revenue). | | Customer credit limits | **Do not check**, **Warn before posting** (default), or **Block · Managers can override**. See [Sales](https://workstation.repzo.com/docs/commerce/accounting/sales#credit-limits-and-holds). | | Locked before | No postings or reversals may be dated before this day. See [Closing the books](https://workstation.repzo.com/docs/commerce/accounting/closing#period-lock). | | Post scheduled entries automatically | **Automatically, daily** (default) or **Only when I post them**. Controls whether fixed-asset depreciation and prepaid expense recognition post on their own. See [Scheduled entries](https://workstation.repzo.com/docs/commerce/accounting/ledger#scheduled-entries). | ## Companies Some organizations keep books for more than one legal entity, for example a company in Saudi Arabia and another in Jordan. Accounting supports this inside one Workstation organization. - Every organization starts with one **group** and one **primary** company. You never have to think about companies if you only have one. - A **company** (legal entity) has its own base currency, fiscal year, start date, transactions, numbering, and reports. - A **group** organizes companies and shares one chart definition. Groups cannot receive postings. Customers, contacts, suppliers, and products are shared across the organization. Their accounting settings, such as payment terms or credit limits, are kept per company. ### Add a company 1. Open **Accounting settings → Entities** and click **New entity**. 2. Choose **Legal entity**, pick its **Accounting group**, and enter a **Code** and **Name**. 3. Choose its **Base currency** and **Reporting currency**. Both must be active in your currency settings. 4. Set **Fiscal year starts** and the **Accounting start date**, then click **Create entity**. A new company is enabled immediately, without the setup wizard. It gets its own copy of the group chart and fiscal calendar, and copies the primary company's settings and account mappings. Base currency cannot change after the company has posted activity, and the primary company cannot be archived. Accounts in the chart are shared within a group: adding, renaming, or removing an account applies to every company in that group, while each company keeps its own balances. ### Switch company When you have more than one company, a company selector appears in the Accounting header. Every screen, document, and report works on the selected company. Your choice is remembered in the browser. For group-wide statements, use the [consolidated reports](https://workstation.repzo.com/docs/commerce/accounting/reports#consolidated-reports). ### Company access By default, a member with Accounting access can work in every company. To restrict someone, open **Entities**, click **Access** on a company or group, and assign members with a level of **View**, **Post**, or **Manage**. You can also mark a company as a member's **Default**. A member's first assignment restricts them to the companies and groups they are assigned. Access to a group covers every company directly under it. You cannot save a change that would remove your own access. ## Related pages - [Accounting overview](https://workstation.repzo.com/docs/commerce/accounting) - [Chart of accounts and posting defaults](https://workstation.repzo.com/docs/commerce/accounting/chart-of-accounts) - [Permissions](https://workstation.repzo.com/docs/commerce/accounting/permissions) - [Settings](https://workstation.repzo.com/docs/administration/settings) - [Team](https://workstation.repzo.com/docs/administration/team) --- # Chart of Accounts and Settings > Organize ledger accounts, choose where payments and taxes post, and configure payment terms and document numbering. The chart of accounts is the list of accounts your ledger posts to, such as Bank, Accounts Receivable, Sales Revenue, and Rent. Workstation creates a standard chart when you [enable Accounting](https://workstation.repzo.com/docs/commerce/accounting/setup), and most businesses only need to add a few accounts of their own. All the settings on this page live in **Accounting → Accounting settings**. They apply to the company selected in the header, and you need the `accounting.manage` permission to change them. The settings page has these tabs: | Tab | What it holds | |---|---| | General | Start date, precision, allocation, receipt routing, deferred revenue, credit-limit policy, period lock. See [Setting up Accounting](https://workstation.repzo.com/docs/commerce/accounting/setup#the-general-tab). | | Entities | Companies and groups. See [Companies](https://workstation.repzo.com/docs/commerce/accounting/setup#companies). | | Intercompany | Related-company account pairs and elimination journals. See [Ledger](https://workstation.repzo.com/docs/commerce/accounting/ledger#intercompany-and-eliminations). | | Chart of accounts | The account tree (this page). | | Posting defaults | Where payment methods, taxes, discounts, and products post, plus withholding tax categories (this page). | | Payment terms | Reusable due-date and installment templates (this page). | | Numbering | Document number formats (this page). | | Fiscal years | Fiscal calendar and year-end close. See [Closing the books](https://workstation.repzo.com/docs/commerce/accounting/closing). | ## Chart of accounts Accounts are arranged in a tree under five root groups: **Assets**, **Liabilities**, **Equity**, **Income**, and **Expenses**. Search by code, name, or purpose, and use **Expand all** or **Collapse all** to browse. There are two kinds of account: - **Group accounts** organize other accounts. They cannot receive postings. - **Posting accounts** receive journal lines. Every document line posts to one of these. Accounts marked **System** are the ones Workstation posts to automatically, such as Accounts Receivable, Accounts Payable, Input VAT, Tax Payable, Inventory, Undeposited Funds, FX Gain/Loss, and Retained Earnings. You can rename them, but you cannot move, archive, or delete them, or change their purpose. ### Add an account 1. Click **Add account**, or **Add child** on a group. 2. Enter a unique **Code** and a **Name**. 3. Choose the **Parent account**. The account takes its type (asset, liability, and so on) from its parent. 4. Leave **Group account** clear for a posting account. 5. Choose an **Account purpose**. The purpose tells Workstation how the account is used. For example, only accounts with the **Bank** or **Cash** purpose appear in payment and banking screens, and only **Receivable** accounts can be used as an invoice's Debit To account. 6. Optionally set **Balance must be** (debit or credit) to stop the account from going the wrong way, an **Account currency**, and a description. Available purposes depend on the type: | Type | Purposes | |---|---| | Asset | Bank, Cash, Receivable, Tax, Inventory, Fixed asset, Accumulated depreciation, Temporary | | Liability | Payable, Tax, Temporary | | Equity | Equity, Temporary | | Income | Income, Temporary | | Expense | Cost of goods sold, Depreciation, Expense, Rounding, Temporary | To hold money in another currency, create a posting account with the **Bank** or **Cash** purpose and choose its **Account currency**. See [Foreign-currency bank accounts](https://workstation.repzo.com/docs/commerce/accounting/banking#foreign-currency-bank-accounts). ### Change, archive, or delete an account - Use **View ledger** on a posting account to open its [General ledger](https://workstation.repzo.com/docs/commerce/accounting/reports#general-ledger). - Once an account has ledger activity, its type, group setting, and currency are fixed. - **Archive** hides a custom account from pickers while keeping its history. You cannot archive an account that has children or is used in a mapping. - **Delete** is only possible for a custom account with no ledger activity, children, mappings, or references. - With the `audit_logs.view` permission, the history icon shows every change to an account. If you keep books for several companies in one group, adding, renaming, or removing an account applies to every company in that group. Balances stay separate per company. ## Posting defaults The **Posting defaults** tab controls where amounts post when a document does not say otherwise. ### Account mappings - **Payment methods.** Choose the bank or cash account each payment method posts to. An unmapped custom method uses the mapping of its **Category** (set under **Settings → Finance → Payment Methods**); anything still unmapped uses the Cash account. **Gift card** and **Store credit** map to a liability account instead (default: Gift Cards and Store Credit), because spending a prepaid balance does not bring in new cash. See [Gift Cards](https://workstation.repzo.com/docs/commerce/gift-cards#accounting). - **Tax rates.** Choose the liability account each tax rate's output tax posts to. Unmapped rates use Tax Payable. Tax on bills and expenses (input tax) always posts to Input VAT. - **Post discounts separately.** When off (the default), sales post net of discounts. When on, sales post at their gross amount and discounts are debited to the **Default discount expense account**. An invoice or a single line can override the account. Each posted invoice keeps the policy it was posted with, so changing this later does not rewrite history. ### Withholding tax Define the withholding tax categories used on supplier bills: a name, a rate, and the liability account the withheld amount is credited to. See [Withholding tax](https://workstation.repzo.com/docs/commerce/accounting/purchases#withholding-tax). ### Product and category defaults Choose accounts for a product category or an individual product: **Sales income**, **Sales returns**, **Purchase expense**, **Sales discount**, **Inventory asset**, **Cost of goods sold**, and **Deferred revenue liability**. The most specific setting wins: product, then category, then the company default. Each document saves the accounts it resolved when it is posted, so changing a default later does not change posted documents. ## Payment terms Payment terms decide a document's due date, and can split it into installments. Workstation includes standard templates: **Due on receipt**, **Net 7**, **Net 15**, **Net 30**, **Net 45**, **Net 60**, and **End of month**. They cannot be edited or archived. To create an installment schedule, click **New template**. For example, "50% now, 50% in 30 days": | Label | Portion % | Due from | Days | |---|---|---|---| | Deposit | 50 | Document date | 0 | | Balance | 50 | Document date | 30 | Installments must add up to exactly 100%. **Due from** can be the document date, the end of the document month, or a month end after it. Which template a new invoice or bill uses: 1. The template chosen on the document. 2. The customer's or supplier's default, set on their **Accounting** tab. 3. The **Organization default** on this tab. 4. **Due on receipt**. The template and the generated installments are copied onto the document when the draft is saved, so editing a template never changes existing documents. The document's due date is its last installment. Choose **Custom due date** on a document when no template fits. Installments show up in [Payments](https://workstation.repzo.com/docs/commerce/accounting/payments) (automatic allocation pays the earliest installment first) and in [aging reports](https://workstation.repzo.com/docs/commerce/accounting/reports#receivables-and-payables-aging), where each unpaid installment sits in its own bucket. ## Document numbering The **Numbering** tab sets how each accounting document is numbered. Each type has its own sequence: | Document | Default prefix | |---|---| | Invoice | INV | | Credit note | CN | | Bill | BILL | | Vendor credit | VC | | Payment | PAY | | Expense | EXP | | Journal entry | JE | | Landed cost | LCV | | Bank deposit | DEP | | Asset disposal | AD | | Prepaid expense | PRE | | Period closing voucher | PCV | | Stock adjustment | SA | | Stock transfer | ST | Click **Edit** to change the **Prefix**, **Next number**, **Number length**, and **Sequence reset** (never, each calendar year, or each fiscal year). The preview shows the next number. A few rules keep numbers trustworthy: - Changes apply to new documents only. - The next number can move forward, never backward. - Cancelled and voided numbers stay used. - Invoice and credit-note numbering is locked while ZATCA is connected or once an invoice has been submitted. - A supplier's own invoice number goes in the bill's **Reference** field, separate from your bill number. ## Related pages - [Setting up Accounting](https://workstation.repzo.com/docs/commerce/accounting/setup) - [Sales](https://workstation.repzo.com/docs/commerce/accounting/sales) - [Purchases](https://workstation.repzo.com/docs/commerce/accounting/purchases) - [Settings](https://workstation.repzo.com/docs/administration/settings) --- # Sales > Post invoices and credit notes, write off bad debts, and set per-customer credit limits, holds, and defaults. Sales in Accounting are your customer invoices and credit notes, plus the customer records they belong to. Accounting uses the same invoices as **Commerce → Invoices**: an invoice created in either place is the same document, and it posts to the ledger when it is opened. The Accounting screens add what a bookkeeper needs: the receivable and income accounts, the tax breakdown, a ledger preview, and stock posting. ## Invoices Open **Accounting → Invoices**. The list has tabs for common views (such as drafts, open, overdue, and credit notes) plus filters for status, type, and dates. Click **New Invoice** to create one. ### Create and post an invoice 1. Choose **Customer type** (**Customer company** or **Individual customer**) and the **Customer**. 2. Set the **Invoice date** and choose **Payment terms**, or **Custom due date** and a **Due date**. 3. Choose the **Currency**. For a foreign currency, check the **Exchange rate** (see [Currency and exchange rate](#currency-and-exchange-rate)). 4. Add lines. Click the product cell to pick a catalog product or variant, or use **Add custom line** for a free-text line. 5. Click **Save draft**. 6. When the draft is complete, click **Post invoice**. Posting writes the journal entry and makes the invoice payable. After that the invoice can only be corrected with a credit note or a void. If something required is missing, a **Complete the required fields** list tells you what. Choosing a customer applies their accounting settings to a new invoice: their currency, receivable account, price list, tax exemption, and payment terms. See [Customer settings](#customer-accounting-settings). ### Accounting details Expand **Accounting details** to see and change how the invoice posts: - **Debit To (Accounts Receivable)** is the receivable account the customer balance goes to. It must be a receivable account. Later payments, credit notes, write-offs, aging, and statements all follow the same account. - Each line has an **Income account** and, when discounts post separately, a **Line discount account**. - **Tax breakdown** shows each tax rate's taxable amount, tax amount, and the account it posts to (from [Posting defaults](https://workstation.repzo.com/docs/commerce/accounting/chart-of-accounts#account-mappings)). - **Draft ledger preview** shows the exact journal entry, and whether it balances, before you post. A posted invoice shows the same information read-only. ### Currency and exchange rate Each invoice has a currency and an exchange rate to the company's base currency. The rate defaults to the latest recorded rate **on or before the invoice date**, so an invoice dated last month uses last month's rate. The hint under the field shows which rate was used, for example `1 EUR = 4.05 SAR · rate of 2026-08-31`. - Type a different rate if you need to. It is kept until you change the currency or date. Click **Use rate of …** to go back to the recorded rate. - If no rate is recorded on or before the date, Workstation warns you and uses the current rate. The invoice shows amounts in its own currency. The ledger always records them in the base currency. ### Update stock Turn on **Update stock** when the invoice also delivers tracked products. Choose the **Inventory location** and check the **Stock impact** table (available quantity and estimated cost of goods sold). When the invoice posts, stock is issued first, then the invoice and its Cost of Goods Sold and Inventory entries are written together. If stock is short or anything fails, nothing changes and the invoice stays a draft. A posted Update stock invoice cannot be edited or deleted; use a credit note or a void. ### Deferred revenue For a service delivered over time, tick **Defer over service period** on a line and choose its start and end dates. The revenue then posts to a deferred revenue account and is recognized over the period. See [Deferred revenue](https://workstation.repzo.com/docs/commerce/accounting/ledger#deferred-revenue). ### After posting A posted invoice offers: - **Record payment** opens a new payment for this customer, allocated to this invoice. See [Payments](https://workstation.repzo.com/docs/commerce/accounting/payments). - **Create credit** creates a credit note against it. - **Void invoice** reverses it completely. - **View ledger** (in the **⋯** menu) opens the General ledger filtered to its entries. ### Editing and voiding a posted invoice Voiding reverses the invoice's payments recorded in the CRM, its stock movement, and its journal entry, dated today. Voiding is not possible while ZATCA is connected, while a posted payment in Accounting is allocated to the invoice, or while the invoice is written off. Editing a posted invoice is only possible when your invoice settings allow it and the invoice has no payments, allocations, write-off, or stock posting. Workstation then reverses the old entry and posts a new one. It never changes the original lines. ## Credit notes A credit note reduces what a customer owes, for example for returned goods or an overcharge. **Against an invoice.** On a posted invoice, click **Create credit**. Enter a **Reason** and the quantity to credit on each line (you cannot credit more than was invoiced, including earlier credits), then click **Create and post credit**. The credit note posts immediately and copies the invoice's customer, currency, rate, accounts, and stock settings. If the invoice updated stock, the returned quantity goes back to the same location. **Standalone.** In the invoice editor, tick **This is a customer credit (you owe the customer back)**, then save and post it like an invoice. A credit note posts the mirror of an invoice: it credits Accounts Receivable and debits Sales Returns (or the line's account) and tax. ### Applying credit to invoices A credit note created from an invoice (with **Create credit**, or a return, including POS returns) is applied to that invoice automatically when it posts. It reduces the invoice's balance and installments, and anything left over stays as customer credit. To use unapplied credit on other invoices, click **Apply credit** on the credit note, or on the customer's **Accounting** tab next to **Unapplied credits**. Then: 1. Enter the **Credit to use** on each open invoice. You can split it across several invoices of the same customer and currency. 2. Check the **Application date**. It defaults to today and cannot be earlier than either document. Locked periods are refused. 3. Click **Apply credit**. Each application posts a balanced ledger entry with the source **Credit application** (you can filter for it in **Journal entries**). If the two documents were posted at different exchange rates, the difference goes to **FX Gain/Loss**. Both documents list their **Credit applications**. **Unapply** reverses one, dated today. Voiding either document reverses its applications, and an issued invoice with applied credit cannot be edited until the credit is unapplied. An invoice fully covered by credit shows as **Paid**. Its **Paid** row counts cash payments only, so the amount covered by credit is shown under **Credit applications**. Use **Record refund** on a credit note to pay the money back instead. ## Write-offs When an invoice will not be paid, write it off as bad debt: 1. Open **Reports → Receivables aging** and click the customer. 2. In the list of open documents, click **Write off** on the invoice. 3. Confirm. The outstanding amount moves from Accounts Receivable to Bad Debt, dated today. The invoice keeps its **Open** status but its amount due becomes zero, it stops counting as a receivable, and its totals show a **Written off** row. While an invoice is written off, it cannot be edited or voided. If the customer pays after all, open the invoice in **Accounting → Invoices** and click **Reverse write-off** (this needs the Sales manage permission). The bad-debt entry is reversed on today's date and the amount is due from the customer again, so the invoice can be paid, edited, or voided as usual. ## Customers **Accounting → Customers** lists every company (Account) and every standalone Contact. A contact who belongs to a company is represented by that company, so a customer is never counted twice. The list shows outstanding and overdue amounts, credit limit, open invoices, and last payment, and marks customers **On hold**. Open a customer to see their **Accounting** tab: outstanding, overdue, credits, open documents, recent ledger activity, their default payment terms, and their accounting settings. Click **Open in CRM** to jump to the full CRM record if your role allows it. Customers are created in the CRM, not in Accounting. See [Accounts](https://workstation.repzo.com/docs/sales/accounts) and [Contacts](https://workstation.repzo.com/docs/sales/contacts). ## Customer accounting settings Some defaults can be changed for one customer. On the customer's **Accounting** tab, click **Edit** on **Accounting settings**. Anything you leave on **Company default** keeps following the company-wide value, so a later company change still reaches that customer. Settings are stored per company: the same customer can have different terms in two legal entities. | Setting | What it does | |---|---| | Credit limit | Maximum open receivables. Leave empty for no limit. | | When the limit is exceeded | **Warn**, **Block**, or **Don't check this customer**, instead of the company policy. | | Put customer on credit hold | Stops posting new invoices and on-account POS sales. Drafts can still be saved and payments are still accepted. | | Release on | The hold lifts automatically on this date. | | Invoice currency | Pre-selected on new invoices. | | Receivable account | The **Debit To** account for new invoices, for example a separate account for related-party receivables. | | Price list | Pre-selected on new invoices; newly added products take the list price. | | Tax exempt | Invoice lines for this customer use the zero-tax rate. | ### Credit limits and holds The company-wide policy is under **Accounting settings → General → Customer credit limits**: **Do not check**, **Warn before posting** (default), or **Block · Managers can override**. A customer's own setting wins. A customer's exposure is their open invoices in the base currency, less open credit notes. When posting would take them over their limit: - **Warn** shows a warning in the invoice editor's post dialog. You can still post. - **Block** stops posting. An owner, an admin, or a user with `accounting.manage` or `accounting.sales_manage` can post anyway by entering an **Override reason**, which is recorded in the audit log. The override is available in the Accounting invoice editor; other screens, including POS, simply block. A credit hold is stricter: it blocks posting regardless of the limit, until it is released or its **Release on** date arrives. ## Related pages - [Invoices](https://workstation.repzo.com/docs/commerce/invoices) - [Payments](https://workstation.repzo.com/docs/commerce/accounting/payments) - [Receivables aging and customer statement](https://workstation.repzo.com/docs/commerce/accounting/reports#receivables-and-payables-aging) - [Chart of accounts and settings](https://workstation.repzo.com/docs/commerce/accounting/chart-of-accounts) --- # Purchases > Record supplier bills and vendor credits, expenses, landed costs, and prepaid expenses; manage suppliers, holds, and withholding tax. Purchases cover what you buy: supplier **bills** you will pay later, **expenses** you have already paid, **landed costs** that belong in your inventory value, and **prepaid expenses** you recognize over time. They all post to the same ledger as your sales. Which document to use: | Situation | Document | |---|---| | A supplier sent an invoice you will pay later | [Bill](#bills) | | A supplier owes you money back (return, over-billing) | [Vendor credit](#vendor-credits) | | You already paid, for example by card or cash | [Expense](#expenses) | | Freight, duty, or insurance should be added to stock cost | [Landed cost](#landed-costs) | | You paid up front for a period, such as a year of insurance | [Prepaid expense](#prepaid-expenses) | ## Bills A bill records what a supplier has invoiced you. Posting it credits Accounts Payable, so the amount shows as owed to the supplier until you pay it. Open **Accounting → Bills** and click **New bill**. The list has tabs for common views such as drafts, unpaid, overdue, and vendor credits, and filters for supplier, status, and date. ### Create and post a bill 1. Choose the **Supplier**. Their default payment terms, bill currency, withholding tax category, and payable account are filled in. The supplier list marks suppliers that are **· Inactive** or **· On hold**. 2. Enter the supplier's invoice number in **Reference**. A reference can be used only once per supplier, which stops the same invoice being entered twice. 3. Set the **Bill date** and choose **Payment terms** or a **Due date**. 4. Choose the **Currency** and check the **Exchange rate** if it is foreign. 5. Add lines. A line with a product calculates **Qty** × **Unit cost**; a line without a product is an expense-only line. 6. Click **Save draft**, then **Post bill**. Once posted, a bill cannot be edited or deleted. To correct it, cancel it or create a vendor credit. ### Accounting details Expand **Accounting details** to see: - **Credit To (Accounts Payable)**: the payable account for the supplier balance. It comes from the bill, then the supplier's settings, then the company default. - A **Posting account** for each line. A line without a product uses the supplier's **Default expense account**, or the company's general expenses account if the supplier has none. - The **Input VAT** and **Purchase price variance** accounts. - A **ledger preview** that shows whether the entry balances. - The **Payment schedule** when the payment terms have installments. When a bill posts, each line's amount is debited to its posting account, tax is debited to Input VAT, and the total (less any withholding tax) is credited to Accounts Payable. ### Update stock Leave **Update stock** off for a financial-only bill. Product lines then post to the line's account without changing inventory. Turn it on when the bill also receives goods. Choose the **Inventory location** and review the **Stock impact**. On posting, the products are received into stock and their lines post to Inventory. Cancelling the bill reverses only the stock movement it created. ### Foreign-currency bills Bills work like invoices: each has a currency and an exchange rate to the company currency. The rate defaults to the latest rate **on or before the bill date**. You can type a different rate; **Use rate of …** restores the recorded one. The bill shows amounts in its own currency; the ledger always records them in the base currency. When you pay a foreign-currency bill, Accounts Payable is cleared at the bill's rate and the bank at the payment's rate. The difference posts to **FX Gain/Loss**. Open foreign-currency payables are also included in [Currency revaluation](https://workstation.repzo.com/docs/commerce/accounting/ledger#currency-revaluation). ### After posting - **Record payment** opens a new payment to the supplier, allocated to this bill. See [Payments](https://workstation.repzo.com/docs/commerce/accounting/payments). - **Create credit** starts a vendor credit against the bill. - **Add landed cost** (for Update stock bills) starts a landed cost voucher. - **Cancel bill** posts a reversing entry, dated today, and reverses the stock movement. A bill with a posted payment allocated to it cannot be cancelled until that payment is cancelled. - **View ledger** (in the **⋯** menu) opens its ledger entries. ## Vendor credits A vendor credit records money a supplier owes you back. It posts the mirror of a bill. - **Against a bill:** click **Create credit** on the posted bill. The lines, supplier, payable account, and withholding tax are copied. The credit must use the bill's currency, and all credits together cannot exceed the bill's total. - **Standalone:** on a new bill, tick **This is a vendor credit (the supplier owes you back)**. If the credit returns stocked products, they leave stock at the current average cost; any difference posts to Purchase Price Variance. A vendor credit created from a bill is applied to that bill automatically when it posts, reducing its balance and installments; any remainder stays as supplier credit. To use unapplied credit on other bills of the same supplier and currency, click **Apply credit** on the vendor credit, or on the supplier's **Accounting** tab. Applying, unapplying, and voiding work the same way as for [customer credit notes](https://workstation.repzo.com/docs/commerce/accounting/sales#applying-credit-to-invoices). Use **Record refund** when the supplier pays you back instead. ## Expenses An expense records money you have already spent, so there is nothing to pay later. Examples: a card payment for software, or petty cash for office supplies. 1. Open **Accounting → Expenses** and click **New expense**. 2. Set the **Date** and choose **Paid from**, the bank or cash account the money left. 3. Optionally choose a **Supplier**. 4. Add lines with an **Account**, amount, and tax rate. If you chose a supplier with a **Default expense account**, a line left without an account uses it. 5. Click **Save draft**, then **Post expense**. Posting debits each line account and Input VAT, and credits the Paid from account. Expenses are entered in the base currency. **Cancel expense** posts a reversal dated today. ## Landed costs Landed costs are extra costs of getting goods into stock, such as freight, customs duty, or insurance. Adding them to inventory value makes your cost of goods sold accurate. A landed cost voucher applies to posted bills that have **Update stock** on. The charges themselves must already be recorded, usually on a separate bill from the freight company, to an expense account. The voucher moves that cost from the expense account into inventory. 1. Open **Accounting → Landed costs** and click **New landed cost**, or click **Add landed cost** on a bill. 2. Set the posting date and choose **Distribute charges by**: **Quantity**, **Item amount**, or **Distribute manually**. 3. Select the stock bills. 4. Under **Taxes and charges**, add each charge's expense account and amount. 5. Review the **Item allocation**, click **Save draft**, then post the voucher from its page. The part of the cost for goods still in stock is added to inventory value; the part for goods already sold goes to Cost of Goods Sold. The voucher page shows both as **Still in inventory** and **Recognized in COGS**. Cancelling reverses both. ## Prepaid expenses A prepaid expense is a cost paid up front for a future period. For example, you pay 12,000 for a year of insurance in January. Instead of 12,000 of expense in January, you want 1,000 each month. 1. Record the payment first as a posted expense, bill, or journal entry. 2. Open **Accounting → Prepaid expenses** and click **New prepaid expense**. 3. Choose the **Posted expense** line, the **Amount to prepay**, and the **Prepaid asset account** (defaults to Prepaid Expenses). 4. Choose the **Recognition basis** (**Exact days** or **Monthly**) and the start and end dates. 5. Click **Save draft**, then post the schedule. Posting moves the amount from the expense account to the prepaid asset. Recognition then moves it back to expense over the period. Recognition posts automatically at each month end (see [Scheduled entries](https://workstation.repzo.com/docs/commerce/accounting/ledger#scheduled-entries)). **Recognize through today** on the Prepaid expenses page catches up everything due for every active schedule straight away. Cancelling a schedule reverses its recognitions, dated today. ## Suppliers **Accounting → Suppliers** lists the same suppliers used by bills and inventory; there is no second vendor list. Tabs show suppliers with a balance, overdue, or on hold. Click **New supplier** or **Edit** to manage the name, contact details, **Tax ID**, **Default payment terms**, **Default expense account** (used for bill and expense lines left without an account), **Active** status, and **Bank details** (bank name, account holder, IBAN, SWIFT/BIC, account number). A supplier's **Accounting** tab shows outstanding, overdue, credits, open documents, and ledger activity. Supplier is also available under **Settings → Objects** and **Settings → Properties**, where administrators can configure its detail layout and add custom properties. See [Objects](https://workstation.repzo.com/docs/administration/objects) and [Properties](https://workstation.repzo.com/docs/administration/properties). ### Supplier accounting settings On the supplier's **Accounting** tab, click **Edit** on **Accounting settings**. Leave a setting on **Company default** to keep following the company-wide value. Settings are stored per company. | Setting | What it does | |---|---| | Put supplier on hold | Stops new bills and/or payments until released. | | Block | **Bills and payments**, **New bills only**, or **Payments only**. | | Release on | The hold lifts automatically on this date. | | Bill currency | Pre-selected on new bills and supplier payments. | | Payable account | The **Credit To** account for new bills. | | Pay from | The bank or cash account pre-selected when paying this supplier. | | Withholding tax | The category deducted from new bills. | ### Supplier holds A hold is useful while a dispute is open or while you are waiting for tax documents. - **New bills only** blocks saving and posting bills and vendor credits for the supplier. - **Payments only** blocks paying the supplier. - **Bills and payments** blocks both. - Refunds received from the supplier are never blocked. A hold applies to documents dated before the **Release on** date. A supplier on hold is marked **On hold** in the list and shows a banner on its Accounting tab. ## Withholding tax Withholding tax is tax you deduct from a supplier's bill and pay to the tax authority yourself, for example on services from a non-resident supplier. The supplier is owed the bill total minus the withheld amount. ### Set up categories Open **Accounting settings → Posting defaults → Withholding tax** and click **Add withholding tax**. Enter a **Name**, a **Rate (%)**, and the **Liability account** the withheld amount is credited to. The account must be a liability account other than Accounts Payable. Categories cannot be deleted, because posted bills keep a copy of them. Clear **Active** to stop offering one on new bills. ### How it works on a bill Choose a **Withholding tax** category on the bill, or let the supplier's default fill it in. Choose **No withholding** to skip it. The amount is calculated on the **pre-tax subtotal**. For example, a bill for 10,000 plus 15% VAT, with 5% withholding: | Account | Debit | Credit | |---|---|---| | Expense | 10,000 | | | Input VAT | 1,500 | | | Withholding tax payable | | 500 | | Accounts Payable | | 11,000 | The expense and VAT post at full value. The supplier is owed 11,000, shown on the bill as **Payable to supplier**. The bill's amount due, the supplier's balance, [Payables aging](https://workstation.repzo.com/docs/commerce/accounting/reports#receivables-and-payables-aging), and payment allocations all use that net amount. The 500 stays in the liability account until you pay the tax authority, for example with a journal entry or expense. A vendor credit against the bill reuses the bill's withholding rate. ## Related pages - [Payments](https://workstation.repzo.com/docs/commerce/accounting/payments) - [Chart of accounts and settings](https://workstation.repzo.com/docs/commerce/accounting/chart-of-accounts) - [Payables aging](https://workstation.repzo.com/docs/commerce/accounting/reports#receivables-and-payables-aging) - [Stock ledger](https://workstation.repzo.com/docs/commerce/accounting/reports#stock-ledger) --- # Payments > Receive money from customers and pay suppliers, allocate payments to documents, hold advances, and settle in another currency. A **Payment Entry** records money moving through a bank or cash account: a customer paying you, or you paying a supplier. It then **allocates** that money to the invoices or bills it settles. One payment can settle several documents, part of a document, or nothing yet (an advance). ## Record a payment The quickest way is from the document: click **Record payment** on a posted invoice or bill (or **Record refund** on a credit). A new payment opens with the party, the amount, and the currency already filled in, and the amount allocated to that document (to its open installments, earliest due first, if it has a payment schedule). To start from scratch, open **Accounting → Payments** and click **New payment**: 1. **Payment type**: **Receive** (money in) or **Pay** (money out). 2. **Party type** (**Customer company**, **Individual customer**, or **Supplier**) and **Party**. 3. **Payment date** and **Bank/Cash account**. 4. **Currency**, **Exchange rate** (for a foreign currency), and **Payment amount**. 5. Optionally a **Reference number**, **Reference date**, and **Memo**. 6. Allocate the amount under **Allocate to open documents** (see below). 7. Click **Save draft**, then **Post payment**. Posting writes the bank movement and the allocations to the ledger. The payment number is assigned when the draft is first saved. Receiving from a customer and paying a supplier are the usual cases. **Pay** to a customer refunds a credit note, and **Receive** from a supplier records a refund of a vendor credit. ## Allocations The **Allocate to open documents** table lists the party's open invoices or bills. Documents with installments show one row per installment. - With **Payment allocation** set to **Automatic · Earliest due first** (the default, under **Accounting settings → General**), the amount is spread over the earliest due documents first. You can change any row. - With **Manual**, you type each allocation. - In either mode, **Allocate payment** fills the rows by earliest due date. The **Payment summary** shows how much is **Allocated**, any **Deductions**, and the **Unallocated advance**. You cannot allocate more than the payment or more than a document's outstanding balance. For example, a customer pays 5,000 against two invoices of 3,000 and 4,000. Automatic allocation settles the older 3,000 invoice in full and puts 2,000 on the second, which stays open with 2,000 due. ### Deductions and charges Use **Deductions and charges** when the money that arrived differs from what the documents say, for example a 25 bank fee taken from a customer transfer. Add a row with the fee account, **Debit** or **Credit**, and the amount. The invoice is settled in full and the fee is recorded as an expense. ## Advances Money you do not allocate is held as an **advance**: a customer prepayment or a supplier deposit. It posts to the customer or supplier advances account and is shown as **Unallocated** in the payments list. To use it later, open the posted payment and click **Allocate advance**. The dialog lists the party's open documents, with one row per installment. Enter amounts, or click **Allocate by due date** to fill them earliest due first, then click **Apply advance**. The application is dated today. For a document in another currency, the dialog shows the same **Settles** column and **Expected FX gain** or **Expected FX loss** as a new payment (see [Settling a document in another currency](#settling-a-document-in-another-currency)). ## Cancel a payment **Cancel payment** on a posted payment reverses all of its ledger effects and restores the balance of every document it settled. The reversal is dated today, and the original stays as history. Drafts can be deleted instead. While a posted payment is allocated to an invoice or bill, that document cannot be voided, cancelled, or edited. Cancel the payment first. ## Foreign currency ### Exchange rates by document date Invoices, bills, and payments all use the same rule: the exchange rate defaults to the latest recorded rate **on or before the document's date**. A payment dated 15 March uses the rate recorded for 15 March (or the last one before it), not today's rate. You can type a different rate; the hint shows whether the rate was recorded or entered manually. Record dated rates under **Settings → Finance → Currencies**. If no rate exists on or before the date, Workstation warns you and uses the current rate. ### Which bank account you can use The bank or cash account must be in the payment's currency or in the base currency. For example, a USD payment can go through a USD bank account or a base-currency SAR account, but not a EUR account. ### Settling a document in another currency A payment can settle a document in a different currency. For example, you receive SAR into your SAR bank for an invoice raised in USD. When the payment and the document currencies differ, the allocation table shows a **Settles (SAR)** column. The allocation is entered in the document's currency (how much of the USD invoice is paid), and **Settles** is how much of the SAR payment that uses. Settles is filled in from the dated rates and can be adjusted to what the bank actually converted. ### Exchange gain or loss A foreign-currency document is cleared at the rate it was posted with, while the bank moves at the payment's rate. The difference is a realized exchange gain or loss, posted to **FX Gain/Loss**. The payment summary shows it as **Expected FX gain** or **Expected FX loss** before you post. For example, you post a 1,000 USD invoice at 3.75 (3,750 SAR receivable). The customer pays 1,000 USD when the rate is 3.76. The bank receives 3,760 SAR, the receivable is cleared at 3,750 SAR, and 10 SAR posts to FX Gain/Loss as a gain. ## Undeposited Funds If **Customer receipt routing** is set to **Undeposited Funds** (under **Accounting settings → General**), customer receipts post to the Undeposited Funds account instead of the bank or cash account chosen on the payment. You then group them into a bank deposit. See [Undeposited funds and deposits](https://workstation.repzo.com/docs/commerce/accounting/banking#undeposited-funds-and-deposits). ## Holds A supplier on a **Payments only** or **Bills and payments** hold cannot be paid. Refunds received from a supplier are never blocked. A customer credit hold does not block receiving money. See [Supplier holds](https://workstation.repzo.com/docs/commerce/accounting/purchases#supplier-holds). ## Payments recorded in the CRM Payments recorded on an invoice's **Payment** tab in **Commerce → Invoices** also post to the ledger when Accounting is enabled, and settle the same invoice. Use Payment Entries when you need allocations across several documents, advances, deductions, or foreign-currency settlement. ## Opening advances To bring a customer or supplier advance into your opening books, use **Opening balances → Customer and supplier advances**. It opens a **New opening payment** that posts on the accounting start date and stays available as an advance. See [Opening balances](https://workstation.repzo.com/docs/commerce/accounting/ledger#opening-balances). ## Related pages - [Sales](https://workstation.repzo.com/docs/commerce/accounting/sales) - [Purchases](https://workstation.repzo.com/docs/commerce/accounting/purchases) - [Banking](https://workstation.repzo.com/docs/commerce/accounting/banking) - [Receivables and payables aging](https://workstation.repzo.com/docs/commerce/accounting/reports#receivables-and-payables-aging) --- # Banking > Set up bank and cash accounts, import statements, match them to the ledger, deposit receipts, and transfer money. Banking is where you check your books against the bank. You import the bank's statement, match each line to the payment, expense, or transfer already in your ledger, and deal with anything that is missing. When every line is matched, you know your bank balance in Workstation is right. Open **Accounting → Banking**. The page works on one bank or cash account at a time: pick it in **Pick a bank or cash account**. ## Bank and cash accounts Bank and cash accounts are ordinary accounts in the [chart of accounts](https://workstation.repzo.com/docs/commerce/accounting/chart-of-accounts) with the **Bank** or **Cash** purpose. The standard chart includes Cash, Bank, and Undeposited Funds. To add a bank account, for example a second bank, go to **Accounting settings → Chart of accounts**, click **Add account**, place it under the same group as Bank, and choose the **Bank** purpose. Only active bank and cash accounts appear in Banking, payments, expenses, and transfers. ### Foreign-currency bank accounts To keep a bank account in another currency, for example a USD account for a SAR company, set its **Account currency** when you create it. The currency must be active in your currency settings and cannot change once the account has activity. A foreign-currency account records both amounts: the USD that moved and its base-currency value at the transaction's rate. Its base-currency value can be restated at month end with [Currency revaluation](https://workstation.repzo.com/docs/commerce/accounting/ledger#currency-revaluation). ## Import a statement 1. Pick the bank account. 2. Click **Import statement** and choose a file downloaded from your bank. Workstation reads **CSV**, **OFX**, and **QFX** files. For CSV, the first row should be a header. It recognizes common column names: | Data | Column names | |---|---| | Date | Date, Transaction date, Posting date, Value date | | Amount | Amount, Transaction amount, Signed amount | | Or separate columns | Debit / Withdrawal / Money out, and Credit / Deposit / Money in | | Description | Description, Details, Name, Payee, Memo, Narrative | | Reference | Reference, Ref, Check number, Cheque number | | Transaction ID | ID, Transaction ID, FITID | For example: ```text Date,Description,Reference,Amount 2026-09-01,STRIPE PAYOUT,PO-8812,4250.00 2026-09-02,OFFICE RENT SEPTEMBER,,-6000.00 ``` Lines already imported are skipped as duplicates, whatever the file format, so importing a CSV after an OFX of the same period does not double your lines. A line counts as a duplicate when its date, amount, and description match an existing line (or its reference, when there is no description). Two lines with different bank transaction IDs are always kept as separate transactions. The toast tells you how many lines were imported and skipped. ## Match statement lines Imported lines start in **To review**. Use the status filter to switch between **To review**, **Matched**, **Excluded**, and **All**. Click a line to see ledger movements that could explain it. Workstation looks for movements on the same account in the same direction within 30 days, and ranks them by amount, date, reference, party name, and your [matching rules](#matching-rules). Each suggestion shows its reasons (for example "Exact amount" or "Same date") and a **high**, **medium**, or **low** confidence badge. - Click **Match** on the right suggestion. The line becomes **Matched** and the date is recorded as its clearance date. - A line can be matched to several ledger movements, and one movement to several lines. For example, one bank deposit line can match three customer receipts. The line shows **Partially matched** with the amount left until it is fully covered. - **Unmatch all** undoes a match. - **Exclude line** removes a line that should not be in the books, such as a duplicate the bank sent. **Restore** brings it back. If nothing matches, the payment or expense has not been recorded yet. Record it (for example as an [expense](https://workstation.repzo.com/docs/commerce/accounting/purchases#expenses), a [payment](https://workstation.repzo.com/docs/commerce/accounting/payments), or a [transfer](#transfer-money)), then match the line. Matching only records that the bank line and the ledger movement belong together. It never changes the ledger itself. A journal entry that has been matched cannot be cancelled until it is unmatched. ## Matching rules Rules help Workstation suggest the right movement for lines you see every month. Click **Matching rules**, then **New rule**: - **Rule name** and **Priority**. - **Description condition**: **Contains**, **Starts with**, **Ends with**, or **Exact match**, and the **Description text**, for example `STRIPE PAYOUT`. - **Movement**: **Money in**, **Money out**, or **Any movement**. - Optional **Minimum amount** and **Maximum amount**. - Optional **Party type** and **Party**, and a **Counterparty account**. When a line matches a rule, suggestions with that party or counterparty account rank higher and show "Rule party" or "Rule account" as a reason. Rules suggest; they never match automatically. Use stable words from the bank description, and keep rules narrow enough to avoid ambiguous suggestions. Pause a rule by clearing **Active**. ## Undeposited funds and deposits Many businesses collect several cheques or card payments and take them to the bank as one deposit. The bank statement then shows one line, not one per customer. Undeposited Funds keeps those two views in step. Turn it on under **Accounting settings → General → Customer receipt routing → Undeposited Funds**. From then on: 1. Customer receipts post to the **Undeposited Funds** account, not to the bank or cash account chosen on the payment. 2. When you bank them, click **Create deposit** on the Banking page. 3. Choose **Deposit to** (a base-currency bank account), the **Deposit date**, and an optional **Bank reference**. 4. Tick the receipts in the deposit. Use **Load more receipts** if there are many; your selection is kept. A deposit can include up to 500 receipts. 5. Click **Post deposit**. The deposit moves the total from Undeposited Funds to the bank in one entry, so it matches the single line on your statement. A deposit cannot be dated before its receipts. ### Reverse a deposit Click **Deposits** on the Banking page to see your bank deposits (use **Load more** for older ones). To undo one, click **Reverse**, choose the **Reverse on** date (not before the deposit date), and confirm. Workstation posts the mirror entry and the deposit's receipts go back to Undeposited Funds, ready for another deposit. A deposit that is matched to a bank statement line must be unmatched first. A receipt that is in a deposit cannot be cancelled until the deposit is reversed. Refunds are never routed through Undeposited Funds. ## Transfer money Use **Transfer money** to move money between two of your own bank or cash accounts, for example from the bank to petty cash. 1. Choose the **From** and **To** accounts. 2. Enter the **Amount sent** and the **Date**. 3. Between two currencies, check both rates and optionally enter the **Amount received** the bank actually credited. Leave it blank to calculate it from the two rates. 4. Click **Record transfer**. A transfer posts one entry that credits the source and debits the destination. If the base values sent and received differ, the difference posts to **FX Gain/Loss**, and the dialog tells you how much before you save. Between two accounts in the same currency, the amounts must be equal. ## Related pages - [Payments](https://workstation.repzo.com/docs/commerce/accounting/payments) - [Purchases](https://workstation.repzo.com/docs/commerce/accounting/purchases) - [Chart of accounts and settings](https://workstation.repzo.com/docs/commerce/accounting/chart-of-accounts) - [Currency revaluation](https://workstation.repzo.com/docs/commerce/accounting/ledger#currency-revaluation) --- # Ledger > Post journal entries, load opening balances, depreciate fixed assets, revalue foreign balances, recognize deferred revenue, and record group eliminations. Most ledger entries are written for you when documents post. This page covers the entries you create yourself or run on a schedule: manual journal entries, opening balances, fixed asset depreciation, currency revaluation, deferred revenue, and group eliminations. For fiscal years, the period lock, and the year-end close, see [Closing the books](https://workstation.repzo.com/docs/commerce/accounting/closing). ## Journal entries **Accounting → Journal entries** lists every journal entry in the selected company: the ones documents created and the ones you entered. The **Source** column shows where each came from, for example Invoice, Bill, Payment Entry, Depreciation, or Manual. Cancellation entries are marked **Cancellation** and opening entries **Opening**. Click an entry to see its lines; **Open source document** jumps to the invoice, payment, or landed cost that created it. ### Create a manual entry Use a manual journal entry for anything no document covers, such as an accrual, a correction between accounts, or paying withholding tax to the authority. 1. Click **New entry**. 2. Leave **Entry type** on **Normal journal entry** and set the **Posting date**. 3. Add at least two lines. Each line has an **Account**, a **Debit** or a **Credit**, and an optional **User remark**. 4. On a receivable or payable account, choose the **Party type** and **Party** so the amount belongs to a customer or supplier. 5. Check that **Difference** is zero. **Balance difference** puts any gap on the last empty line. 6. Click **Save draft**, then **Post entry**. For example, to accrue 2,000 of electricity used in September but billed in October (using an accrued liabilities account you have added to your chart): | Account | Debit | Credit | |---|---|---| | Utilities Expense | 2,000 | | | Accrued Liabilities | | 2,000 | Posting is checked against the rules that apply to every entry: debits must equal credits, the date must be on or after the accounting start date, outside any locked or closed period, and inside an enabled fiscal year. Tiny rounding differences are posted to the rounding account automatically. ### Correct a posted entry Posted entries cannot be edited or deleted. Click **Cancel entry** to post a cancellation that offsets it, dated today; the original stays in the ledger with the status **Reversed**. Then post the correct entry. Only manual entries can be cancelled from this page. An entry created by a document is corrected by cancelling or voiding that document. A manual entry cannot be cancelled while it is part of a bank deposit, matched in [Banking](https://workstation.repzo.com/docs/commerce/accounting/banking), or funding an active prepaid expense schedule. Drafts can be edited, or removed with **Delete draft**. Posted entries keep their number; deleted drafts leave a gap in the numbering. ### Tags Open a journal entry to add **Tags** for reporting, review queues, or internal organization. Tags can be changed on posted entries because they do not affect the ledger. ## Opening balances Opening balances bring your books to the right starting position: what customers still owed you, what you still owed suppliers, cash, stock, assets, and other balances as of the accounting start date. Enabling Accounting does not copy any past activity into the books, so this is where your history enters. Open **Accounting → Opening balances** (under **Configuration**). It works as a cutover workspace: it stays open while you enter balances, and you close it with **Complete cutover** when everything reconciles. Every opening entry is balanced against **Temporary Opening**, a clearing account, and posts no revenue or expense. When everything is in, move what is left in Temporary Opening to Capital or Retained Earnings with an opening journal entry. ### Bring in unpaid invoices and bills If your invoices and bills were already in Workstation before you enabled Accounting, you do not need to re-enter them. Under **Bring in unpaid invoices and bills**, the page shows how many **Customer invoices** and **Supplier bills** dated before the start date were still unpaid on that day, with their totals, and how many are **Already brought in**. Click **Bring them in** and confirm. For each document, only the amount still owed on the start date is posted, to Accounts Receivable or Accounts Payable against Temporary Opening. The document keeps its real due date, so aging stays correct. Documents are processed 100 at a time with a progress count. - An invoice that was unpaid on the start date but paid afterwards still comes in, then shows as paid once its later payment posts. - Walk-in sales without a customer are left out, because there is no customer to carry a balance for. - It is safe to run again: documents already brought in are skipped. - It is only available while the cutover is open. ### Opening documents While the cutover is open, you can also create opening documents one by one. Click **Customer balances** or **Supplier balances** to open a **New opening invoice** or **New opening bill**, dated the day before the start date. Any invoice or bill dated before the start date is treated as an opening document while the cutover is open: when you post it, only its outstanding amount posts as an opening balance against Temporary Opening, with no revenue or expense. A payment dated before the start date reduces that opening balance. Opening documents show an **Opening** badge in lists and on their detail page. Opening invoices are not reported to ZATCA automatically, because they were normally reported by your previous system; submit one manually from the invoice if it still needs reporting. - **Update stock** is not allowed on an opening document. Enter stock with **Stock on hand** instead. - After **Complete cutover**, a document dated before the start date is rejected, because it could never reach the books. Date it on or after the start date, or reopen the cutover. ### Other opening activity | Row | How it is entered | |---|---| | Customer and supplier advances | An opening payment, left unallocated | | Stock on hand | **Add opening stock**: location, product, quantity, and unit cost | | Fixed assets | An opening asset in [Fixed assets](#fixed-assets-and-depreciation), with depreciation already booked | | Other balance-sheet accounts | An **Opening balances** journal entry for cash, tax, loans, equity, and other balances | | Mid-year year-to-date activity | A **Mid-year YTD opening** journal entry, which may include income and expense accounts | Opening journal entries are fixed to the start date. An **Opening balances** entry cannot use income or expense accounts, and receivables and payables must come from opening invoices or bills rather than journal lines. ### Reconcile to the source trial balance Enter the closing trial balance from your old system under **Reconcile to source Trial Balance**, with a **Source reference**. For each account, the page compares expected and actual debits and credits and shows the **Variance**. ### Complete the cutover Click **Complete cutover** when every variance is zero, the source trial balance balances, and **Temporary Opening** is exactly zero. After that, no more opening entries or opening documents can be added. **Reopen** is possible as long as the period lock is before the start date. ## Fixed assets and depreciation **Accounting → Fixed assets** is your register of long-lived assets, such as vehicles, computers, and machinery. It spreads each asset's cost over its useful life as depreciation. ### Add an asset Click **New asset** and enter: - **Asset code**, **Asset name**, **Acquisition date**, and **Available for use** date. - **Gross cost** and **Salvage value** (what it will be worth at the end). - **Useful life (months)** and **Posting frequency (months)**. - **Method**: **Straight line** or **Declining balance** (with an **Annual declining rate %**). - The **Fixed asset account**, **Accumulated depreciation** account, and **Depreciation expense** account. - **Acquisition credit (optional)**: the account to credit for the purchase. Leave it empty when a bill or journal entry already recorded the purchase; otherwise the asset posts debit Fixed asset, credit this account. For example, a 36,000 vehicle with 6,000 salvage value over 60 months, straight line, monthly, depreciates by 500 a month. For assets you already owned before the start date, use **Opening balances → Fixed assets**. It adds the accumulated depreciation at cutover and the periods already booked. ### Post depreciation Depreciation posts automatically on each scheduled date (see [Scheduled entries](#scheduled-entries)). Each posts debit Depreciation expense, credit Accumulated depreciation. **Post due depreciation** posts everything due up to today straight away, for all active assets. The list shows each asset's cost, accumulated depreciation, and book value, with totals for the register. ### Dispose of an asset Open the asset and click **Dispose asset**. Choose the **Disposal date** and method (**Sale**, **Scrap**, or **Write off**), the **Sale proceeds** and the account they were paid into, and the **Gain / loss account**. Workstation first posts any depreciation due up to the disposal date, then removes the asset's cost and accumulated depreciation and posts the gain or loss. A disposal can be cancelled; the reversal is dated today. ## Scheduled entries Fixed-asset depreciation and [prepaid expense](https://workstation.repzo.com/docs/commerce/accounting/purchases#prepaid-expenses) recognition follow schedules. Workstation posts them for you once a day (at 03:00 UTC): - Each depreciation row posts on its own scheduled date. - Prepaid recognition posts at each month end (or the schedule's end date). - Entries for the same asset or schedule post in order. If one cannot post, for example because its month is locked, the later ones wait. - Nothing is ever posted into a locked or closed period. Turn this off with **Post scheduled entries automatically → Only when I post them** under **Accounting settings → General**. The manual buttons (**Post due depreciation**, **Recognize through today**) work either way. ### When an entry cannot post Problems are listed under **Needs attention** on the Accounting **Overview**, with a link to the asset or schedule and a **Retry** button. Each person who can fix a problem gets one in-app notification per company per run: owners and Accounting administrators for everything, Ledger managers for depreciation, and Purchases managers for prepaid expenses. Everyone notified needs an Accounting seat (or, on [older plans](https://workstation.repzo.com/docs/commerce/accounting/setup#workspaces-on-older-plans), area managers need their Accounting access switched on). They are notified again only if the reason changes. The usual fix is to adjust the period lock or the fiscal year, then click **Retry**. ## Currency revaluation Balances in a foreign currency, such as a USD receivable or a USD bank account, are recorded in the base currency at the rate on the day of each transaction. When rates move, their base-currency value is out of date. Revaluation restates them at a closing rate, usually at month end. 1. Open **Accounting → Currency revaluation**. 2. Choose the **Posting date**, the **Currency**, and the **Closing rate**. 3. Click **Preview revaluation**. The table shows each account and party with its foreign balance, carrying value, revalued value, and adjustment. 4. Click **Post revaluation**. Revaluation covers foreign-currency receivables, payables, and bank or cash accounts. The adjustment posts to **FX Gain/Loss** as an unrealized gain or loss. It is not reversed automatically: a later revaluation starts from the already revalued amount and only posts the further change. A posted revaluation cannot be cancelled. ## Deferred revenue Deferred revenue is money you have invoiced for a service you have not delivered yet, such as a 12-month membership paid up front. It is recorded as a liability and recognized as income over the service period. - On an invoice line, tick **Defer over service period** and choose the start and end dates. See [Sales](https://workstation.repzo.com/docs/commerce/accounting/sales#deferred-revenue). The **Deferred revenue account** comes from the line, the product or category default, or the company default. - Membership sales defer automatically when **Deferred revenue** is set to **Auto for memberships** under **Accounting settings → General**. The same setting chooses **Prorate by days** or **Prorate by months**. When the invoice posts, the line's revenue goes to Deferred Revenue and a recognition schedule is created. Recognition moves each period's share to the income account. It runs automatically on the first day of each month for the previous month, and you can run it at any time with **Recognize through today** in **Accounting settings → General**. Voiding the invoice reverses what was recognized and cancels the schedule. ## Intercompany and eliminations If your organization has several companies in one group, some of their transactions are with each other, for example one company charging the other a management fee. Each company records its side in its own books. Group eliminations remove those internal balances from the [consolidated reports](https://workstation.repzo.com/docs/commerce/accounting/reports#consolidated-reports) so the group is not reporting income it earned from itself. ### Set up relationships Open **Accounting settings → Intercompany** and click **New relationship**. Choose the two companies and, for each side, its **Due from related entities**, **Due to related entities**, **Intercompany income**, and **Intercompany expense** accounts. The defaults use the system accounts for these purposes. Workstation does not post intercompany transactions for you. Record each company's side with its normal documents or journal entries, using these accounts. ### Record eliminations Under **Elimination journals**, click **New elimination**, choose the company pair and date, and enter lines against group accounts in the group's reporting currency. **Save draft**, then **Post**. **Reverse** posts an opposite journal on the date you choose. Elimination journals live at group level only. They never appear in either company's general ledger. Consolidated reports apply them only when both companies in the pair are included. ## Related pages - [Closing the books](https://workstation.repzo.com/docs/commerce/accounting/closing) - [General ledger](https://workstation.repzo.com/docs/commerce/accounting/reports#general-ledger) - [Setting up Accounting](https://workstation.repzo.com/docs/commerce/accounting/setup) - [Chart of accounts and settings](https://workstation.repzo.com/docs/commerce/accounting/chart-of-accounts) --- # Closing the Books > Manage fiscal years, lock periods against changes, and close the year into retained earnings. Closing protects periods you have finished. Once a month is reported or a year is filed, nobody should be able to post into it by accident. Workstation gives you two tools: - The **period lock** stops postings before a date. Use it every month. - The **year-end close** transfers the year's profit or loss to equity and closes the year. Use it once a year. Both are in **Accounting → Accounting settings**. ## Fiscal years Open **Accounting settings → Fiscal years**. Each company has its own list of fiscal years, created from its **Fiscal year starts** month. The table shows each year's period, status (**Open**, **Draft close**, **Closed**, **Upcoming**, **Disabled**, or **No activity**), its closing voucher, and whether it is locked. Click **New fiscal year** to add one. A normal year is exactly twelve months. If you need a shorter or longer year, for example when changing your year end, tick **Transition fiscal year**. Years cannot overlap. **Disable posting in this year** blocks ordinary postings in that year. Once a year has activity or a closing voucher, its dates cannot change and it cannot be disabled. To change your fiscal year start month after the calendar is in use, create a transition year instead; the start month setting is locked. The fiscal-year shortcuts on [reports](https://workstation.repzo.com/docs/commerce/accounting/reports) use these years, including transition years. ## Period lock Set **Accounting settings → General → Locked before** to a date. Nothing can be posted or reversed with a date before that day, including cancellations and payments. A typical routine: when September is reconciled and reported, set **Locked before** to 1 October. If you find a mistake later, move the date back, post the correction, and move it forward again. Every change to the lock is recorded in the audit log. Locking never moves profit into retained earnings. That only happens in the year-end close. ## Close the year A year can be closed after it ends, and years close in order: every earlier year with activity must be closed first. 1. On the **Fiscal years** tab, click **Prepare close** on the oldest year waiting to close. 2. Choose the **Closing equity account**, usually Retained Earnings, and write a **Review note**. 3. Check the **Closing entry preview**. It lists every income and expense account balance that will be closed. 4. Click **Save draft**. Nothing is posted yet. 5. Review the draft and click **Post closing voucher**. The closing voucher (numbered `PCV-…`) is dated on the last day of the year. It brings every income and expense account to zero and posts the net profit or loss to the equity account. Your source transactions are untouched, and the Profit & loss report for that year still shows the full income and expenses. If the company tracks stock, the close is blocked until the Inventory account agrees with the [Stock ledger](https://workstation.repzo.com/docs/commerce/accounting/reports#stock-ledger) value. ### After the close Posting the closing voucher closes the year: nothing can be posted on or before the year end until the close is reopened. It also moves **Locked before** to the day after the year end. If the period lock is already later than the year end, move it back before posting the close. ### Reopen a year Only the latest closed year can be reopened. Click **Reopen fiscal year** and enter a **Reason**. Workstation posts a reversal of the closing voucher on the original closing date, so the year returns to exactly its state before the close and can be closed again. The automatic lock goes back to the previous close; a lock you set yourself is kept. ## Related pages - [Ledger](https://workstation.repzo.com/docs/commerce/accounting/ledger) - [Reports](https://workstation.repzo.com/docs/commerce/accounting/reports) - [Setting up Accounting](https://workstation.repzo.com/docs/commerce/accounting/setup) --- # Accounting Reports > Read the general ledger, stock ledger, trial balance, financial statements, aging, VAT return, customer statements, and consolidated group reports. Accounting reports are built from posted journal entries, so they always agree with each other: the trial balance totals the general ledger, and the balance sheet and profit & loss are summaries of the same balances. Drafts never appear in reports. Each report has its own page under the **Reports** group of the Accounting sidebar. You need the `accounting.reports_view` permission (or `accounting.view`). Reports run on the company selected in the header, except the consolidated reports, which have their own company picker. These are separate from the CRM [Reports](https://workstation.repzo.com/docs/analytics/reports) module, which does not include accounting data. ## Common controls - **Dates.** Period reports have **From** and **To** dates; the balance sheet and aging reports have one **As of** date. From defaults to 1 January of the current year and To to today. - **Fiscal year shortcuts.** Trial balance, Profit & loss, Cash flow, and Balance sheet have **From fiscal year** / **To fiscal year** pickers that fill the dates from your [fiscal years](https://workstation.repzo.com/docs/commerce/accounting/closing#fiscal-years). - **Report currency.** Every single-company report can be shown in another active currency. See [Presentation currency](#presentation-currency). - **Drill-down.** Click an account on the trial balance, profit & loss, balance sheet, cash flow, or VAT return to open its general ledger for the period in a full-screen view. - **Export and print.** The General ledger and Stock ledger export to CSV. The Customer statement and the consolidated reports have **Print**. - **Errors.** If a report cannot be built, for example because an exchange rate is missing, it shows the reason and a **Retry** button. ## General ledger The general ledger lists every posting for the period: an **Opening** row, each voucher's lines, then **Total** and **Closing (Opening + Total)**. Filter by account, party type and party, **Voucher No** (exact match), dates, and currency. Filters are kept in the page address, so you can bookmark or share a filtered view. - **Group by Voucher (Consolidated)** (the default) shows one row per account per voucher, so each document reads as a unit. **Do not group** shows every line. - Click a voucher number to open its journal entry, or the **Source** to open the invoice, bill, payment, or expense behind it. - **View ledger** on any posted document opens the general ledger filtered to that document on its posting date. For an **Update stock** invoice, this includes both its receivable entry and its cost of goods sold entry. The report loads more rows as you scroll instead of paging. **Export CSV** exports every row that matches the filters. ## Stock ledger The stock ledger lists every inventory movement: its incoming, outgoing, and running quantity, the incoming, average, and outgoing rates, and the running stock value, with a link to the source document. It starts with the opening stock state and shows **Opening value**, **Value received**, **Value issued**, and **Closing value**. Filter by products, locations, **Voucher No** (partial match), voucher type, dates, and currency. **Reset** clears the filters and **Export CSV** exports the full result. Stock is valued at moving average cost. The inventory accounts in the general ledger should agree with the stock ledger's closing value; the [year-end close](https://workstation.repzo.com/docs/commerce/accounting/closing#close-the-year) checks this. ## Trial balance The trial balance lists every posting account with a balance: **Opening (Dr)**, **Opening (Cr)**, period **Debit** and **Credit**, and **Closing (Dr)** and **Closing (Cr)**, with a **Total** row. Total debits always equal total credits. Income and expense accounts start at zero at the beginning of each fiscal year. ## Profit & loss Profit & loss summarizes income and expenses for a period in three sections: **Income**, **Cost of sales**, and **Operating expenses**, with **Gross profit** and **Net profit**. Summary cards show total income, gross profit and gross margin, total expenses, and net profit. Click any amount to see which accounts make it up, then click an account to open its ledger. Year-end closing entries are left out, so a closed year still shows its full income and expenses. ## Balance sheet The balance sheet shows **Assets**, **Liabilities**, and **Equity** as of a date. Equity includes **Retained earnings (prior years)** and **Current year earnings**, so the sheet balances before the year is formally closed. The last row is **Total liabilities and equity**. ## Receivables and payables aging **Receivables aging** and **Payables aging** show what each customer owes you and what you owe each supplier, as of a date, in buckets by days past the due date: **Current**, **1–30**, **31–60**, **61–90**, and **90+**. - Balances are rebuilt as they stood on the as-of date, so a past date shows what was outstanding then. - A document with installments is split, and each installment sits in the bucket for its own due date. - Credit notes and vendor credits are negative and reduce the party's total. - Unallocated advances are included, aged by their posting date. - Payables are net of [withholding tax](https://workstation.repzo.com/docs/commerce/accounting/purchases#withholding-tax): what you actually owe the supplier. Click a row to see the documents open for that party today. On receivables, **Write off** moves an invoice's outstanding amount to Bad Debt; see [Write-offs](https://workstation.repzo.com/docs/commerce/accounting/sales#write-offs). ## Cash flow The cash flow report uses the indirect method. It starts from **Net profit**, adjusts for the change in each non-bank asset and liability to reach **Net cash from operations**, adds equity movements under **Cash flow from financing**, and ends with **Net change in cash**. A final check row shows the actual movement on your bank and cash accounts, which should agree. There is no separate investing section; fixed asset movements are included in operations. ## VAT return The VAT return shows **Output VAT (on sales)** from Tax Payable and every account mapped to a tax rate, and **Input VAT (on purchases)** from Input VAT, with the number of entries and the amount for each account. The footer shows **Output tax**, **Less input tax**, and **Net VAT payable**. Click an account to see the transactions behind it. ## Customer statement Choose **Account** or **Contact** and pick a customer to see their statement for the period: an opening balance, each receivable posting with a running balance, the closing balance, and an aging summary as of the To date. Click **Print** to print it from your browser. ## Presentation currency Use the currency picker on any single-company report to view it in another currency, for example a SAR company's balance sheet in USD. The whole report is converted with one rate: the latest recorded rate on or before the report's To or As of date. Only the report is converted; the ledger stays in the base currency. ## Consolidated reports The consolidated reports combine the companies in a group: **Consolidated trial balance**, **Consolidated profit & loss**, **Consolidated balance sheet**, and **Consolidated cash flow**. They need a group with at least one company. 1. Choose the **Group entity** and which companies to include. 2. Choose the dates and the **Presentation currency**. Each report shows one column per company, an **Eliminations** column, and the **Consolidated** total. Accounts shared through the group chart are combined into one row. Click a consolidated amount to see each company's contribution and translation rate, or a company's amount to open that company's ledger. - Each company is translated at its rate on the To or As of date. On the trial balance, opening columns use the rate at each company's start date. - Posted [elimination journals](https://workstation.repzo.com/docs/commerce/accounting/ledger#intercompany-and-eliminations) are applied only when both companies in the pair are included. The report says whether eliminations were applied. - A company whose consolidation starts after the report date is left out, with the reason shown. - Only 100%-owned, fully consolidated companies are supported. ## Related pages - [Ledger](https://workstation.repzo.com/docs/commerce/accounting/ledger) - [Closing the books](https://workstation.repzo.com/docs/commerce/accounting/closing) - [Sales](https://workstation.repzo.com/docs/commerce/accounting/sales) - [Purchases](https://workstation.repzo.com/docs/commerce/accounting/purchases) --- # Accounting Permissions > Control who can open Accounting, which areas they can see, and what they can change. Access to Accounting is decided by three things, and a member needs all three: 1. **A licence to use Accounting.** Accounting is an [add-on](https://workstation.repzo.com/docs/commerce/plans-and-add-ons#accounting): the member needs an **Accounting seat** (see [Member access](https://workstation.repzo.com/docs/commerce/accounting/setup#member-access)). The seat decides who can open Accounting at all. 2. A role with Accounting permissions (this page). The role decides what they can see and change once they are in. 3. Access to the company, if you [restrict members to certain companies](https://workstation.repzo.com/docs/commerce/accounting/setup#company-access). A seat without Accounting permissions opens nothing, and Accounting permissions without a seat open nothing either. Default roles give managers `accounting.view`, so the seat is how you keep the books to the people who should see them. ## Permissions Accounting permissions appear under the **Accounting** module when you edit a role in **Settings → Team**. See [Team](https://workstation.repzo.com/docs/administration/team) for creating custom roles. There are two all-area permissions: | Permission | Allows | |---|---| | `accounting.view` | Viewing every part of Accounting | | `accounting.manage` | Changing every part of Accounting, including **Accounting settings** | And area permissions, for roles that should only reach part of the books: | Area | View | Manage | Covers | |---|---|---|---| | Sales | `accounting.sales_view` | `accounting.sales_manage` | Invoices, credit notes, write-offs, customers | | Purchases | `accounting.purchases_view` | `accounting.purchases_manage` | Bills, vendor credits, expenses, landed costs, prepaid expenses, suppliers | | Payments | `accounting.payments_view` | `accounting.payments_manage` | Payment Entries, allocations, advances | | Banking | `accounting.banking_view` | `accounting.banking_manage` | Statements, matching, rules, deposits, transfers | | Ledger | `accounting.ledger_view` | `accounting.ledger_manage` | Journal entries, opening balances, fixed assets, currency revaluation | | Reports | `accounting.reports_view` | — | Every accounting report | A few rules: - **Manage includes view.** A role with `accounting.purchases_manage` can also see purchases. - **Settings need `accounting.manage`.** The chart of accounts, posting defaults, withholding tax categories, companies, member access, numbering, payment terms, and fiscal years are all configured in **Accounting settings**, which only `accounting.manage` opens. - **Customers and suppliers follow their area.** Customers are Sales and suppliers are Purchases. Payments permissions also let a member see both lists, because payments need them. - **Opening balances** need `accounting.ledger_manage` or `accounting.manage`. - **Overriding a blocked credit limit** is allowed for owners, admins, and users with `accounting.manage` or `accounting.sales_manage`. The Accounting sidebar only shows the pages a member's role allows, and the server enforces the same rules. ## Default roles | Role | Accounting | |---|---| | Owner | Everything | | Admin | `accounting.view` and `accounting.manage` | | Manager | `accounting.view` | | User | None | Custom roles created before Accounting existed were given `accounting.view` if they could view reports, and `accounting.manage` if they could manage settings. ## Example: a purchasing clerk A clerk who enters and pays supplier bills, but should not see sales or the ledger: - `accounting.purchases_manage`: create and post bills, vendor credits, and expenses, and manage suppliers. - `accounting.payments_manage`: pay suppliers. Their Accounting sidebar shows Overview, Bills, Expenses, Landed costs, Prepaid expenses, Payments, Suppliers, and Customers (visible because payments can be received from customers). Invoices, Banking, Journal entries, Fixed assets, Reports, and Accounting settings are hidden. The Overview figures come from reports, so they need `accounting.reports_view` to show values. Then give them an **Accounting seat** in **Settings → Team**. ## Related pages - [Setting up Accounting](https://workstation.repzo.com/docs/commerce/accounting/setup) - [Plans and add-ons](https://workstation.repzo.com/docs/commerce/plans-and-add-ons) - [Team](https://workstation.repzo.com/docs/administration/team) - [Accounting overview](https://workstation.repzo.com/docs/commerce/accounting) --- # Point of Sale > Sell products and services at a branch register: unlock with a PIN, run shifts, hold tickets, take split payments, print receipts, and handle returns. The Point of Sale (POS) turns a browser on a counter computer or tablet into a cash register. Cashiers unlock it with a personal 6-digit PIN, ring up products and services, take payment, and print or email a receipt. Every completed sale becomes a paid [invoice](https://workstation.repzo.com/docs/commerce/invoices) with its [payments](https://workstation.repzo.com/docs/commerce/payments), and stock is updated at the branch. Point of Sale is part of the Pro plan. See [Plans & Add-ons](https://workstation.repzo.com/docs/commerce/plans-and-add-ons). The **Point of Sale** section of the sidebar has three pages: | Page | Purpose | Permission | |---|---|---| | **POS Console** | The register screen, at `/pos` | `pos.access` | | **Reports** | Sales, payments, taxes, discounts, and shifts. See [POS Reports](https://workstation.repzo.com/docs/pos/reports). | `pos.view_sales` | | **Time cards** | Staff clock-ins and hours. See [Time Cards](https://workstation.repzo.com/docs/pos/time-cards). | `pos.manage_time_entries` | ## Before you start An admin needs to set up three things. See [Point of Sale Settings](https://workstation.repzo.com/docs/pos/settings) for each step. 1. **A branch with POS turned on**, with at least one active register. 2. **Cashiers** with POS access, the branch assigned, and a POS PIN. 3. **Products** to sell, with prices, tax rates, and stock at the branch. ## Open the register 1. Open **POS Console**. The register opens full screen. 2. **Choose your store** and **Choose your register**. Either step is skipped when there is only one choice, and your last choice is remembered on this browser. 3. In **Unlock register**, pick the **Register operator** (when there is more than one) and enter your 6-digit PIN. 4. If an admin gave you a temporary PIN, choose a new one. 5. If the branch uses the time clock, you can **Clock in** before you **Start selling**. See [Time Cards](https://workstation.repzo.com/docs/pos/time-cards). Five wrong PINs lock that PIN for 15 minutes. After 15 idle minutes the register locks itself; the current sale stays in place until you unlock again. To switch cashiers, click **Lock** and unlock as the other operator. The header shows the store and register, whether a shift is open, the operator, and an **Online**/**Offline** indicator. The register needs a connection to sell; it does not queue sales offline. If the connection drops while you complete a sale, the register checks the server and recovers the sale instead of charging twice. ## Shifts and the cash drawer When the branch has **Require an open shift** on, the register asks you to open a shift before selling. - **Open shift**: count the cash in the drawer and enter it as **Opening cash**. The currency you choose is locked for the whole shift. - **Cash movement**: record **Paid in** or **Paid out** cash during the shift, with a reason. - **Current shift report**: a printable summary of the shift so far. - **Close shift**: count the drawer and enter **Counted closing cash**. Workstation produces the final closing report. These actions are in the **More actions** menu. The shift report shows opening cash, cash sales and refunds, paid in and out, gross sales, discounts, taxes, expected cash, closing cash, the difference, and a breakdown by payment method. With **Blind cash close** on, expected cash and the difference are hidden from cashiers without `pos.view_expected_cash`, so they count the drawer without knowing the target. ## Ring up a sale Search by name, SKU, or barcode, or tap a tile. Barcode scanners type straight into the search box. Products with variants ask you to pick one, unless you scanned the variant's own barcode. By default the catalog has **All**, **Products**, **Services**, and **Memberships** tabs. Admins can design a custom layout of up to three tabs of tiles for the branch. In the **Current sale** panel: - Change quantities with **+** and **−**. The trash button removes a line, with **Undo**. - **Items sold by weight** (for example kg or lb) ask for the weight when you add them. Each weighing is its own line. A **scale barcode** printed by a deli or produce scale adds the item with its weight or price already filled in. - **Open prices**: authorized operators can type a different unit price when the branch allows it. - Stock warnings show **Out of stock** or how many are short. What happens when you charge depends on the branch's **Negative stock** setting. - Pick the customer with the customer button. Leave it as **Walk-in customer** if the branch allows walk-in sales, or create a new client. On phones and tablets, the cart opens as a sheet from **View cart**. ### Discounts - Choose a **preset discount** for one line or for the whole sale (the **Cart discount**). - Choose **Custom** to enter a percentage or fixed amount, with an optional reason. Some presets need **Manager approval**, and so does a custom discount from someone without `pos.approve_override`. A manager assigned to the branch enters their email and POS PIN to approve that exact cart once. Presets that don't allow combining can't be used with other discounts. ### Held tickets Use **Hold** to park a sale and serve the next customer. Give the ticket a name, such as a table or a pickup spot. If the branch has predefined ticket names, they appear as chips, and names already in use are disabled. **Held tickets** in the header lists open tickets at the branch. You can **Resume** a ticket, merge it into another one, move it to another register at the same store, or delete it. Prices, tax, stock, and approvals are checked again when a ticket is resumed. ## Take payment Click **Charge**. The **Take payment** screen shows the amount due and, when set up for the branch: - **Sale details**: invoice fields the branch asks cashiers to fill in. Required ones must be filled before completing. - **Tip**: the branch's suggested percentages, or a custom amount. - **Loyalty rewards**: redeem the customer's points for a reward. See [Client Loyalty](https://workstation.repzo.com/docs/operations/client-loyalty). - **Gift card or store credit**: enter a gift card code and click **Check**, or **Use store credit**. See [Gift Cards](https://workstation.repzo.com/docs/commerce/gift-cards). - **Cash rounding**, when the whole sale is paid in cash and the branch rounds cash. Choose the **Payment method**. For cash, enter the amount tendered (or tap a quick amount) to see the change due. Use **Split payment** to add several tenders. A sale can stay partly unpaid only when the branch allows **Partial payments**. Click **Complete sale**. ### What a sale creates - A **paid invoice** (or open, if partly paid) numbered with the branch's receipt prefix, for example `MAIN-000123`. - One **payment** per tender. Gift card and store credit balances are reduced. - **Stock movements** at the branch. - A **membership**, if one was sold. - Loyalty points earned or redeemed. - **Journal entries**, when [Accounting](https://workstation.repzo.com/docs/commerce/accounting) is enabled. On a contact's record, POS sales are listed separately from other invoices. ## Receipts After a sale, **Sale complete** shows the receipt with **Print**, **Email**, and **New sale**. Receipts include the branch details, VAT and CR numbers, items, taxes, tenders, change, and the ZATCA QR code when [ZATCA](https://workstation.repzo.com/docs/commerce/invoices#zatca-e-invoicing) is connected. To email, leave the address blank to use the customer's saved email. Receipts print through the browser on 58 mm, 80 mm, or 4-inch paper, set per branch. ## Returns and voids Open **Sales** from the **More actions** menu to see recent sales. Cashiers see their own sales unless they have `pos.view_all_sales`. From a sale you can **Reprint**, **Email**, **Return**, or **Void sale**. - **Return** credits everything still returnable, restocks it where inventory is tracked, and refunds the original payment methods. It needs a reason and an open shift. Workstation creates a credit note linked to the original invoice. - **Void sale** reverses the sale and restores stock. It is only possible during the sale's original shift, before anything is returned, and not while ZATCA is connected. After the shift closes, use a return. Gift card and store credit payments go back onto the original card. ## Permissions POS permissions are checked twice: against the signed-in user and against the operator who unlocked the register with their PIN. The operator also needs POS access and the branch assigned. | Permission | Allows | |---|---| | `pos.access` | Open the POS Console | | `pos.sell` | Ring up and complete sales | | `pos.view_sales` / `pos.view_all_sales` | See own sales and POS Reports / see everyone's sales | | `pos.view_customers` / `pos.create_customers` | Find customers / create new clients at the register | | `pos.hold_ticket` / `pos.manage_all_held_tickets` | Hold tickets / manage and reassign any cashier's tickets | | `pos.apply_discount` / `pos.override_price` / `pos.approve_override` | Apply discounts / enter open prices / approve manager-only discounts | | `pos.sell_negative_stock` | Sell past zero stock when the branch requires authority | | `pos.return`, `pos.refund`, `pos.void` | Return, refund, and void sales | | `pos.open_shift`, `pos.view_shift`, `pos.close_shift`, `pos.cash_movement` | Run shifts and the cash drawer | | `pos.view_expected_cash` | See expected cash with blind cash close on | | `pos.reprint_receipt` / `pos.send_receipt` | Reprint / email receipts | | `pos.time_clock` / `pos.manage_time_entries` | Clock in and out / view and correct time cards | | `pos.manage_settings`, `pos.manage_devices`, `pos.manage_layout`, `pos.reset_member_pin` | Manage branch POS settings, registers, the register layout, and PINs | By default, Managers have every POS permission except managing settings, registers, and the layout. Users can sell, hold tickets, apply discounts, run shifts and the cash drawer, view their own sales, and reprint or email receipts. ## Related pages - [Point of Sale Settings](https://workstation.repzo.com/docs/pos/settings) - [POS Reports](https://workstation.repzo.com/docs/pos/reports) - [Time Cards](https://workstation.repzo.com/docs/pos/time-cards) - [Invoices](https://workstation.repzo.com/docs/commerce/invoices) - [Gift Cards](https://workstation.repzo.com/docs/commerce/gift-cards) - [Appointment Checkout](https://workstation.repzo.com/docs/engagement/appointment-checkout) --- # Point of Sale Settings > Set up POS branches and registers, cashier access and PINs, selling rules, ticket names, scale barcodes, receipts, the register layout, and how items are sold. Point of Sale settings decide where the register can sell, who can use it, and what cashiers are allowed to do. Most settings are per branch, so two stores can work differently. Open **Settings → Point of Sale**: | Item | What it holds | |---|---| | **Branches & Registers** | POS behavior, registers, discounts, tips, receipts, and the register layout for each branch | | **Team Access & PINs** | Which members can use the register, at which branches, and their PINs | | **Payment Methods** | The payment options shown at checkout, and their order. This is the same list as **Settings → Finance → Payment Methods**. See [Payments](https://workstation.repzo.com/docs/commerce/payments#payment-methods). | | **Taxes** | Tax rates and whether displayed prices include tax | | **Currencies** | Base currency, selling currencies, and exchange rates | | **Products** / **Product Categories** | What you sell and how it is grouped on the register | | **Inventory** | Branch stock, suppliers, brands, and transfers | Apart from **Branches & Registers** and **Team Access & PINs**, these are shortcuts to the workspace-wide settings of the same name. Branches are the same records as **Settings → Locations**. Changing POS settings needs `pos.manage_settings`, registers need `pos.manage_devices`, and the layout needs `pos.manage_layout`. ## Set up a branch Open **Branches & Registers** and select a branch. Each branch has these tabs: | Tab | Holds | |---|---| | **General** | Name, contact number, timezone, address, opening hours, and whether the branch is active | | **Billing & tax** | Company name and billing address for receipts, **Receipt prefix** and **Next receipt number**, tax defaults, **Tax pricing**, and tipping (**Ask for tips**, **Suggested tip percentages**) | | **Point of sale** | Selling rules, ticket names, scale barcodes, and staff and stock alerts | | **Checkout** | Checkout fields and discount presets | | **Registers** | The registers at this branch | | **Receipts** | Paper size, header, and footer | | **Layout** | The register's tiles and tabs | Receipt numbers run separately for each branch and use the receipt prefix (or the register code) followed by a number. ### Selling rules On the **Point of sale** tab: | Setting | What it does | |---|---| | **Enable POS** | Lets activated registers sell from this branch | | **Require an open shift** | Cashiers must open a shift and count the drawer before selling | | **Held tickets** | Lets cashiers park a sale and resume it later | | **Walk-in sales** | Allows checkout without choosing a customer | | **Partial payments** | Lets a sale stay open when the payment doesn't cover the full balance | | **Open prices** | Lets authorized operators type a price for an item | | **Blind cash close** | Hides expected cash until the drawer count is submitted | | **Negative stock** | **Block sale**, **Warn and require authority** (needs `pos.sell_negative_stock`), or **Allow sale** | | **Cash rounding increment** | Rounds cash-only sales, for example to 0.05. Leave empty for no rounding. | ### Ticket names Turn on **Predefined ticket names** to offer cashiers a fixed list when they hold a ticket, such as tables, counters, or pickup spots. Add names with **Add a name**. A name already used by an open ticket isn't offered twice, and cashiers can still type their own. ### Scale barcodes Deli and produce scales print barcodes with the weight or price built in. Turn on **Scale barcodes** to read them. For example, scanning `2 00123 00750` adds item `00123` at 0.750 kg. - **In-store prefix**: the first one or two digits that mark a scale barcode. Most scales use `2`. - **What the code carries**: **Weight in grams** or **Price amount**. The middle five digits are the scale's item code (PLU). It must match the item's SKU or barcode, and the item must be sold by weight (see [Items sold by weight](#items-sold-by-weight)). ### Staff and stock alerts - **Time clock** lets employees clock in and out on the register's PIN screen. Clocking in does not open a shift. See [Time Cards](https://workstation.repzo.com/docs/pos/time-cards). - **Daily low stock email** sends one email a day listing the branch's low and out-of-stock items. It goes to everyone with the `inventory.manage` permission. An item counts as low when its stock is at or below its **Low stock level**. ### Checkout fields On the **Checkout** tab, **Add an invoice property** to ask cashiers for extra details on every sale, such as a table number or a delivery note. Mark fields **Required** when the sale shouldn't complete without them. Create the properties first under [Properties](https://workstation.repzo.com/docs/administration/properties) for Invoices. ### Discount presets Click **Add discount** to create a preset that cashiers can pick: - **Name**, **Applies to** (One item or Whole sale), **Type** (percentage or fixed), and **Value**. - **Manager approval**: a manager must approve it with their PIN. - **Allow combining**: when off, the preset can't be used with other discounts. Presets can be added and deleted, but not edited. To change one, delete it and add it again. ### Registers On the **Registers** tab, click **Add register** and give it a name. Activate the registers cashiers can choose. Deactivating or deleting a register signs out anyone using it. ### Receipts Choose the **Paper profile** (58 mm compact, 80 mm / 3-inch standard, or 101.6 mm / 4-inch wide), and add a **Receipt header** and **Receipt footer**. **Preview receipt** prints a test receipt so you can check the printer. Turn off the browser's headers, footers, margins, and scaling when printing. ### Register layout By default the register shows **All**, **Products**, **Services**, and **Memberships** tabs. On the **Layout** tab you can design up to three tabs of your own, each with up to 36 tiles. A tile can be a category, a product, an exact variant, or a discount, with a short label and a color. Click **Save layout**, or **Restore automatic** to go back to the default. ## Give cashiers access Open **Team Access & PINs** and select a member. On the **Point of Sale** card, click **Turn on** (or **Edit POS access**), then: 1. Switch on **POS access**. 2. Choose the **POS locations** they can sell at, or **All locations**. 3. Optionally choose a **Default register**. 4. Click **Set PIN** and enter a 6-digit PIN, or **Generate PIN**. Repeated or sequential digits are rejected. Tick **Require a new PIN at the register** to make the cashier choose their own PIN the first time. The card shows **Needs a PIN** until a PIN is set. Resetting a PIN signs the member out of any register. Setting PINs needs `pos.reset_member_pin`. A member also needs a role with POS permissions. See [Point of Sale permissions](https://workstation.repzo.com/docs/pos#permissions). ## Items and pricing POS sells the products and services in **Settings → Products**. A few product settings matter at the register. ### Items sold by weight On the product form, **Measure** decides how cashiers enter the quantity: - **A whole product**: cashiers enter whole units. - A unit such as **kg**, **g**, **lb**, **oz**, **l**, or **ml**: cashiers enter a decimal amount and the price is per unit. For example, 0.750 kg at 10.00 per kg is 7.50. Scale barcodes only work for items sold by weight (kg, g, lb, or oz). ### Per-store stock and prices In the product's inventory section, **Edit locations** sets where the item is **Stocked at**. For each branch you can set: - **Low stock level**, used by stock warnings and the daily low stock email; - **Store price**, which replaces the product's normal price at that branch. Leave it empty to use the default price. ### Composite items A composite item is made of other items, such as a gift basket. When it is sold, stock is taken from its components, and the register warns when a component runs short. The product form doesn't have a screen for setting up components yet. ## Related pages - [Point of Sale](https://workstation.repzo.com/docs/pos) - [Time Cards](https://workstation.repzo.com/docs/pos/time-cards) - [Payments](https://workstation.repzo.com/docs/commerce/payments) - [Team](https://workstation.repzo.com/docs/administration/team) - [Settings](https://workstation.repzo.com/docs/administration/settings) --- # POS Reports > Review register sales, items, categories, employees, payment methods, taxes, discounts, and cash drawer shifts. POS Reports show how your registers performed over a period: what sold, who sold it, how customers paid, and whether each cash drawer balanced. Open **Point of Sale → Reports**. You need the `pos.view_sales` permission. Without `pos.view_all_sales`, the reports only include sales where you were the cashier. ## Choose the period Set **From** and **To** (the current month by default, up to 366 days) and pick a **Branch**, or keep **All branches**. Voided sales are left out. The summary cards at the top show **Gross sales**, **Net sales**, **Refunds**, and the number of **Sales** and returns. ## Report tabs | Tab | Shows | |---|---| | **Sales summary** | One row per day: sales and returns, gross sales, refunds, discounts, net sales, cost of goods, gross profit, margin, taxes, and total | | **Sales by item** | Net quantity and sales for each item and variant, with cost of goods and gross profit | | **Sales by category** | The same figures grouped by product category | | **Sales by employee** | Sales and returns for each cashier | | **Payment methods** | Payments, refunds, net amount, and tips for each payment method | | **Taxes** | Taxable sales and tax collected for each tax rate | | **Discounts** | How often each discount was used, split into item and sale discounts. Custom discounts appear as **Open discount**. | | **Shifts** | Every shift with its branch, register, who opened and closed it, opening, expected, and closing cash, the difference, and the shift's sales totals | Each table can be searched, sorted, and filtered by column, and shows totals at the bottom. ## Check a shift Click a row on the **Shifts** tab to open the shift summary: - **Shift information**: branch, register, business date, and who opened and closed it. - **Cash drawer**: cash payments and refunds, paid in and paid out, expected cash, counted closing cash, and the difference. A shortage shows in red. - **Sales summary** and **Payment methods** for that shift. - Any notes. Use this to follow up on a drawer that didn't balance. ## Other reporting Every POS sale is also an invoice, and every tender is a payment, so POS sales appear in the **Reports** tabs of [Invoices](https://workstation.repzo.com/docs/commerce/invoices#reports) and [Payments](https://workstation.repzo.com/docs/commerce/payments#reports), and in [Reports](https://workstation.repzo.com/docs/analytics/reports). Use those to save or export reports. ## Related pages - [Point of Sale](https://workstation.repzo.com/docs/pos) - [Time Cards](https://workstation.repzo.com/docs/pos/time-cards) - [Payments](https://workstation.repzo.com/docs/commerce/payments) --- # Time Cards > Let staff clock in and out on the register, review the hours they worked, and correct missed punches. The time clock lets employees clock in and out on a POS register with their PIN. Time cards list those punches and add up the hours, so you can check attendance or prepare payroll. ## Turn on the time clock The time clock is off by default. For each branch that should use it: 1. Open **Settings → Point of Sale → Branches & Registers** and select the branch. 2. On the **Point of sale** tab, under **Staff and stock alerts**, switch on **Time clock**. 3. Save. Employees need POS access at that branch, a POS PIN, and the `pos.time_clock` permission. See [Give cashiers access](https://workstation.repzo.com/docs/pos/settings#give-cashiers-access). ## Clock in and out After unlocking the register with their PIN, the employee sees the **Time clock** prompt and can **Clock in** before they **Start selling**. Later, they can use **Clock in** or **Clock out** from the register's **More actions** menu. The header shows when they clocked in. - Clocking in does not open a cash drawer shift. Shifts and time cards are separate. - An employee can only have one open punch at a time. ## Review time cards Open **Point of Sale → Time cards**. You need the `pos.manage_time_entries` permission. Set **From**, **To**, and the **Store** (or **All stores**). The page shows **Total hours** for the range, and a row for each punch with the **Employee**, **Store**, **Clock in**, **Clock out**, and **Hours**. A punch without a clock-out shows **Still clocked in**. ## Correct a time card When someone forgets to clock out, or clocks in late: 1. Click the row to open **Correct a time card**. 2. Change the **Clock in** or **Clock out** time. Clear **Clock out** to reopen the punch. 3. Add a **Note** explaining the correction. 4. Click **Save correction**. Each correction records who made it and is saved in the audit log. ## Related pages - [Point of Sale](https://workstation.repzo.com/docs/pos) - [Point of Sale Settings](https://workstation.repzo.com/docs/pos/settings) - [POS Reports](https://workstation.repzo.com/docs/pos/reports) --- # KPI Dashboard > See goal progress, status counts, a leaderboard, and your own targets on one page. The KPI Dashboard is the quick, day-to-day view of [Goals](https://workstation.repzo.com/docs/performance/goals). Managers use it to see how the team is doing, and every member can use it to check their own targets. Every member can open the KPI Dashboard. People without access to the Goals page still see their own goals here. ## What the dashboard shows The dashboard counts **targets**: one person's or team's target for one period. A monthly goal for five reps, for example, adds five targets each month. Only periods that have started are counted. - **Total Goals**, **Achieved** (with the completion rate), **In Progress**, and **Missed**. - **Avg Achievement** — the average progress toward target across all targets. - **Goals by Status** and **Status Breakdown** charts. - **Leaderboard** — people ranked by their average achievement. - **My Goals** — your own targets with current value, target, progress, and days left. Targets ending within a week are flagged. The numbers follow your [data visibility](https://workstation.repzo.com/docs/administration/departments#data-access), so a manager sees their team and a rep may see only their own targets. ## Recommended workflow 1. Create goals and their targets in **Goals**. 2. Check progress here as part of your routine. 3. Open a goal in **Goals** to see the records counted for each person. 4. Use **KPI Reports** when you need period filters or a pivot of the source records. ## Related pages - [Goals](https://workstation.repzo.com/docs/performance/goals) - [KPI Reports](https://workstation.repzo.com/docs/performance/kpi-reports) - [Commissions](https://workstation.repzo.com/docs/performance/commissions) - [Daily Streaks](https://workstation.repzo.com/docs/performance/daily-streaks) --- # Goals > Set targets for people or teams, per week, month, quarter, or year, and track progress automatically. A goal says what to measure, who it is for, and how much they should reach in each period. For example: "Deals won — each sales rep, 10 per month." Workstation counts progress for you from the records your team already works on, such as deals, activities, and tickets. Each goal has its own measurement built in. There is no separate setup step: you pick a template or build your own measure while creating the goal. ## Create a goal 1. Open **Performance → Goals**. 2. Click **Create goal** and choose **Create from template** or **Create from scratch**. 3. Work through the three steps: **Setup**, **Targets**, and **Notifications**. 4. Click **Save goal**. ### Step 1: Setup - **Template** — choose a ready-made measure, or **Custom goal (build your own)**. Use **View definition** to see exactly what a template counts. - **Goal name** — defaults to the template name; change it if you want. - **Contributors** — who the goal is for: | Option | How targets work | | --- | --- | | **Individual users** | Each person gets their own target. | | **Team goals only** | One target per team. Everyone in the team counts toward it. | | **Team goal with individual user targets** | You set a target for each person. The team target is their total. | - **Cadence** — how often the target resets: **Weekly** (week 1 is the week that holds January 1st), **Monthly**, **Quarterly**, **Yearly**, or **Non-recurring** (one target with your own start and end date). Teams are the [departments](https://workstation.repzo.com/docs/administration/departments) set up in **Settings → Team**. ### Step 2: Targets The targets grid shows one row per person or team and one column per period of the year. Use the arrows to move to the previous or next year. - Type a target in any period. Only targets above zero are saved, so you can leave quiet months empty or set higher targets for busy seasons. - Select several rows, then use **Fill selected rows** to give everyone the same target for every period. - For goals on deals or contacts, you can limit each row to specific **Pipelines**. Leave it empty to count all pipelines. - **Yearly total** adds up each row; team totals are worked out from their people. ### Step 3: Notifications Choose which notifications the goal's contributors receive: - **Goal kick-off** — when a new period starts. - **Goal becomes achieved** — as soon as a target reaches 100%. - **Goal becomes exceeded** — when a period ends above 100% of its target. - **Goal becomes missed** — when a period ends below 100% of its target. People can still turn individual channels on or off in their [notification preferences](https://workstation.repzo.com/docs/administration/notifications). ## Goal templates Open **Create from template** (or **Browse goal templates**) to pick from ready-made goals, grouped into Sales, Activities, and Service: | Category | Templates | | --- | --- | | Sales | Revenue won, Deals won, Deals created, Contacts created, Accounts created, Quotes created, Revenue invoiced, Payments collected | | Activities | Activities completed, Calls made, Meetings booked, Tasks completed, Emails logged, Notes created | | Service | Tickets created, Tickets closed, Projects completed | Each template states who a record counts for. For example, deals count for the deal owner and tickets count for the ticket assignee. Amount templates such as **Revenue won** add up values in your base currency, so records in different currencies count fairly. ## Build your own goal Choose **Create from scratch** (or **Build your own** in the template gallery) when no template fits. You then decide: - **Record** — Deals, Activities, Tickets, Projects, Invoices, Quotes, Contacts, or Accounts. - **Measure** — **Number of records**, **Total of a field**, or **Average of a field**. For total and average, pick the numeric **Field**. - **Count it on** — the date that places a record in a period, such as the created date or the close date. - **Only count records where** — add conditions on any native field or custom [property](https://workstation.repzo.com/docs/administration/properties), for example "Stage is Won" or "Type is Call". The record type and date field you choose affect every period, so check them before you fill in targets. ## Track progress The Goals page has three tabs: - **Goals overview** — one row per goal. - **Team performance** — goals grouped under each team. - **User performance** — goals grouped under each person. Use the breakdown menu to switch the columns between **Total progress breakdown**, **Quarterly breakdown**, **Monthly breakdown**, and **Weekly breakdown**. Filter by goal template, goal name, team, or pipeline, and use **Display options** to hide columns. All of these choices stay in the page URL, so you can share a view with a colleague. Click a goal to open it. The goal page shows: - the current period's **Current**, **Target**, and **Remaining** values; - **By contributor** — each person or team's progress for the period. Click a row to see the **Records counted**, which is the fastest way to check an unexpected number; - **By period** — progress across every period of the goal. Statuses you may see are **Not started**, **In progress**, **Achieved**, **Exceeded**, **Missed**, and **No target**. ## Export and report - **Export** downloads the Goals table as a CSV file, using the same filters, year, and breakdown you see on screen. - **Create goal report** builds a report in [Reports](https://workstation.repzo.com/docs/analytics/reports) from the **Goals** data source. Pick a goal, choose users or teams, and choose a **Gauge** (total progress), **Line** (progress over time), or **Bar** (progress by person or team) chart. ## Edit or delete a goal Open the goal and click **Edit** to change its setup, targets, or notifications. Changing the cadence clears the targets, because they belong to the old periods. Deleting a goal removes it and all of its targets. Commission statements that already used the goal are kept. ## Permissions and visibility - **kpis.view** opens the Goals page. **kpis.create**, **kpis.update**, and **kpis.delete** control creating, editing, and deleting goals. - Members without `kpis.view` still see their own goals on the [KPI Dashboard](https://workstation.repzo.com/docs/performance/kpi-dashboard). - Goals follow your workspace's [data visibility](https://workstation.repzo.com/docs/administration/departments#data-access). Editing a goal never changes targets for people outside what you can see. ## Related pages - [KPI Dashboard](https://workstation.repzo.com/docs/performance/kpi-dashboard) - [KPI Reports](https://workstation.repzo.com/docs/performance/kpi-reports) - [Commission Plans](https://workstation.repzo.com/docs/performance/commission-plans) - [Reports](https://workstation.repzo.com/docs/analytics/reports) --- # KPI Reports > Filter goal results by period, goal, person, and status, then drill into the records behind each number. KPI Reports gives you the deeper view behind the [KPI Dashboard](https://workstation.repzo.com/docs/performance/kpi-dashboard). Use it to compare results across people and goals, then look at the records that produced each value. You need the `kpis.view` permission to open KPI Reports. ## Filter the report Use the filters at the top of the page: - **Date** — This Week, Last Week, This Month, Last Month, Last 30 Days, Last 90 Days, This Quarter, Last Quarter, This Year, Last Year, or All Time. - **Definition** — limit the report to one goal. Each goal appears here under its own name. - **User** — limit the report to one person. - **Status** — Not Started, In Progress, Achieved, or Missed. The summary cards show total goals, achieved, missed, average achievement, and **Total Progress** (the sum of current values against the sum of targets). ## Pivot by assignee The **Pivot by assignee** table puts each person or team in a row and splits the results into columns. - **Columns** — group by Day, Month, Quarter, or Year. - **Values** — show **Current / target** or just the **Current value**. Expand a person to see their goals, then expand a goal to see each matched record with its date, owner, and value in the column where it was counted. ## Investigate a result 1. Pick the smallest date range and goal that reproduce the question. 2. Compare current and target values by person. 3. Expand the row and review the matched records. 4. If a number is wrong, fix the source records or the goal's measure (see [Build your own goal](https://workstation.repzo.com/docs/performance/goals#build-your-own-goal)), rather than looking for a way to change the result by hand. For charts you can save and share, use **Create goal report** on the Goals page. It builds a report in [Reports](https://workstation.repzo.com/docs/analytics/reports) from the **Goals** data source. ## Related pages - [KPI Dashboard](https://workstation.repzo.com/docs/performance/kpi-dashboard) - [Goals](https://workstation.repzo.com/docs/performance/goals) - [Reports](https://workstation.repzo.com/docs/analytics/reports) --- # Commission Plans > Pay people on the records their goals count: a flat amount, a rate card, or a percentage. A commission plan decides how much people earn from their work. It pays on the records a [goal](https://workstation.repzo.com/docs/performance/goals) counts. For example, "50 per deal won", "an amount based on the contract length", or "5% of each won deal's amount". Because plans pay on goal records, create the goal first. A plan can't be saved without one. ## Create a plan 1. Open **Performance → Commission Plans**. 2. Click **Create plan**. 3. Work through the three steps: **Setup**, **Qualify**, and **Payout**. 4. Click **Save plan**. ### Step 1: Setup - **Plan name** and an optional **Description**. - **Currency** — the currency the plan pays in. - **Pay period** — **Weekly**, **Monthly**, **Quarterly**, or **Yearly**. Each person gets one statement per period. - **Pay** — choose **People**, **Teams** (everyone in them), or both. - **Starts** and an optional **Ends** date. - **Plan is active** — inactive plans stop producing statements. ### Step 2: Qualify Decide when someone earns the full payout: - **Always** — everyone on the plan gets the payout. - **When all of these goals are achieved** — every selected goal must reach its target in the period. - **When any of these goals is achieved** — at least one selected goal must reach its target. A person qualifies on their own target for a goal, or on their team's target when they don't have one. ### Step 3: Payout 1. Under **Pay on the records counted by**, choose the goal whose records are paid. Each record that goal counts for the person in the period earns a payout. 2. Choose the **Payout** type: | Payout | How it works | | --- | --- | | **An amount per record** → **Same amount for every record** | A flat amount, such as 50 per deal won. | | **An amount per record** → **From a property (rate card)** | Pick a property (native or custom) and list an amount for each value, such as 12-month contract = 300. | | **A percentage of each record's value** | For example 5% of each deal's amount. Add steps such as "from 100% goal progress, pay 7%". The highest step reached applies to every record in the period. | For rate cards, choose what happens **When the value isn't in the list**: **Use the nearest lower value** (4 months pays the 3-month amount), **Pay a default amount**, or **Pay nothing**. Percentages are paid in the workspace's base currency, because record values are kept in it. Set the plan currency to your base currency to use them. If the plan has a qualifying rule, also set **When someone doesn't qualify**: **Pay nothing**, **Pay an amount per record**, or **Pay a percentage of each record's value**. ## Manage plans The plans list shows what each plan pays, which goal it is paid on, when people qualify, its period, and whether it is active. From a plan's menu you can: - **Edit plan** — open and pending statements are recalculated with the new rules. - **Recalculate now** — refresh statements immediately instead of waiting for the hourly update. - **Delete plan** — open and pending statements are removed. Approved and paid statements stay on record. ## Permissions `commissions.view` opens the page, and `commissions.create`, `commissions.update`, and `commissions.delete` control changes to plans. ## Related pages - [Commissions](https://workstation.repzo.com/docs/performance/commissions) - [Goals](https://workstation.repzo.com/docs/performance/goals) - [Properties](https://workstation.repzo.com/docs/administration/properties) --- # Commissions > Review, adjust, approve, and pay commission statements for each person and period. Commissions are worked out for you from your [Commission Plans](https://workstation.repzo.com/docs/performance/commission-plans). Each person gets one **statement** per plan and period. The statement lists the records that were paid, whether the person qualified, and the total amount. ## Review statements Open **Performance → Commissions**. The table shows each statement's person, plan, period, number of records, whether the person qualified, amount, adjustment, total, and status. **Total for this view** adds up the statements that match your filters. Filter by **Plans**, **Person**, or **Status**. You only see statements for people inside your [data visibility](https://workstation.repzo.com/docs/administration/departments#data-access). Click a statement to see: - **Qualification** — each qualifying goal with its target, progress, and whether it was achieved; - **Records paid** — every record with its date, value, amount, and how the amount was worked out (flat amount, rate card, percentage, and so on). Click **Open** to go to the record. ## Statement lifecycle ```text Open -> Pending approval -> Approved -> Paid ``` - **Open** — the period is still running. The statement updates every hour as records come in. - **Pending approval** — the period has ended and the statement is waiting for review. - **Approved** — confirmed. It is no longer recalculated. - **Paid** — the payout has been made. - **Void** — cancelled. It is no longer recalculated. ## Actions | Action | Available when | What it does | | --- | --- | --- | | **Adjust** | Open or pending approval | Adds or takes off an amount with a reason, for example for a refunded deal. Use a negative number to take off. | | **Approve** | Pending approval | Confirms the statement. Only possible once the period has ended. | | **Mark paid** | Approved | Records that the commission was paid. | | **Void** | Open, pending approval, or approved | Cancels the statement. | | **Reopen** | Approved or void | Sends the statement back to open (or pending approval, if the period has ended) so it is recalculated. | These actions need the `commissions.approve` permission. Viewing statements needs `commissions.view`. ## Related pages - [Commission Plans](https://workstation.repzo.com/docs/performance/commission-plans) - [Goals](https://workstation.repzo.com/docs/performance/goals) - [KPI Reports](https://workstation.repzo.com/docs/performance/kpi-reports) --- # Daily Streaks > Encourage steady daily work with one streak per person, kept alive by completed work in any module. Daily Streaks count how many working days in a row each person gets meaningful work done. Every person has one streak. Any qualifying action in any module keeps it alive, so a sales rep and a support agent build their streaks the same way. Streaks are off by default. An admin turns them on for the whole workspace. ## What counts By default, any of these actions counts toward the day: - Completed an activity - Moved a deal to a new stage - Resolved a ticket - Replied in the inbox - Completed an appointment - Completed a project job - Launched a campaign Admins can choose which of these count, and how many are needed in a day. ## Where people see their streak - **Header** — a flame icon shows the current streak. A small dot appears when the streak is at risk today. Click it to see this week, your best streak, freezes left, and the next badge. **About streaks** explains the rules. - **My Stuff** — the streak card shows the current streak, best streak, freezes, and this week's days. - **Dashboard** — add the **Streaks leaderboard** widget to rank team members by their current streak. See [Dashboard](https://workstation.repzo.com/docs/analytics/dashboard). - **Pulse** — profiles show the day streak, and streaks unlock the **On Fire** (7 days) and **Streak Legend** (30 days) badges. See [Pulse](https://workstation.repzo.com/docs/analytics/pulse). When streaks are turned off, none of these appear. ## Badges, freezes, and closed days - **Badges** — six tiers as a streak grows: Spark (3 days), Ember (7), Blaze (14), Inferno (30), Unstoppable (100), and Legend (365). - **Freezes** — a freeze protects the streak when someone misses one working day. People earn one more freeze at every 30-day milestone, up to the workspace maximum. - **Closed days** — days your business is closed don't break a streak. Workstation uses your opening hours, and falls back to Saturday and Sunday when none are set. - **At-risk reminder** — at the chosen hour, people who haven't done any qualifying work yet get a reminder. No reminder is sent on closed days. ## Set up streaks 1. Open **Settings → Users & Permissions → Streaks**. 2. Turn on **Enable streaks**. 3. Adjust the options, then click **Save changes**. | Setting | What it does | Default | | --- | --- | --- | | **Daily threshold** | Qualifying actions needed in a day for it to count (1–50). | 1 | | **Max freezes** | The most freezes a person can hold (0–10). Set 0 to turn freezes off. | 1 | | **At-risk reminder** | Local time to remind people who haven't acted yet. | 8 PM | | **Respect closed days** | Don't break streaks on days your business is closed. | On | | **Qualifying actions** | Which completed actions count. All count by default. | All | Changing streak settings needs the `settings.manage` permission. The at-risk reminder is a notification, so people can choose its channels in their [notification preferences](https://workstation.repzo.com/docs/administration/notifications). ## Related pages - [KPI Dashboard](https://workstation.repzo.com/docs/performance/kpi-dashboard) - [Goals](https://workstation.repzo.com/docs/performance/goals) - [Settings](https://workstation.repzo.com/docs/administration/settings) --- # Content Hub > Create public or private knowledge sites, sections, articles, and AI-ready sources. Content Hub is where Workstation knowledge is written, organized, and published. It can power a public help center, private handbook, product documentation, API reference, and knowledge used by AI agents. ## Sites, sections, and articles - A **site** is the published destination. It has a name, slug, public or private visibility, and Live or Paused state. - A **section** groups related articles and becomes a tab on its site. Sections can also exist as standalone knowledge sources. - An **article** is the individual page readers open and search. The Content Hub home separates **Your sites** from **Knowledge sources**. Sources are grouped as **Articles**, **Websites** (synced website content), **Documents** (uploaded files converted into searchable knowledge), and **Other sources**. Each source shows whether it is used by AI agents (**AI source** or **Not assigned**) and whether it appears on the published Help Center (**Help Center** or **Internal**). Use **New source** to add one. ## Start a knowledge site 1. Open **Knowledge → Content Hub**. 2. Choose **New** and start from a template, blank site, or blank section. 3. Set the site's name, description, slug, and visibility. 4. Add or link sections, then drag them into the intended order. 5. Add articles inside each section. 6. Preview the site, publish its articles, and switch the site to **Live** when ready. Templates scaffold a site, its sections, and starter articles. Everything created by the template can be edited afterward. ## Choose a section layout | Layout | Best for | Additional behavior | | --- | --- | --- | | **Documentation** | Product and process guides | Structured documentation reader. | | **API Reference** | Endpoint documentation | Import an OpenAPI 3.x JSON or YAML file to create draft endpoint articles. | | **Knowledge Base** | Customer help content | Optional “Was this helpful?” feedback. | | **Handbook** | Internal policies and procedures | Optional reader acknowledgment. | Layout controls how a section is rendered on the published site. It does not prevent a section from being moved or linked to a different site. ## Write and publish articles The article editor supports normal rich text and structured blocks such as callouts, cards, columns, accordions, tabs, steps, code groups, prompts, and updates. Articles can be written in the visual editor or edited as Markdown/MDX source. Keep an article in Draft while it is being reviewed. Publish or unpublish articles individually, or publish all drafts from a section. The article record includes its content, discussion, owner, published date, reading time, and available analytics or feedback. ## Visibility and sharing A public site can be opened through its reader URL when it is Live. Use **Copy URL** on the site page to share it. Private sites remain available to authorized workspace users. Preview links let signed-in teammates review a paused site before it goes live. Turn on **Default site** in **Configure** to show that site when visitors open the Content Hub root address. Site settings also hold the name, description, slug, and visibility. Use private visibility for internal policies or operational knowledge. Review the site and every linked section before changing a destination to public. ## Permissions `content_hub.view` opens Content Hub. Creating, editing, publishing, and deleting are controlled by `content_hub.create`, `content_hub.update`, `content_hub.publish`, and `content_hub.delete`. The `_own` variants (`content_hub.update_own`, `content_hub.delete_own`) limit editing and deleting to content the user owns. ## Related pages - [Inbox](https://workstation.repzo.com/docs/operations/inbox) - [Marketplace](https://workstation.repzo.com/docs/configuration/marketplace) - [Settings](https://workstation.repzo.com/docs/administration/settings) - [Team](https://workstation.repzo.com/docs/administration/team) --- # Developer API and CLI > Connect people, scripts, and AI clients to Workstation through delegated browser login or scoped Developer App keys. Workstation exposes the same CRM contract through the public REST API and a JSON CLI. They share scopes, validation, pagination, visibility, and audit behavior. Use browser login for a person working in the CLI. Use a Developer App key for CI, unattended automation, and direct REST API clients. ## Sign in to the CLI with your browser ```bash curl -fsSL https://workstation.repzo.com/install-cli | bash repzo setup agents repzo auth login --profile work --base-url 'https://your-workstation.example' ``` On Windows PowerShell, install with `irm https://workstation.repzo.com/install-cli.ps1 | iex` before running the same `repzo` setup and login commands. The installer downloads a standalone binary and verifies its SHA-256 checksum. When `cosign` is available, it also verifies the release's Sigstore signature. Node and npm are not required. Manual downloads are available from the [public Repzo CLI releases](https://github.com/Repzo/repzo-cli/releases). The CLI opens Workstation in your default browser. Sign in if needed, choose the access to grant, and approve the request. The CLI listens only on an ephemeral `127.0.0.1` callback, validates the response with OAuth state and PKCE, then stores a short-lived access token and rotating refresh token in macOS Keychain when available (or a private mode-0600 file). Delegated CLI access always keeps the signed-in user's current role and record visibility. Removing the user, disabling their account, or reducing their permissions takes effect on later API calls. Run `repzo auth logout --profile work` to revoke the server-side CLI session and delete its local credentials. Run `repzo upgrade` to preview an available standalone release and `repzo upgrade --yes` to install it. The upgrade verifies the release checksum, checks the staged executable's version, and rolls back if the installed binary cannot be confirmed. ## Create a Developer App key 1. Open **Settings → Integrations & Developers → Developer Apps**. 2. On the **API Keys** tab, click **Create App**. 3. Grant only the read or write permissions the integration needs. Write includes read. 4. Copy the `foxa-*` token when it is shown. Workstation stores only its hash and cannot show the plaintext again. Use **Regenerate API key** on an app if a token leaks; the old token stops working. Each [sandbox](https://workstation.repzo.com/docs/administration/sandboxes) has its own Developer Apps, so you can test an integration against test data first. Keep the token in an environment variable or secret store. Do not commit it or place it directly in a command. ## Public API coverage Standard CRUD is available for contacts, accounts, deals, activities, campaigns, projects, tickets, invoices, carts, orders, line items, price offers, products, pipelines, saved reports, appointments, requests, request types, tags, forms, segments, email templates, content collections, and articles. Contacts carry the pipeline, stage, status, source, and channel fields used for lead-management workflows. Pipeline stages are nested under `/pipelines/{id}/stages`. Operational routes cover: - metadata (properties, users, pipelines, countries, industries, lead sources and channels), global search, and record timelines; - comments and media attachments on records, including direct uploads; - notifications, pending approvals, and contact loyalty balances, ledgers, and adjustments; - AI agent setup: knowledge sources, publishing, and test conversations; - report categories, filter values, aggregate execution, and [report queries](https://workstation.repzo.com/docs/analytics/report-queries) (`POST /reports/query` with RepzoQL text); saved reports can be created from a `query` instead of a `config`; - dashboards (`/dashboards`): list, create (empty or from the general or Sales template), rename, delete, and add, change or remove widgets built from a RepzoQL query or a saved report, under the `reports` scope; - outbound event subscriptions, scoped to the calling Developer App; - inbox queues, conversations, messages, replies, notes, assignment, close/reopen, and snooze; - visible chat channels plus message read/write; - voice call history, call channels, analytics, and deprecated geo-locked click-to-call; - Send campaign lookup, transactional/system dispatch, event ingest, and subscription opt-out; - request submission, approval, and rejection; - entity tags and supported activity/email associations; - form and article publishing plus segment evaluation; - email template copies, plus server-built HTML: send an Unlayer `designJson` and the server builds `bodyHtml`, or send `bodyHtml` and the server wraps it in a one-block design the editor can open; - import job status and scheduled CSV/XLSX exports. Event subscriptions belong to one Developer App. To send record changes to your own servers for the whole workspace, use [Webhooks](https://workstation.repzo.com/docs/administration/webhooks) instead. Import uploads stay in the Workstation interface because they require file upload, preview, and column mapping. The public API can inspect those jobs and create exports without accepting internal media IDs. Authentication/password flows, billing administration, connector secrets, support impersonation, destructive workspace maintenance, and private AI traces are intentionally not part of v1. ## Use the REST API or CLI REST requests use the `/api/v1` base path: ```bash curl 'https://your-workstation.example/api/v1/contacts?page=1&limit=20' \ -H 'Authorization: Bearer foxa-your-key' ``` Install the standalone CLI and create a named profile: ```bash curl -fsSL https://workstation.repzo.com/install-cli | bash repzo setup agents repzo auth login --profile work --base-url 'https://your-workstation.example' repzo profiles use work repzo doctor ``` For CI or another non-browser environment, pipe a Developer App key through stdin: ```bash printf '%s' "$REPZO_DEVELOPER_APP_TOKEN" | repzo auth login --profile ci --token-stdin ``` `REPZO_TOKEN` and `REPZO_BASE_URL` can still override a profile for an ephemeral process. Domain commands produce JSON and call the same routes: ```bash repzo contacts list --query 'email=person@example.com' --limit 20 repzo tickets create --data @ticket.json --dry-run repzo inbox conversations reply CONVERSATION_ID --data @reply.json --dry-run repzo chat send CHANNEL_ID --data '{"body":"Hello","bodyFormat":"plain"}' --dry-run repzo contacts list --all ``` Every mutation requires `--yes`; use `--dry-run` first. The CLI retries temporary `429`, `502`, `503`, and `504` responses, and `--all` follows both offset and cursor pagination. Successful commands return a stable envelope that agents can chain: ```json { "ok": true, "data": [{ "id": "contact-id", "firstName": "Maya" }], "summary": "1 result", "breadcrumbs": [ { "action": "get", "cmd": "repzo contacts get contact-id", "description": "Get Maya" } ], "meta": { "page": 1, "command": "repzo contacts list" } } ``` Pass `--quiet` for raw `data` in shell scripts. Pass `--agent` for raw, non-interactive agent output; `--agent --help` still returns focused command discovery. Errors are structured on stderr with a stable `error.code`, an actionable hint, and a `retryable` flag. | Exit | Error code | Meaning | |---:|---|---| | `1` | `usage` | Invalid command, flag, or local input | | `2` | `not_found` | Profile or API resource not found | | `3` | `auth` | Missing or invalid authentication | | `4` | `forbidden` | Missing access or API scope | | `5` | `rate_limit` | Retry limit reached | | `6` | `network` | API could not be reached | | `7` | `api` | Validation or server failure | | `8` | `ambiguous` | A more specific target is required | For agent discovery and setup: ```bash repzo commands --json repzo inbox conversations --agent --help repzo setup agents repzo setup codex repzo setup claude ``` `repzo setup agents` installs the bundled skill under `~/.agents/skills/repzo-workstation` and links every detected Codex or Claude installation to that shared copy. Use a specific setup command to connect one agent explicitly. Start a new agent thread after setup. Installed skills refresh automatically on the first CLI command after a CLI version upgrade, and `repzo doctor` verifies their paths and versions. Use `repzo openapi` or open `/api/v1/docs` for the exact fields and filters. Generate shell completion with `repzo completion zsh`, `bash`, or `fish`. Inputs are strict; unknown fields and filters return `422`. ## Bulk updates Apply the same changes to up to 500 records with `POST /api/v1/{resource}/bulk-update` or the matching CLI command. Supported resources are contacts, accounts, deals, activities, projects, tickets, invoices, price-offers, campaigns, and products. Select records with the list endpoint first, then save their unique IDs and the shared changes in `bulk-update.json`: ```json { "ids": ["11111111-1111-4111-8111-111111111111", "22222222-2222-4222-8222-222222222222"], "updates": { "rating": "warm", "country": "JO" } } ``` ```bash repzo contacts bulk-update --data @bulk-update.json --dry-run --idempotency-key contact-rating-batch-1 repzo contacts bulk-update --data @bulk-update.json --yes --idempotency-key contact-rating-batch-1 ``` The endpoint accepts explicit IDs only. It requires the resource's write scope and applies the caller's current update permissions and record visibility. Native fields must be bulk-editable; custom properties use stable names under `updates.customProperties`. Check the resource's bulk-update schema in `/api/v1/docs` for accepted fields. `--dry-run` previews the request locally without running server validation. The response includes `total`, `succeeded`, `failed`, and `results`, with one `{ id, success, error? }` entry per requested ID. **HTTP 200 and CLI exit code 0 can include failed records.** Inspect each result and re-read successful records to verify the changes. Updates are independent; a failed record does not roll back successful ones. For larger selections, send batches of at most 500 unique IDs with a separate idempotency key per batch. Reuse a key only for an identical retry. After a completed batch, retry corrected failures with a new key. `If-Match` is not supported for bulk updates; use single-record updates when a change must match a previously read ETag. ## Safety and troubleshooting - Start with read scopes and add write scopes only when needed. - Read a record and its metadata before updating it. - Use ISO-2 country codes and stable custom property names. - A `403` usually means the Developer App lacks the required scope. - A `422` means the request does not match the public contract; inspect its error details instead of guessing fields. - A `429` means the public API rate limit was reached; honor the retry window. ## Chat apps To post rich, interactive messages, open modals or build a Home tab in Chat, create an app on the **Bots** tab of Developer Apps instead of an API key app. See [Chat apps](https://workstation.repzo.com/docs/developers/chat-apps) and the [Block Kit reference](https://workstation.repzo.com/docs/developers/block-kit). See [Settings](https://workstation.repzo.com/docs/administration/settings) for the rest of the workspace configuration surface. --- # Chat apps > Build apps that post rich, interactive messages, modals and a Home tab in Repzo Chat — with the same Block Kit JSON and API names as Slack. A chat app (a **bot**) is a member of Repzo Chat that your code drives. It posts messages built from [Block Kit](https://workstation.repzo.com/docs/developers/block-kit) blocks, hears when people click its buttons or fill in its forms, opens [modals](https://workstation.repzo.com/docs/developers/chat-apps/modals), and can give each person a [Home tab](https://workstation.repzo.com/docs/developers/chat-apps/app-home). If you have built a Slack app, you already know most of it: the payloads, method names (`chat.postMessage`, `views.open`, …) and interaction shapes are Slack's. The differences are listed on each reference page under **How Repzo Chat differs from Slack**. > **Building with an AI assistant?** > > Every docs page has a **Copy page** button, and each page is also plain Markdown at its URL plus `.md`. Point your assistant at [/docs/llms.txt](https://workstation.repzo.com/docs/llms.txt) for the index, or [/docs/llms-full.txt](https://workstation.repzo.com/docs/llms-full.txt) for everything in one file. ## Create a bot 1. Open **Settings → Integrations & Developers → Developer Apps** and choose the **Bots** tab. 2. Create a bot. Give it a name and avatar — that's how it appears in Chat. 3. Copy its `foxa-*` token when it is shown. Workstation stores only a hash and can't show it again. 4. Under **Interactivity**, set the HTTPS URL that should receive clicks and form submissions. Copy the **signing secret** shown once — you need it to [verify requests](#verify-requests-from-repzo). 5. Add the bot to the channels it should post in (public channels work without joining when the bot has `chat:write.public`). Keep the token in a secret store or environment variable. Never commit it. ## Two ways to call Workstation | | Slack-compatible bot API | Public REST API v1 | |---|---|---| | Base path | `/api/bot/` | `/api/v1/...` | | Style | Slack method names and bodies, answers `{ "ok": true, ... }` | REST resources, OpenAPI-documented at [/api/v1/docs](https://workstation.repzo.com/api/v1/docs) | | Best for | Porting Slack apps, Slack SDKs pointed at Repzo | New integrations that also use other Workstation resources | Both take a `Authorization: Bearer foxa-…` header and the same Block Kit JSON. ### Bot API methods | Method | What it does | |---|---| | `POST /api/bot/chat.postMessage` | [Post a message](https://workstation.repzo.com/docs/developers/chat-apps/sending-messages) (`channel`, `text`, `blocks`, `attachments`, `thread_ts`) | | `POST /api/bot/chat.update` | Edit a message your bot posted (`ts`, `text`, `blocks`, `attachments`) | | `POST /api/bot/chat.delete` | Delete a message your bot posted (`ts`) | | `POST /api/bot/chat.postEphemeral` | [Post a message only one person sees](https://workstation.repzo.com/docs/developers/chat-apps/ephemeral-messages) | | `POST /api/bot/views.open` / `views.push` / `views.update` | [Open, stack and update modals](https://workstation.repzo.com/docs/developers/chat-apps/modals) | | `POST /api/bot/views.publish` | [Set a person's Home tab](https://workstation.repzo.com/docs/developers/chat-apps/app-home) | | `GET /api/bot/channels.list` / `channels.info` | List public channels / look one up | | `GET /api/bot/files/:id` | Download a file someone attached in your form (the link comes in the payload) | `channel` accepts a channel id or its short name (`sales` or `#sales`). ### Scopes A bot's scopes are set when it is created: `chat:write.public` (post in public channels), `chat:write` (post anywhere it's a member), `chat:write.thread`, `chat:update`, `chat:delete` and `channels:read`. ## Quick start Post a message with a button: ```bash curl -X POST https://workstation.repzo.com/api/bot/chat.postMessage \ -H "Authorization: Bearer $REPZO_BOT_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "channel": "sales", "text": "New deal: Acme expansion", "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "*New deal:* Acme expansion — $12,000" } }, { "type": "actions", "elements": [ { "type": "button", "action_id": "approve", "style": "primary", "text": { "type": "plain_text", "text": "Approve" }, "value": "deal-42" } ] } ] }' ``` When someone clicks **Approve**, your interactivity URL receives a [`block_actions` payload](https://workstation.repzo.com/docs/developers/chat-apps/interactivity). ## Verify requests from Repzo Every request Workstation sends your app — clicks, form submissions, option lookups, events — is signed with your signing secret: ```http X-Fox-Timestamp: 1791799555 X-Fox-Signature: sha256=5f2c… ``` The signature is `HMAC-SHA256(secret, ".")` as hex. Recompute it over the raw body, compare in constant time, and reject requests older than five minutes. ```js function isFromRepzo(rawBody, headers, secret) { const timestamp = headers["x-fox-timestamp"]; if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false; const expected = "sha256=" + crypto.createHmac("sha256", secret).update(`${timestamp}.${rawBody}`).digest("hex"); const given = headers["x-fox-signature"] ?? ""; return given.length === expected.length && crypto.timingSafeEqual(Buffer.from(given), Buffer.from(expected)); } ``` > **Differs from Slack** > > Slack signs with `X-Slack-Signature: v0=…`. Repzo uses the `X-Fox-*` headers above, and sends interaction payloads as JSON (`Content-Type: application/json`), not as a form-encoded `payload=` field. ## Sandboxes A [sandbox](https://workstation.repzo.com/docs/administration/settings) has its own Developer Apps. Requests to your own bot endpoints are delivered from sandboxes too, so you can test an app end to end without touching the live workspace. ## Next steps - [Sending messages](https://workstation.repzo.com/docs/developers/chat-apps/sending-messages) - [Interactivity](https://workstation.repzo.com/docs/developers/chat-apps/interactivity) - [Modals](https://workstation.repzo.com/docs/developers/chat-apps/modals) - [App Home](https://workstation.repzo.com/docs/developers/chat-apps/app-home) - [Ephemeral messages](https://workstation.repzo.com/docs/developers/chat-apps/ephemeral-messages) - [Formatting text](https://workstation.repzo.com/docs/developers/chat-apps/formatting-text) - [Block Kit reference](https://workstation.repzo.com/docs/developers/block-kit) --- # Sending messages > Post, update and delete chat messages from your app with text, Block Kit blocks and attachments. A message has three optional parts: `text`, `blocks` and `attachments`. Send at least one. - **`text`** — plain text with [mrkdwn formatting](https://workstation.repzo.com/docs/developers/chat-apps/formatting-text). With `blocks`, it becomes the notification and search fallback, as on Slack. - **`blocks`** — up to 50 [Block Kit blocks](https://workstation.repzo.com/docs/developers/block-kit/blocks). This is what people see. - **`attachments`** — Slack's legacy [secondary attachments](https://workstation.repzo.com/docs/developers/block-kit/objects/attachment-object) with a coloured side bar, shown after the blocks. ## Post a message ```http POST /api/bot/chat.postMessage Authorization: Bearer foxa-… Content-Type: application/json ``` ```json { "channel": "support", "text": "Ticket #4821 was escalated", "blocks": [ { "type": "header", "text": { "type": "plain_text", "text": "Ticket #4821 escalated" } }, { "type": "section", "fields": [ { "type": "mrkdwn", "text": "*Customer*\nAcme Ltd" }, { "type": "mrkdwn", "text": "*Priority*\nUrgent" } ] } ] } ``` | Field | Description | |---|---| | `channel` | Channel id or short name. Required. | | `text` | Message text, or the fallback when `blocks` are sent. | | `blocks` | Array of blocks, or the same array as a JSON string (form-encoded requests). | | `attachments` | Array of attachments, or a JSON string. | | `thread_ts` | Reply in a thread: the parent message's `ts`. | | `idempotency_key` | Or the `Idempotency-Key` header. Retrying with the same key returns the first message instead of posting twice. | The answer follows Slack: ```json { "ok": true, "ts": "3a77c808-55af-410c-aac3-32f02c0c782f", "channel": "e0fd46e9-86de-4104-a1d0-f7a1ed30f403", "message": { "text": "Ticket #4821 was escalated", "ts": "3a77c808-…", "bot_id": "75385d0c-…", "blocks": [ … ] } } ``` `ts` is the message id: keep it to update, delete or reply to the message. > **Differs from Slack** > > Message ids (`ts`) are UUIDs, not timestamps. Treat them as opaque strings. ## Warnings, never rejections Workstation never rejects a message because of its blocks. Missing `block_id` / `action_id` values are generated, unsupported blocks are skipped, and anything that doesn't match the Block Kit rules is reported back in `response_metadata.warnings` (bot API) or `warnings` (REST API) so you can fix it: ```json { "ok": true, "ts": "…", "response_metadata": { "warnings": ["blocks[1].elements[0].text: longer than 75 characters"] } } ``` ## Update and delete ```http POST /api/bot/chat.update ``` ```json { "ts": "3a77c808-…", "text": "Ticket #4821 resolved", "blocks": [ … ] } ``` Sending `blocks` or `attachments` replaces them; sending only `text` replaces the whole message with that text. People see the edit immediately. Delete with `POST /api/bot/chat.delete` and `{ "ts": "…" }`. An app can only edit and delete its own messages. ## Using the REST API instead The same messages through the [REST API](https://workstation.repzo.com/api/v1/docs): ```http POST /api/v1/chat/channels/{channelId}/messages ``` ```json { "body": "Ticket #4821 was escalated", "blocks": [ … ], "attachments": [ … ], "parentMessageId": "…", "clientMessageId": "9b2f…" } ``` `PATCH /api/v1/chat/messages/{id}` takes `body`, `blocks` and `attachments`; `DELETE /api/v1/chat/messages/{id}` deletes. The REST API needs the `chat_messages:write` scope. ## Errors | `error` | Meaning | |---|---| | `channel_not_found` | No such channel, or the bot can't post there (private channel it isn't in, or not on its allowlist). | | `is_archived` | The channel is archived. | | `not_in_channel` | An AI-agent bot must be a member of the channel. | | `no_text` | No `text`, `blocks` or `attachments`. | | `message_not_found` | `chat.update` / `chat.delete` on a message that isn't the bot's or no longer exists. | | `missing_scope` | The bot lacks a scope; `needed` names it. | ## Related - [Block Kit reference](https://workstation.repzo.com/docs/developers/block-kit) - [Formatting text](https://workstation.repzo.com/docs/developers/chat-apps/formatting-text) - [Interactivity](https://workstation.repzo.com/docs/developers/chat-apps/interactivity) --- # Interactivity > Receive block_actions when people use your app's controls, answer with response_url, open modals with trigger_id, and load options for external selects. When someone clicks a button, picks an option, changes a date or submits a form in something your app posted, Workstation sends your app a request — the same payloads Slack sends. This page covers clicks and changes (`block_actions`), answering them, and live option lists (`block_suggestion`). Forms are covered in [Modals](https://workstation.repzo.com/docs/developers/chat-apps/modals). ## Set the interactivity URL Open **Settings → Integrations & Developers → Developer Apps → Bots**, expand your bot and fill in **Interactivity**. Workstation sends: - `block_actions` — a control in a message, [ephemeral message](https://workstation.repzo.com/docs/developers/chat-apps/ephemeral-messages), modal or [Home tab](https://workstation.repzo.com/docs/developers/chat-apps/app-home) was used - `view_submission` and `view_closed` — see [Modals](https://workstation.repzo.com/docs/developers/chat-apps/modals) - `block_suggestion` — someone typed into an [external select](https://workstation.repzo.com/docs/developers/block-kit/elements/select-menu-element) Only the app that posted a message hears about its controls. Every request is signed — [verify it](https://workstation.repzo.com/docs/developers/chat-apps#verify-requests-from-repzo). > **Tip** > > The same setting is available through the API: an event subscription whose `eventTypes` include `block_actions` (and optionally `block_suggestion` for a separate options URL) — `POST /api/v1/events/subscriptions`. ## The `block_actions` payload ```json { "type": "block_actions", "team": { "id": "1bf87154-…" }, "user": { "id": "42bc76d7-…", "username": "dana@example.com", "name": "Dana Reader", "team_id": "1bf87154-…" }, "api_app_id": "75385d0c-…", "container": { "type": "message", "message_ts": "3a77c808-…", "channel_id": "e0fd46e9-…", "is_ephemeral": false }, "trigger_id": "c0b6f3d1-…", "channel": { "id": "e0fd46e9-…", "name": "refunds" }, "message": { "type": "message", "ts": "3a77c808-…", "bot_id": "75385d0c-…", "blocks": [ … ] }, "state": { "values": { "pick": { "reason": { "type": "static_select", "selected_option": { "text": { "type": "plain_text", "text": "Damaged" }, "value": "damaged" } } } } }, "response_url": "https://workstation.repzo.com/api/bot/responses/eyJ…", "actions": [ { "type": "button", "action_id": "approve", "block_id": "decision", "text": { "type": "plain_text", "text": "Approve" }, "value": "refund-42", "style": "primary", "action_ts": "1791799555.321000" } ] } ``` - `actions[0]` is what was used. Its value field depends on the element — `value` for buttons, `selected_option` for menus and radio buttons, `selected_date`, `selected_time`, `selected_date_time`, `selected_user(s)`, `selected_conversation(s)`… Each [element page](https://workstation.repzo.com/docs/developers/block-kit/elements) lists its own. - `state.values` holds the current value of every other control in the message, keyed by `block_id` then `action_id`, so a **Submit** button can read the menus next to it. - People can only pick what your blocks offer: option text in the payload comes from your message, never from the person's browser. - In a modal or Home tab, `container` is `{ "type": "view", "view_id": "…" }`, the payload carries `view` instead of `message`, and there is no `response_url`. Answer with any `2xx`. Clicks are delivered from a queue, so unlike Slack you don't have to answer within three seconds — but a failed delivery isn't retried, so keep the endpoint up. Each delivery is logged, and a subscription that fails five times in a row is turned off: fix the URL and turn it back on in the bot's settings. ## Answer with `response_url` Each payload from a message has a `response_url`. `POST` JSON to it to change what the person sees — no token needed. It works five times within 30 minutes. | Body | Effect | |---|---| | `{ "replace_original": true, "text": "…", "blocks": [ … ] }` | Replace the message the control was in | | `{ "delete_original": true }` | Delete that message | | `{ "response_type": "in_channel", "text": "…", "blocks": [ … ] }` | Post a new message in the same conversation (and thread) | | `{ "text": "…", "blocks": [ … ] }` | Post an [ephemeral message](https://workstation.repzo.com/docs/developers/chat-apps/ephemeral-messages) only the person who clicked sees (Slack's default) | ```bash curl -X POST "$RESPONSE_URL" -H "Content-Type: application/json" \ -d '{ "replace_original": true, "text": "Refund approved ✅" }' ``` `attachments` are accepted in every case. You can also edit the message any time with `chat.update`. ## Open a modal with `trigger_id` Every interaction payload has a `trigger_id`. Pass it to `views.open` within **60 seconds** to open a modal for that person; each trigger works once. See [Modals](https://workstation.repzo.com/docs/developers/chat-apps/modals). ## Confirmation dialogs Add a [`confirm` object](https://workstation.repzo.com/docs/developers/block-kit/objects/confirmation-dialog-object) to a button, menu or picker to ask "Are you sure?" before the action is sent. ## Live options: `block_suggestion` An [`external_select`](https://workstation.repzo.com/docs/developers/block-kit/elements/select-menu-element) asks your app for options as the person types. Once they type at least `min_query_length` characters (default 3), Workstation `POST`s, signed: ```json { "type": "block_suggestion", "user": { "id": "42bc76d7-…", "name": "Dana Reader" }, "api_app_id": "75385d0c-…", "container": { "type": "message", "message_ts": "3a77c808-…", "channel_id": "e0fd46e9-…" }, "block_id": "lookup", "action_id": "customer", "value": "lin" } ``` Answer within **3 seconds** with up to 100 options or option groups: ```json { "options": [ { "text": { "type": "plain_text", "text": "Lina Haddad" }, "value": "cust-1" }, { "text": { "type": "plain_text", "text": "Linda Saleh" }, "value": "cust-2" } ] } ``` The person can only pick an option you returned (or the element's `initial_option`); anything else is refused before it reaches you. ## Other events To hear about Home tab opens, subscribe to `app_home_opened` — it arrives as a regular event (`{ "type": "event_callback", "event": { … } }`). See [App Home](https://workstation.repzo.com/docs/developers/chat-apps/app-home). ## Related - [Modals](https://workstation.repzo.com/docs/developers/chat-apps/modals) - [Block elements](https://workstation.repzo.com/docs/developers/block-kit/elements) - [Ephemeral messages](https://workstation.repzo.com/docs/developers/chat-apps/ephemeral-messages) --- # Modals > Open forms from your chat app with views.open, collect input blocks, validate submissions and stack up to three views. A modal is a dialog your app opens for one person — usually a form. It is a **view**: a title, an optional submit and close button, and up to 100 [blocks](https://workstation.repzo.com/docs/developers/block-kit/blocks), including [input blocks](https://workstation.repzo.com/docs/developers/block-kit/blocks/input-block). ## Open a modal Modals open in answer to something the person did, so you need the `trigger_id` from an [interaction payload](https://workstation.repzo.com/docs/developers/chat-apps/interactivity). Use it within 60 seconds, once. ```http POST /api/bot/views.open Authorization: Bearer foxa-… ``` ```json { "trigger_id": "c0b6f3d1-…", "view": { "type": "modal", "callback_id": "refund_form", "title": { "type": "plain_text", "text": "Refund request" }, "submit": { "type": "plain_text", "text": "Submit" }, "close": { "type": "plain_text", "text": "Cancel" }, "private_metadata": "order-4821", "blocks": [ { "type": "input", "block_id": "reason", "label": { "type": "plain_text", "text": "Reason" }, "element": { "type": "plain_text_input", "action_id": "value", "multiline": true, "min_length": 3 } }, { "type": "input", "block_id": "amount", "label": { "type": "plain_text", "text": "Amount (JOD)" }, "element": { "type": "number_input", "action_id": "value", "is_decimal_allowed": true, "min_value": "1" } } ] } } ``` The answer is `{ "ok": true, "view": { "id": "…", "hash": "…", … } }`. Keep `view.id` (or set your own `external_id`) to update it later. ### View fields | Field | Description | |---|---| | `type` | `modal` | | `title` | `plain_text`, up to 24 characters. Required. | | `submit` | Submit button label (`plain_text`, 24). Required when the view has input blocks. | | `close` | Close button label (`plain_text`, 24). Defaults to "Cancel". | | `blocks` | Up to 100 blocks. | | `private_metadata` | Up to 3000 characters, returned to you in every payload from this view. | | `callback_id` | Your name for the view, returned in payloads. | | `external_id` | Your own unique id for the view, usable with `views.update`. | | `clear_on_close` | Closing this view closes the whole stack. | | `notify_on_close` | Send `view_closed` when the person closes it. | | `submit_disabled` | Show the submit button disabled. | ## Inputs [Input blocks](https://workstation.repzo.com/docs/developers/block-kit/blocks/input-block) hold one element each: [plain text](https://workstation.repzo.com/docs/developers/block-kit/elements/plain-text-input-element), [email](https://workstation.repzo.com/docs/developers/block-kit/elements/email-input-element), [URL](https://workstation.repzo.com/docs/developers/block-kit/elements/url-input-element), [number](https://workstation.repzo.com/docs/developers/block-kit/elements/number-input-element), [rich text](https://workstation.repzo.com/docs/developers/block-kit/elements/rich-text-input-element), [file](https://workstation.repzo.com/docs/developers/block-kit/elements/file-input-element), or any menu, picker, checkbox group or radio group. Mark a block `optional: true` to allow it empty. Inputs don't send anything while the person types. Set `dispatch_action: true` on an input block to also get a `block_actions` payload when that element changes (text inputs dispatch on Enter, or as they type with a [dispatch action configuration](https://workstation.repzo.com/docs/developers/block-kit/objects/dispatch-action-configuration-object)). ## Handle the submission When the person presses submit, Workstation first checks the form itself — required fields, lengths, number ranges, email and URL formats — and shows errors under the fields without bothering your app. Then it sends `view_submission`: ```json { "type": "view_submission", "user": { "id": "42bc76d7-…", "name": "Dana Reader" }, "api_app_id": "75385d0c-…", "trigger_id": "…", "view": { "id": "8d3bc164-…", "callback_id": "refund_form", "private_metadata": "order-4821", "state": { "values": { "reason": { "value": { "type": "plain_text_input", "value": "Box arrived damaged" } }, "amount": { "value": { "type": "number_input", "value": "129.5" } } } } } } ``` This one is **synchronous**: answer within 3 seconds. Your answer decides what happens next. | Answer | Effect | |---|---| | Empty `200` | Close this view (the one below it, if any, shows again) | | `{ "response_action": "errors", "errors": { "reason": "Too short" } }` | Keep the view open and show each message under its input block | | `{ "response_action": "update", "view": { … } }` | Replace this view | | `{ "response_action": "push", "view": { … } }` | Stack a new view on top (up to 3) | | `{ "response_action": "clear" }` | Close every view in the stack | If your app doesn't answer in time, the person sees an error and the view stays open. Files from a [file input](https://workstation.repzo.com/docs/developers/block-kit/elements/file-input-element) arrive as `{ "id", "name", "mimetype", "size", "url_private" }`. Download `url_private` with your bot token within 7 days. ## Update and push from your app ```http POST /api/bot/views.update ``` ```json { "view_id": "8d3bc164-…", "hash": "…", "view": { "type": "modal", … } } ``` Pass `external_id` instead of `view_id` if you set one. With `hash`, a view the person changed since you read it fails with `hash_conflict` instead of being overwritten. `views.push` stacks a new view and needs a `trigger_id` from inside the modal. The person's typed values are kept for inputs whose `block_id` and `action_id` are still there after an update. ## When the person closes it **Cancel** or the back arrow closes the top view; **×** closes the whole modal. With `notify_on_close`, you get: ```json { "type": "view_closed", "view": { … }, "is_cleared": true } ``` `is_cleared` is `true` when the whole stack closed. It is delivered from the queue and needs no answer. ## Errors | `error` | Meaning | |---|---| | `invalid_trigger_id`, `expired_trigger_id`, `exchanged_trigger_id` | Unknown, older than 60 seconds, or already used | | `push_limit_reached` | Three views are already stacked | | `not_found` | No such open view for this app | | `hash_conflict` | The view changed since your `hash` | | `duplicate_external_id` | Another open view of this app already uses that `external_id` | | `invalid_arguments` | Missing `view`, wrong `view.type`, or neither `view_id` nor `external_id` | ## Related - [Input block](https://workstation.repzo.com/docs/developers/block-kit/blocks/input-block) - [Interactivity](https://workstation.repzo.com/docs/developers/chat-apps/interactivity) - [App Home](https://workstation.repzo.com/docs/developers/chat-apps/app-home) --- # App Home > Give each person a Home tab in your app's conversation with views.publish, and know when they open it with app_home_opened. Every bot has its own conversation with each person. When your app publishes a Home view, that conversation gets a **Home** tab next to **Messages** — a personal dashboard built from [blocks](https://workstation.repzo.com/docs/developers/block-kit/blocks), with working buttons, menus and pickers. ## Publish a Home tab ```http POST /api/bot/views.publish Authorization: Bearer foxa-… ``` ```json { "user_id": "42bc76d7-…", "view": { "type": "home", "blocks": [ { "type": "header", "text": { "type": "plain_text", "text": "Your refunds" } }, { "type": "section", "text": { "type": "mrkdwn", "text": "*3* refunds are waiting for you." }, "accessory": { "type": "button", "action_id": "open_form", "style": "primary", "text": { "type": "plain_text", "text": "New refund" } } } ] } } ``` Each person has one Home view per app; publishing again replaces it, and the open tab updates at once. Pass the `hash` from the last publish to avoid overwriting a newer one (`hash_conflict`). The view holds up to 100 blocks and no title or submit button. Controls in the Home tab send `block_actions` with `container: { "type": "view", "view_id": "…" }` and a `trigger_id`, so a Home button can [open a modal](https://workstation.repzo.com/docs/developers/chat-apps/modals). ## Know when it's opened Subscribe your bot to the `app_home_opened` event (an event subscription listing it, or the API: `POST /api/v1/events/subscriptions`). When the person opens the conversation, you get: ```json { "type": "event_callback", "event_id": "evt_…", "event": { "type": "app_home_opened", "user": "42bc76d7-…", "channel": "3f5b15e4-…", "tab": "home", "view": { "id": "235b2941-…", "type": "home", … } } } ``` `tab` is `home` or `messages`; `view` is there when you have already published one. A good pattern is to publish (or refresh) the Home view whenever you get this event. > **Differs from Slack** > > Slack sends `app_home_opened` every time; Workstation sends it at most once a minute per person and tab. There is no **About** tab. The Home tab shows when your app has published a view for the person or subscribes to `app_home_opened`. ## Related - [Modals](https://workstation.repzo.com/docs/developers/chat-apps/modals) - [Interactivity](https://workstation.repzo.com/docs/developers/chat-apps/interactivity) - [Blocks](https://workstation.repzo.com/docs/developers/block-kit/blocks) --- # Ephemeral messages > Show a message to one person in a conversation without posting it for everyone. An ephemeral message appears only for one person, inline in the conversation, marked **Only visible to you**. It isn't saved to the conversation: it disappears when the person reloads or dismisses it — the same behaviour as Slack. Use them for confirmations ("Your refund was queued"), private hints, or a question only the person who clicked should answer. ## Send one ```http POST /api/bot/chat.postEphemeral Authorization: Bearer foxa-… ``` ```json { "channel": "refunds", "user": "42bc76d7-…", "text": "Only you can see this", "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "Refund *#4821* was queued. Want to undo it?" } }, { "type": "actions", "elements": [{ "type": "button", "action_id": "undo", "style": "danger", "text": { "type": "plain_text", "text": "Undo" } }] } ] } ``` | Field | Description | |---|---| | `channel` | Channel id or short name. Required. | | `user` | The person who sees it. They must be able to read the channel. Required. | | `text`, `blocks`, `attachments` | As in [chat.postMessage](https://workstation.repzo.com/docs/developers/chat-apps/sending-messages). | | `thread_ts` | Show it in a thread. | The answer is `{ "ok": true, "message_ts": "…" }`. REST API: `POST /api/v1/chat/channels/{id}/ephemeral` with `userId`, `body`, `blocks`, `attachments`, `parentMessageId`. ## Controls in ephemeral messages Buttons and menus work. Their `block_actions` payload has `container.is_ephemeral: true` and no `message`, and a `response_url` that can replace (`replace_original`) or delete (`delete_original`) the ephemeral message. Controls stay usable for 24 hours. The [`response_url`](https://workstation.repzo.com/docs/developers/chat-apps/interactivity#answer-with-response_url) of any interaction also posts an ephemeral message when you send `text` or `blocks` without `response_type` — Slack's default. ## Related - [Interactivity](https://workstation.repzo.com/docs/developers/chat-apps/interactivity) - [Sending messages](https://workstation.repzo.com/docs/developers/chat-apps/sending-messages) --- # Formatting text > mrkdwn syntax for chat app messages: bold, italics, links, mentions, channels, dates and emoji. Text objects with `"type": "mrkdwn"` — and a message's top-level `text` — use Slack's **mrkdwn**, a small markdown dialect. `plain_text` shows text as written (emoji shortcodes still work when `emoji` isn't `false`). For full Markdown, use a [markdown block](https://workstation.repzo.com/docs/developers/block-kit/blocks/markdown-block). ## Basic formatting | You write | People see | |---|---| | `*bold*` | **bold** | | `_italic_` | *italic* | | `~strike~` | ~~strike~~ | | `` `code` `` | `code` | | ` ```block of code``` ` | A code block (nothing inside it is formatted) | | `> quoted line` at the start of a line | A quote | | A new line (`\n`) | A line break | ## Links | You write | People see | |---|---| | `` | https://example.com | | `` | the docs | | `` | Email sales | Only `http`, `https` and `mailto` links are shown as links. Repzo pages open inside Workstation. ## Mentions and channels | You write | People see | |---|---| | `<@USER_ID>` | A mention chip with the person's current name | | `<#CHANNEL_ID>` | A link to the channel (the name shows only for public channels) | | ``, ``, `` | `@here`, `@channel`, `@everyone` | | `` | `@Department name` — Slack user groups map to Workstation departments | Use the ids from `/api/v1/chat/users`, `/api/bot/channels.list` and the departments API. You can add a fallback label after a `|`: `<@USER_ID|Dana>`. > **Differs from Slack** > > Mentions and broadcasts from an app are shown, but they don't send notifications. ## Dates `` shows a date in each reader's own locale and time zone: ```text Due ``` | Token | Example | |---|---| | `{date_num}` | 2026-10-20 | | `{date}` | October 20, 2026 | | `{date_short}` | Oct 20, 2026 | | `{date_long}` | Tuesday, October 20, 2026 | | `{date_pretty}`, `{date_short_pretty}`, `{date_long_pretty}` | As above, or "today", "yesterday", "tomorrow" | | `{time}` | 10:00 AM | | `{time_secs}` | 10:00:00 AM | | `{ago}` | in 3 days | The fallback shows wherever the date can't be formatted (search results, notifications). ## Emoji `:white_check_mark:`, `:tada:`, `:warning:` and the other standard shortcodes become emoji. Skin tones work as `:thumbsup::skin-tone-3:`. ## Escaping Write a literal `&`, `<` or `>` as `&`, `<` and `>` — as on Slack — so they aren't read as links or mentions. ## Related - [Text object](https://workstation.repzo.com/docs/developers/block-kit/objects/text-object) - [Rich text block](https://workstation.repzo.com/docs/developers/block-kit/blocks/rich-text-block) — structured formatting without markup - [Sending messages](https://workstation.repzo.com/docs/developers/chat-apps/sending-messages) --- # Block Kit > The JSON layout format chat apps use for messages, modals and the Home tab — compatible with Slack's Block Kit. Block Kit is how a [chat app](https://workstation.repzo.com/docs/developers/chat-apps) lays out its messages, [modals](https://workstation.repzo.com/docs/developers/chat-apps/modals) and [Home tab](https://workstation.repzo.com/docs/developers/chat-apps/app-home): a list of **blocks**, stacked top to bottom. Blocks hold text, images and **block elements** — buttons, menus, pickers and inputs — and share small **composition objects** such as text and options. It is Slack's Block Kit: the same JSON renders in Repzo Chat on the web and in the mobile app. Where Workstation behaves differently, the reference page says so under **How Repzo Chat differs from Slack**. ```json { "blocks": [ { "type": "header", "text": { "type": "plain_text", "text": "Refund request #4821" } }, { "type": "section", "text": { "type": "mrkdwn", "text": "*Acme Ltd* asked for a refund of *JOD 129.00*." }, "accessory": { "type": "image", "image_url": "https://picsum.photos/id/164/200/200", "alt_text": "Order photo" } }, { "type": "actions", "elements": [ { "type": "button", "action_id": "approve", "style": "primary", "text": { "type": "plain_text", "text": "Approve" }, "value": "4821" }, { "type": "button", "action_id": "reject", "style": "danger", "text": { "type": "plain_text", "text": "Reject" }, "value": "4821" } ] } ] } ``` ## Reference - [Blocks](https://workstation.repzo.com/docs/developers/block-kit/blocks) — section, header, actions, card, carousel, data table, charts, input and more - [Block elements](https://workstation.repzo.com/docs/developers/block-kit/elements) — buttons, menus, pickers and inputs - [Composition objects](https://workstation.repzo.com/docs/developers/block-kit/objects) — text, options, confirmation dialogs, attachments - [Rich text elements](https://workstation.repzo.com/docs/developers/block-kit/rich-text) — the pieces of a rich text block ## Limits and validation - Up to **50 blocks** in a message and **100** in a modal or Home view. - `block_id` and `action_id` are generated when you leave them out. Keep `action_id` unique within a block and `block_id` unique within a message. - Blocks are never rejected. Anything outside the rules is reported in the API response's `warnings`, and the rest of the message still posts. - Controls only work in messages posted by an app; the app that posted the message is the one that hears about them. ## Where to go next - [Sending messages](https://workstation.repzo.com/docs/developers/chat-apps/sending-messages) - [Interactivity](https://workstation.repzo.com/docs/developers/chat-apps/interactivity) - [Formatting text](https://workstation.repzo.com/docs/developers/chat-apps/formatting-text) - The REST API's models for every block, element and object: [/api/v1/docs](https://workstation.repzo.com/api/v1/docs) --- # Blocks > Every Block Kit block Repzo Chat apps can send. Blocks are the building pieces of a message, modal or Home tab. Stack up to 50 in a message (100 in a view). Each page lists the block's fields, where it works, and examples with how it renders in Repzo Chat. | Name | Type | Summary | |---|---|---| | [Actions block](https://workstation.repzo.com/docs/developers/block-kit/blocks/actions-block) | `actions` | Holds multiple interactive elements — buttons, menus, pickers — in a row. | | [Alert block](https://workstation.repzo.com/docs/developers/block-kit/blocks/alert-block) | `alert` | Displays an alert, warning or informational message with a level-coloured icon. | | [Card block](https://workstation.repzo.com/docs/developers/block-kit/blocks/card-block) | `card` | Displays a single item — a product, a record, an article — as a card with an image, text and up to three buttons. | | [Carousel block](https://workstation.repzo.com/docs/developers/block-kit/blocks/carousel-block) | `carousel` | Displays related [card blocks](https://workstation.repzo.com/docs/developers/block-kit/blocks/card-block) side by side in a horizontally scrolling row. | | [Container block](https://workstation.repzo.com/docs/developers/block-kit/blocks/container-block) | `container` | Groups child blocks under a title, optionally collapsible, with a configurable width. | | [Context actions block](https://workstation.repzo.com/docs/developers/block-kit/blocks/context-actions-block) | `context_actions` | Holds small, low-emphasis actions under a message — feedback buttons and icon buttons. | | [Context block](https://workstation.repzo.com/docs/developers/block-kit/blocks/context-block) | `context` | Displays small, secondary text and images — who, when, where — under other content. | | [Data table block](https://workstation.repzo.com/docs/developers/block-kit/blocks/data-table-block) | `data_table` | Displays a rich table readers can sort, filter and page through, with optional buttons in cells. | | [Data visualization block](https://workstation.repzo.com/docs/developers/block-kit/blocks/data-visualization-block) | `data_visualization` | Displays data as a pie, bar, area or line chart. | | [Divider block](https://workstation.repzo.com/docs/developers/block-kit/blocks/divider-block) | `divider` | A horizontal line that separates blocks, like an `
`. | | [Header block](https://workstation.repzo.com/docs/developers/block-kit/blocks/header-block) | `header` | Displays plain text in a larger, bold font to start a group of content. | | [Image block](https://workstation.repzo.com/docs/developers/block-kit/blocks/image-block) | `image` | Displays an image, with an optional title above it. | | [Input block](https://workstation.repzo.com/docs/developers/block-kit/blocks/input-block) | `input` | Collects information from the reader with a label, one input element and an optional hint. | | [Markdown block](https://workstation.repzo.com/docs/developers/block-kit/blocks/markdown-block) | `markdown` | Displays standard Markdown — headings, lists, tables, code, links — the way an AI model usually writes it. | | [Plan block](https://workstation.repzo.com/docs/developers/block-kit/blocks/plan-block) | `plan` | Displays a list of related tasks under one title, so readers can follow a multi-step process — such as an AI agent working through a request. | | [Rich text block](https://workstation.repzo.com/docs/developers/block-kit/blocks/rich-text-block) | `rich_text` | Displays formatted, structured text — styled runs, lists, quotes, code — built from rich text elements. | | [Section block](https://workstation.repzo.com/docs/developers/block-kit/blocks/section-block) | `section` | Displays text, possibly alongside block elements. | | [Table block](https://workstation.repzo.com/docs/developers/block-kit/blocks/table-block) | `table` | Displays structured information in a simple table. | | [Task card block](https://workstation.repzo.com/docs/developers/block-kit/blocks/task-card-block) | `task_card` | Displays a single task — one action an app or AI agent is taking — with its status, details, output and sources. | | [Video block](https://workstation.repzo.com/docs/developers/block-kit/blocks/video-block) | `video` | Displays a video with its thumbnail, title and description; supported providers play in place. | --- # Actions block Holds multiple interactive elements — buttons, menus, pickers — in a row. | | | |---|---| | **Type** | `actions` | | **Available in** | Messages, Modals, Home tab | | **Compatible block elements** | [Button element](https://workstation.repzo.com/docs/developers/block-kit/elements/button-element), [Checkboxes element](https://workstation.repzo.com/docs/developers/block-kit/elements/checkboxes-element), [Date picker element](https://workstation.repzo.com/docs/developers/block-kit/elements/date-picker-element), [Datetime picker element](https://workstation.repzo.com/docs/developers/block-kit/elements/datetime-picker-element), [Multi-select menu element](https://workstation.repzo.com/docs/developers/block-kit/elements/multi-select-menu-element), [Overflow menu element](https://workstation.repzo.com/docs/developers/block-kit/elements/overflow-menu-element), [Radio button group element](https://workstation.repzo.com/docs/developers/block-kit/elements/radio-button-group-element), [Select menu element](https://workstation.repzo.com/docs/developers/block-kit/elements/select-menu-element), [Time picker element](https://workstation.repzo.com/docs/developers/block-kit/elements/time-picker-element), [Workflow button element](https://workstation.repzo.com/docs/developers/block-kit/elements/workflow-button-element) | ## Fields | Field | Type | Description | Required? | |---|---|---|---| | `type` | String | The type of block. For an actions block, `type` is always `actions`. | Required | | `elements` | Object[] | An array of interactive element objects — buttons, select menus, overflow menus, date, time and datetime pickers, checkboxes, radio buttons and workflow buttons. Maximum of 25 elements. | Required | | `block_id` | String | A unique identifier for the block. If not specified, one is generated. Use it to tell which block a `block_actions` payload came from. Maximum length is 255 characters. It must be unique within the message or view — a duplicate is replaced and reported as a warning. | Optional | > **How Repzo Chat differs from Slack** > > - Text inputs (`plain_text_input`, `rich_text_input`, …) only work inside an [input block](https://workstation.repzo.com/docs/developers/block-kit/blocks/input-block); in an actions block they're skipped and the API returns a warning. > - `feedback_buttons` and `icon_button` belong in a [context actions block](https://workstation.repzo.com/docs/developers/block-kit/blocks/context-actions-block) and are skipped here with a warning. ## Examples ### A select menu and a button ```json { "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "*Deal:* Northwind — 40 POS terminals\n*Stage:* Proposal sent" } }, { "type": "actions", "block_id": "deal_actions", "elements": [ { "type": "static_select", "action_id": "move_stage", "placeholder": { "type": "plain_text", "text": "Move to stage" }, "options": [ { "text": { "type": "plain_text", "text": "Negotiation" }, "value": "negotiation" }, { "text": { "type": "plain_text", "text": "Contract sent" }, "value": "contract_sent" }, { "text": { "type": "plain_text", "text": "Closed won" }, "value": "closed_won" } ] }, { "type": "button", "action_id": "open_deal", "text": { "type": "plain_text", "text": "Open deal" }, "url": "https://example.com/deals/1042" } ] } ] } ``` ### Approve or reject, with a confirmation ```json { "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "*Discount request* — 18% on quote Q-2291 (SAR 46,500)" } }, { "type": "actions", "elements": [ { "type": "button", "action_id": "approve", "text": { "type": "plain_text", "text": "Approve" }, "style": "primary", "value": "Q-2291" }, { "type": "button", "action_id": "reject", "text": { "type": "plain_text", "text": "Reject" }, "style": "danger", "value": "Q-2291", "confirm": { "title": { "type": "plain_text", "text": "Reject this discount?" }, "text": { "type": "mrkdwn", "text": "The sales rep will be told the request was rejected." }, "confirm": { "type": "plain_text", "text": "Reject" }, "deny": { "type": "plain_text", "text": "Cancel" }, "style": "danger" } } ] } ] } ``` ### A date picker and an overflow menu ```json { "blocks": [ { "type": "actions", "elements": [ { "type": "datepicker", "action_id": "follow_up", "initial_date": "2026-10-20", "placeholder": { "type": "plain_text", "text": "Follow-up date" } }, { "type": "overflow", "action_id": "more", "options": [ { "text": { "type": "plain_text", "text": "Snooze a week" }, "value": "snooze" }, { "text": { "type": "plain_text", "text": "Reassign" }, "value": "reassign" }, { "text": { "type": "plain_text", "text": "Close ticket" }, "value": "close" } ] } ] } ] } ``` ## Related - [Blocks](https://workstation.repzo.com/docs/developers/block-kit/blocks) - [Block Kit overview](https://workstation.repzo.com/docs/developers/block-kit) --- # Alert block Displays an alert, warning or informational message with a level-coloured icon. | | | |---|---| | **Type** | `alert` | | **Available in** | Messages, Modals, Home tab | ## Fields | Field | Type | Description | Required? | |---|---|---|---| | `type` | String | The type of block. For an alert block, `type` is always `alert`. | Required | | `text` | [Text object](https://workstation.repzo.com/docs/developers/block-kit/objects/text-object) | The alert message, using `plain_text` or `mrkdwn` formatting. Maximum 200 characters. | Required | | `level` | String | One of `default`, `info`, `warning`, `error` or `success`. Defaults to `default`. | Optional | | `block_id` | String | A unique identifier for the block. Maximum length is 255 characters. It must be unique within the message or view — a duplicate is replaced and reported as a warning. | Optional | > **How Repzo Chat differs from Slack** > > - Slack shows alert blocks in modals only. Repzo shows them in messages and the Home tab too. > - `text` may also be a plain string. ## Examples ### An info alert ```json { "blocks": [ { "type": "alert", "level": "info", "text": { "type": "mrkdwn", "text": "Prices on this quote are valid until *31 October*." } } ] } ``` ### Every level ```json { "blocks": [ { "type": "alert", "level": "success", "text": { "type": "plain_text", "text": "Invoice INV-7731 was paid in full." } }, { "type": "alert", "level": "warning", "text": { "type": "plain_text", "text": "Stock for SKU-2210 is below the reorder point." } }, { "type": "alert", "level": "error", "text": { "type": "plain_text", "text": "The sync with the ERP failed. Retrying in 5 minutes." } }, { "type": "alert", "text": { "type": "plain_text", "text": "This channel is archived on 1 November." } } ] } ``` ## Related - [Blocks](https://workstation.repzo.com/docs/developers/block-kit/blocks) - [Block Kit overview](https://workstation.repzo.com/docs/developers/block-kit) --- # Card block Displays a single item — a product, a record, an article — as a card with an image, text and up to three buttons. | | | |---|---| | **Type** | `card` | | **Available in** | Messages, Modals, Home tab | | **Compatible block elements** | [Button element](https://workstation.repzo.com/docs/developers/block-kit/elements/button-element), [Image element](https://workstation.repzo.com/docs/developers/block-kit/elements/image-element) | ## Usage At least one of `hero_image`, `title`, `body` or `actions` is required. ## Fields | Field | Type | Description | Required? | |---|---|---|---| | `type` | String | The type of block. For a card block, `type` is always `card`. | Required | | `block_id` | String | A unique identifier for the block. If not specified, one is generated. Use it to tell which block a `block_actions` payload came from. Maximum length is 255 characters. It must be unique within the message or view — a duplicate is replaced and reported as a warning. | Optional | | `hero_image` | [Image element](https://workstation.repzo.com/docs/developers/block-kit/elements/image-element) | The large image at the top of the card. `image_url` is at most 3000 characters, `alt_text` at most 2000. | Optional | | `icon` | [Image element](https://workstation.repzo.com/docs/developers/block-kit/elements/image-element) | A small image shown next to the title and subtitle. `image_url` is at most 3000 characters, `alt_text` at most 2000. | Optional | | `title` | [Text object](https://workstation.repzo.com/docs/developers/block-kit/objects/text-object) | Title of the card, `plain_text` or `mrkdwn`. Maximum 150 characters. | Optional | | `subtitle` | [Text object](https://workstation.repzo.com/docs/developers/block-kit/objects/text-object) | Subtitle of the card, `plain_text` or `mrkdwn`. Maximum 150 characters. | Optional | | `body` | [Text object](https://workstation.repzo.com/docs/developers/block-kit/objects/text-object) | Content of the card, `plain_text` or `mrkdwn`. Maximum 200 characters. | Optional | | `subtext` | [Text object](https://workstation.repzo.com/docs/developers/block-kit/objects/text-object) | Smaller text shown below the body, `plain_text` or `mrkdwn`. Maximum 200 characters. | Optional | | `actions` | Array of [Button element](https://workstation.repzo.com/docs/developers/block-kit/elements/button-element) | Buttons shown at the bottom of the card, maximum 3. `danger` buttons sit on the left; `primary` and unstyled buttons sit on the right. Clicks reach your app as `block_actions` with the card's `block_id`. | Optional | > **How Repzo Chat differs from Slack** > > - `slack_icon` isn't supported — pass an image in `icon` instead. > - `title`, `subtitle`, `body` and `subtext` may also be plain strings. ## Examples ### A product card ```json { "blocks": [ { "type": "card", "hero_image": { "type": "image", "image_url": "https://picsum.photos/id/180/800/450", "alt_text": "Laptop on a desk" }, "title": { "type": "plain_text", "text": "ProBook 14 — Business laptop" }, "subtitle": { "type": "plain_text", "text": "SKU LT-1400 · 32 in stock" }, "body": { "type": "mrkdwn", "text": "Intel Core i7, 16 GB RAM, 512 GB SSD. *SAR 4,299* per unit." }, "actions": [ { "type": "button", "action_id": "add_to_quote", "text": { "type": "plain_text", "text": "Add to quote" }, "style": "primary", "value": "LT-1400" }, { "type": "button", "action_id": "view_product", "text": { "type": "plain_text", "text": "View" }, "url": "https://example.com/products/LT-1400" } ] } ] } ``` ### A record card with an icon ```json { "blocks": [ { "type": "card", "icon": { "type": "image", "image_url": "https://picsum.photos/id/1/64/64", "alt_text": "Account logo" }, "title": { "type": "plain_text", "text": "Al Noor Trading" }, "subtitle": { "type": "plain_text", "text": "Renewal due in 14 days" }, "body": { "type": "mrkdwn", "text": "Annual plan, 25 seats. Last order *SAR 120,000*." }, "subtext": { "type": "plain_text", "text": "Owner: Sales team East" }, "actions": [ { "type": "button", "action_id": "mark_lost", "text": { "type": "plain_text", "text": "Mark lost" }, "style": "danger", "value": "acc_481" }, { "type": "button", "action_id": "start_renewal", "text": { "type": "plain_text", "text": "Start renewal" }, "style": "primary", "value": "acc_481" } ] } ] } ``` ## Related - [Blocks](https://workstation.repzo.com/docs/developers/block-kit/blocks) - [Block Kit overview](https://workstation.repzo.com/docs/developers/block-kit) --- # Carousel block > Displays related [card blocks](/docs/developers/block-kit/blocks/card-block) side by side in a horizontally scrolling row. Displays related [card blocks](https://workstation.repzo.com/docs/developers/block-kit/blocks/card-block) side by side in a horizontally scrolling row. | | | |---|---| | **Type** | `carousel` | | **Available in** | Messages, Modals, Home tab | ## Fields | Field | Type | Description | Required? | |---|---|---|---| | `type` | String | The type of block. For a carousel block, `type` is always `carousel`. | Required | | `elements` | Array of [Card block](https://workstation.repzo.com/docs/developers/block-kit/blocks/card-block) | The cards to show. Minimum 1, maximum 10. | Required | | `block_id` | String | A unique identifier for the block. Maximum length is 255 characters. It must be unique within the message or view — a duplicate is replaced and reported as a warning. | Optional | > **How Repzo Chat differs from Slack** > > - Slack shows carousels in messages and the Home tab. Repzo shows them in modals too. > - Anything in `elements` that isn't a card is skipped and the API returns a warning. ## Examples ### Recommended products ```json { "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "Customers who bought *POS Terminal X2* also ordered:" } }, { "type": "carousel", "elements": [ { "type": "card", "hero_image": { "type": "image", "image_url": "https://picsum.photos/id/0/600/400", "alt_text": "Receipt printer" }, "title": { "type": "plain_text", "text": "Thermal receipt printer" }, "body": { "type": "mrkdwn", "text": "80 mm, USB and Ethernet. *SAR 650*" }, "actions": [ { "type": "button", "action_id": "add_printer", "text": { "type": "plain_text", "text": "Add to order" }, "value": "PRN-80" } ] }, { "type": "card", "hero_image": { "type": "image", "image_url": "https://picsum.photos/id/3/600/400", "alt_text": "Barcode scanner" }, "title": { "type": "plain_text", "text": "Wireless barcode scanner" }, "body": { "type": "mrkdwn", "text": "1D/2D, 30 m range. *SAR 420*" }, "actions": [ { "type": "button", "action_id": "add_scanner", "text": { "type": "plain_text", "text": "Add to order" }, "value": "SCN-2D" } ] }, { "type": "card", "hero_image": { "type": "image", "image_url": "https://picsum.photos/id/6/600/400", "alt_text": "Cash drawer" }, "title": { "type": "plain_text", "text": "Cash drawer" }, "body": { "type": "mrkdwn", "text": "5 notes, 8 coins, steel. *SAR 380*" }, "actions": [ { "type": "button", "action_id": "add_drawer", "text": { "type": "plain_text", "text": "Add to order" }, "value": "CD-58" } ] } ] } ] } ``` ## Related - [Blocks](https://workstation.repzo.com/docs/developers/block-kit/blocks) - [Block Kit overview](https://workstation.repzo.com/docs/developers/block-kit) --- # Container block Groups child blocks under a title, optionally collapsible, with a configurable width. | | | |---|---| | **Type** | `container` | | **Available in** | Messages, Modals, Home tab | ## Fields | Field | Type | Description | Required? | |---|---|---|---| | `type` | String | The type of block. For a container block, `type` is always `container`. | Required | | `title` | [Text object](https://workstation.repzo.com/docs/developers/block-kit/objects/text-object) | Title of the container, using `plain_text`. Maximum 150 characters. | Required if `rich_text_title` is missing | | `rich_text_title` | [Rich text block](https://workstation.repzo.com/docs/developers/block-kit/blocks/rich-text-block) | The title as a `rich_text` block. Takes precedence over `title` when both are present. | Required if `title` is missing | | `subtitle` | [Text object](https://workstation.repzo.com/docs/developers/block-kit/objects/text-object) | Subtitle, `plain_text` or `mrkdwn`. Maximum 150 characters. | Optional | | `child_blocks` | Object[] | The blocks inside the container. Maximum 10 blocks. | Required | | `block_id` | String | A unique identifier for the block. Maximum length is 255 characters. It must be unique within the message or view — a duplicate is replaced and reported as a warning. | Optional | | `width` | String | One of `narrow`, `standard`, `wide` or `full`. `full` fills the available space. Defaults to `standard`. | Optional | | `icon` | [Image element](https://workstation.repzo.com/docs/developers/block-kit/elements/image-element) | A small image shown next to the title. `image_url` is at most 3000 characters, `alt_text` at most 2000. | Optional | | `is_collapsible` | Boolean | When `true`, readers can collapse the container to its title. Defaults to `false`. | Optional | | `default_collapsed` | Boolean | When `true` and `is_collapsible` is `true`, the container starts collapsed. Defaults to `false`. | Optional | | `has_header_divider` | Boolean | When `true`, a line separates the title from the content. Only applies when the container isn't collapsible. Defaults to `false`. | Optional | > **How Repzo Chat differs from Slack** > > - Slack shows containers in messages and the Home tab. Repzo shows them in modals too. > - Any block can be a child, not only the ones Slack lists. > - `block_id`s inside a container share the message's id space, so they must be unique across the whole message. ## Examples ### A container with a header divider ```json { "blocks": [ { "type": "container", "title": { "type": "plain_text", "text": "Order SO-2041 — 3 lines on backorder" }, "subtitle": { "type": "mrkdwn", "text": "Customer: *Gulf Retail Co.*" }, "has_header_divider": true, "child_blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "*LT-1400* ProBook 14 × 10 — ships 24 Oct\n*PRN-80* Receipt printer × 10 — ships 28 Oct\n*CD-58* Cash drawer × 10 — ships 2 Nov" } }, { "type": "actions", "elements": [ { "type": "button", "action_id": "split_shipment", "text": { "type": "plain_text", "text": "Ship available items" }, "style": "primary", "value": "SO-2041" }, { "type": "button", "action_id": "notify_customer", "text": { "type": "plain_text", "text": "Notify customer" }, "value": "SO-2041" } ] } ] } ] } ``` ### A collapsed container with a rich text title ```json { "blocks": [ { "type": "container", "width": "wide", "is_collapsible": true, "default_collapsed": true, "rich_text_title": { "type": "rich_text", "elements": [ { "type": "rich_text_section", "elements": [ { "type": "text", "text": "Audit details for ticket #4821" } ] } ] }, "child_blocks": [ { "type": "section", "fields": [ { "type": "mrkdwn", "text": "*Opened*\n12 Oct, 09:14" }, { "type": "mrkdwn", "text": "*First reply*\n12 Oct, 09:31" }, { "type": "mrkdwn", "text": "*Reassigned*\n2 times" }, { "type": "mrkdwn", "text": "*SLA*\nMet" } ] }, { "type": "context", "elements": [ { "type": "mrkdwn", "text": "Generated by the Helpdesk app" } ] } ] } ] } ``` ## Related - [Blocks](https://workstation.repzo.com/docs/developers/block-kit/blocks) - [Block Kit overview](https://workstation.repzo.com/docs/developers/block-kit) --- # Context actions block Holds small, low-emphasis actions under a message — feedback buttons and icon buttons. | | | |---|---| | **Type** | `context_actions` | | **Available in** | Messages, Modals, Home tab | | **Compatible block elements** | [Feedback buttons element](https://workstation.repzo.com/docs/developers/block-kit/elements/feedback-buttons-element), [Icon button element](https://workstation.repzo.com/docs/developers/block-kit/elements/icon-button-element) | ## Fields | Field | Type | Description | Required? | |---|---|---|---| | `type` | String | The type of block. For a context actions block, `type` is always `context_actions`. | Required | | `elements` | Object[] | An array of [feedback buttons](https://workstation.repzo.com/docs/developers/block-kit/elements/feedback-buttons-element) and [icon button](https://workstation.repzo.com/docs/developers/block-kit/elements/icon-button-element) elements. Maximum of 5 elements. | Required | | `block_id` | String | A unique identifier for the block. If not specified, one is generated. Use it to tell which block a `block_actions` payload came from. Maximum length is 255 characters. It must be unique within the message or view — a duplicate is replaced and reported as a warning. | Optional | > **How Repzo Chat differs from Slack** > > - Slack shows context actions in messages only. Repzo shows them in modals and the Home tab too. > - Any other element type is skipped and the API returns a warning. ## Examples ### Feedback on an AI answer ```json { "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "Order *SO-2041* left the Riyadh warehouse on 12 Oct and should arrive by 15 Oct." } }, { "type": "context_actions", "elements": [ { "type": "feedback_buttons", "action_id": "answer_feedback", "positive_button": { "text": { "type": "plain_text", "text": "Helpful" }, "value": "helpful" }, "negative_button": { "text": { "type": "plain_text", "text": "Not helpful" }, "value": "not_helpful" } }, { "type": "icon_button", "action_id": "delete_answer", "icon": "trash", "text": { "type": "plain_text", "text": "Delete" }, "value": "answer_7712" } ] } ] } ``` ## Related - [Blocks](https://workstation.repzo.com/docs/developers/block-kit/blocks) - [Block Kit overview](https://workstation.repzo.com/docs/developers/block-kit) --- # Context block Displays small, secondary text and images — who, when, where — under other content. | | | |---|---| | **Type** | `context` | | **Available in** | Messages, Modals, Home tab | | **Compatible block elements** | [Image element](https://workstation.repzo.com/docs/developers/block-kit/elements/image-element) | ## Fields | Field | Type | Description | Required? | |---|---|---|---| | `type` | String | The type of block. For a context block, `type` is always `context`. | Required | | `elements` | Object[] | An array of [image elements](https://workstation.repzo.com/docs/developers/block-kit/elements/image-element) and [text objects](https://workstation.repzo.com/docs/developers/block-kit/objects/text-object). Maximum of 10 items. | Required | | `block_id` | String | A unique identifier for the block. Maximum length is 255 characters. It must be unique within the message or view — a duplicate is replaced and reported as a warning. | Optional | ## Examples ### Ticket details ```json { "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "*#4821* Card reader not connecting after update" } }, { "type": "context", "elements": [ { "type": "image", "image_url": "https://picsum.photos/id/20/64/64", "alt_text": "Customer portal" }, { "type": "mrkdwn", "text": "Opened via *Customer portal*" }, { "type": "mrkdwn", "text": "Priority: *High*" }, { "type": "plain_text", "text": "Updated 5 minutes ago" } ] } ] } ``` ## Related - [Blocks](https://workstation.repzo.com/docs/developers/block-kit/blocks) - [Block Kit overview](https://workstation.repzo.com/docs/developers/block-kit) --- # Data table block Displays a rich table readers can sort, filter and page through, with optional buttons in cells. | | | |---|---| | **Type** | `data_table` | | **Available in** | Messages, Modals, Home tab | | **Compatible block elements** | [Button element](https://workstation.repzo.com/docs/developers/block-kit/elements/button-element) | ## Usage The first row is the header. Each cell is one of: - `raw_text` — `{ "type": "raw_text", "text": "Open" }` - `raw_number` — `{ "type": "raw_number", "value": 1250, "text": "1,250" }`; `text` is what readers see, `value` is what sorting uses - `rich_text` — a [rich text block](https://workstation.repzo.com/docs/developers/block-kit/blocks/rich-text-block); not allowed in the header row - `action_cell` — `{ "type": "action_cell", "element":