This is the full developer documentation for Vera Support
# Vera Support Centre
> Knowledge base and developer documentation for Vera.
Welcome to the Vera Support Centre.
[Knowledge Base](/kb/index)Guides and how-tos for using Vera day to day.
[Developers](/developers/index)Build on Vera with the Bridge or the Public REST API.
Note
**Building a Vera tool with AI assistance?** The complete developer reference — bridge SDK, DTOs, manifest format, examples, runtime constraints — is published as a single LLM-friendly document at ****.
Paste that URL into Claude, ChatGPT, Cursor, or any AI assistant and it will have everything needed to build or modify a Vera marketplace tool. A typical prompt is just *“convert this HTML into a Vera quote extension — read for the bridge reference”*.
# Build on Vera
> Two integration paths: Vera Bridge for embedded tools, and the Public REST API for server-to-server.
Vera is built to be extended. Whether you’re a developer at a trade business building internal tools, or a software company integrating Vera into a larger workflow - this section covers everything you need to build on top of Vera.
You can embed custom HTML/JavaScript tools directly into the Vera interface using the **Vera Bridge**, or automate and sync data server-to-server using the **Public REST API**. Both are designed to be straightforward to start with and grow with your needs.
[Vera Bridge](/developers/bridge/overview)Embed HTML/JS tools inside Vera. No API keys - the bridge inherits the user's session.
[Public REST API](/developers/api/overview)Server-to-server integration with API key auth. Read customers, products, quotes; create quotes.
# Authentication
> API key authentication and rate limits for the Public REST API.
For server-to-server integrations (not marketplace tools), use API keys:
```plaintext
Authorization: Bearer pip_key_your_api_key_here
```
API keys are scoped to specific endpoints and have configurable rate limits. Generate API keys from Vera Settings > API Tokens.
**Marketplace tools do NOT need API keys** — the bridge handles all authentication automatically through the Vera session.
## Rate Limits
[Section titled “Rate Limits”](#rate-limits)
API responses include rate limit headers:
```plaintext
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1713200000
```
When the limit is exceeded, requests return HTTP 429 with a `Retry-After` header indicating seconds until the next request is allowed.
# Endpoints
> Public REST API endpoints currently available.
All endpoints are relative to `https://app.verahq.net/api/v1/` and require an `Authorization: Bearer` header. See [Authentication](/developers/api/authentication).
## Customers
[Section titled “Customers”](#customers)
### List customers
[Section titled “List customers”](#list-customers)
```http
GET /api/v1/customers
```
Returns customers visible to the API key’s scope. Supports paging via `?page=` and `?pageSize=`.
## Products
[Section titled “Products”](#products)
### List products
[Section titled “List products”](#list-products)
```http
GET /api/v1/products
```
Returns SKUs available in the catalog. Use the `id` value when constructing quote line items.
## Quotes
[Section titled “Quotes”](#quotes)
### List quotes
[Section titled “List quotes”](#list-quotes)
```http
GET /api/v1/quotes
```
Returns quotes the API key is permitted to read.
### Get a quote
[Section titled “Get a quote”](#get-a-quote)
```http
GET /api/v1/quotes/{id}
```
Returns the full quote payload, including line items.
### Create a quote
[Section titled “Create a quote”](#create-a-quote)
```http
POST /api/v1/quotes
Content-Type: application/json
{
"customerId": "...",
"lines": [
{ "skuId": "...", "qty": 2, "unitPrice": 199.00 }
]
}
```
Returns the created quote with its assigned ID. Refer to [DTO Reference](/developers/bridge/dto-reference) for the line shape - the REST and Bridge surfaces share the same quote DTOs.
# REST API Overview
> Server-to-server integration with the Vera Public REST API.
The Vera Public REST API lets backend systems read and write Vera data over HTTPS. Use it for CRM sync, automated quote creation, scheduled exports, and any integration where your code runs on a server (not inside a Vera iframe).
**Base URL**
```plaintext
https://app.verahq.net/api/v1/
```
All requests must be authenticated with an API key. See [Authentication](/developers/api/authentication).
[Building an embedded tool instead?](/developers/bridge/overview)Use Vera Bridge - no API keys, inherits the user's session, runs in the browser.
# DTO Reference
> skuIdMap pattern and DTO shapes used by bridge methods.
## skuIdMap Pattern
[Section titled “skuIdMap Pattern”](#skuidmap-pattern)
For `quoting_extension` tools that work with known SKU codes, the recommended pattern is:
1. At tool init, call `products.list()` and build a local `{ [sku]: productId }` lookup.
2. Your tool’s internal logic works with human-readable SKU codes (from a pricing spreadsheet, config object, or product catalogue).
3. When building lines for `quotes.addLines`, look up each SKU in `skuIdMap` and pass both `productCode` (the SKU string) and `productId` (the GUID). This triggers task template injection on the host.
4. Fall back gracefully: if a SKU is not found in `skuIdMap`, send the line without `productId`. The line still appears in the quote as free-form text - no task injection, but no error.
```javascript
let skuIdMap = {};
async function initBridge() {
// Load all products and index by SKU (uppercased for case-insensitive lookup)
const productResult = await window.pipeline.products.list({ page: 1, pageSize: 500 });
const products = (productResult && productResult.items) ? productResult.items : [];
products.forEach(function(p) {
if (p.sku && p.id) {
skuIdMap[p.sku.toUpperCase()] = p.id;
}
});
}
// Later, when building a line:
function resolveProduct(skuCode) {
return {
productCode: skuCode,
productId: skuIdMap[skuCode.toUpperCase()] || null // null = no task injection (still sends)
};
}
```
## DTO Shapes
[Section titled “DTO Shapes”](#dto-shapes)
```typescript
// BridgeContextDto
interface BridgeContextDto {
userName: string;
userEmail: string;
userRole: string; // e.g. "H_Admin", "H_Field"
tenantName: string;
tenantId: string;
cultureCode: string; // e.g. "en-NZ"
}
// BridgeCustomerDto
interface BridgeCustomerDto {
id: string; // GUID
name: string;
email: string;
phone: string;
}
// BridgeProductDto
interface BridgeProductDto {
id: string; // GUID
sku: string; // Human-readable product code (Stock_SKU.SKU)
name: string;
price: number; // Retail sell price (Stock_SKU.Sell)
unit: string; // UOM token
}
// BridgeTaskTemplateDto (from taskTemplates.list)
interface BridgeTaskTemplateDto {
id: string; // GUID - pass as LinkedItemId on a "task" line
code: string; // Stable code (e.g. "T_DEFAULT_INSTALLATION_TASK")
name: string;
}
// BridgeCostItemDto (from costItems.list) - DEPRECATED, prefer BridgeJobCostTemplateDto
interface BridgeCostItemDto {
id: string; // GUID - pass as LinkedItemId on a "cost" line (deprecated)
code: string; // Stable code (e.g. "COS-TRAVEL-TIME")
name: string;
type: string; // T_Type token (e.g. "T_FINANCIAL", "T_TRAVEL")
}
// BridgeJobCostTemplateDto (from jobCostTemplates.list)
interface BridgeJobCostTemplateDto {
id: string; // GUID - pass as LinkedItemId on a "jobcost" line
code: string; // JobCostTemplate.CostCode (e.g. "SHIPPING", "DISPOSAL", "TRAVEL")
name: string; // JobCostTemplate.CostName
type: string; // T_CostType token: "T_ADHOC" | "T_PURCHASED_ITEM" | "T_THIRD_PARTY_COST" | "T_EXPENSE"
}
// BridgeQuoteDto
interface BridgeQuoteDto {
id: string; // GUID
ref: string;
customerName: string;
total: number;
status: string;
date: string; // ISO 8601 datetime
}
// BridgeJobDto
interface BridgeJobDto {
id: string; // GUID
ref: string; // Human-readable job reference (e.g. "JOB-0042")
customerName: string;
customerIdGuid: string; // GUID
status: string;
}
// BridgePagedResult
interface BridgePagedResult {
items: T[];
totalCount: number;
page: number;
pageSize: number;
}
// BridgeCreateQuoteRequest
interface BridgeCreateQuoteRequest {
jobId?: string;
customerName?: string;
customerEmail?: string;
customerPhone?: string;
upsertByEmail: boolean;
title?: string;
quoteRef?: string;
lines: BridgeQuoteLineRequest[];
}
// BridgeQuoteLineRequest (for quotes.create)
interface BridgeQuoteLineRequest {
description?: string;
productCode?: string;
qty: number;
unitPrice: number;
taxRate: number;
supplierRef?: string; // Resolved against G_Suppliers.SupplierRef then Name (active only).
// Null/unresolved falls back to the Self supplier (T_SELF).
}
// BridgeCreateQuoteResult
interface BridgeCreateQuoteResult {
id: string;
ref: string;
total: number;
url?: string; // Relative deep-link to the created quote, if available
}
// BridgeAddLineDto (for quotes.addLines - quoting_extension only)
interface BridgeAddLineDto {
description?: string;
productCode?: string;
qty: number;
unitPrice: number;
costPrice?: number; // When set: BUY=costPrice, SELL=unitPrice. When omitted: BUY=SELL=unitPrice
taxRate: number;
location?: string; // Maps to FreeTextField2
specification?: string; // Maps to FreeTextField
unit?: string; // "T_ITEM" | "T_SQUARE_METRE" | "T_LINEAR_METRE"
groupKey?: string; // Lines sharing the same groupKey get the same QuoteLine.GroupId
// -- Line linking (preferred over productId) --
lineType?: string; // "product" | "task" | "cost" | "jobcost" (defaults to "product")
linkedItemId?: string; // GUID into Stock_SKU / G_Task_Templates / COB_Items / JobCostTemplate
// based on lineType. Replaces productId for new tools. Validation:
// rejects the whole batch if a non-null GUID does not resolve to an
// active row. For "jobcost", null is valid (ad-hoc job cost).
// -- Categorical grouping --
section?: string; // Free-text section label (e.g. "Blinds", "Installation", "Extras").
// Host UI groups lines by section.
// Max 100 chars; trimmed; null/empty renders under "Ungrouped".
summaryOnly?: boolean; // Default false. When true, the section this line belongs to prints
// on the customer's quote as a single name + total row, with its
// individual lines suppressed. Section identity is
// (section, summaryOnly) - see "Summary-only sections" below.
sectionNotes?: string; // Note printed under the section heading, even when summaryOnly.
// Plain text, max 2000. First non-empty value in a section wins.
// -- Pricing / supplier / free-text --
discountPercent?: number; // 0-100. Stored on QuoteLine.DiscountPercent; LineNett =
// sell × qty × (1 − discountPercent/100). Null = 0.
supplierRef?: string; // Resolved against G_Suppliers.SupplierRef then Name (active only).
// Null/unresolved falls back to the Self supplier (T_SELF). A resolved
// supplier drives PO + supplier-invoice creation on quote-to-job.
freeTextField3?: string; // Persisted on QuoteLine.FreeTextField3 (1+2 come from
freeTextField4?: string; // specification/location). Map 1:1 to JobCost.FreeTextLine1-4 on convert.
// -- Deprecated (still supported) --
/** @deprecated Use linkedItemId with lineType="product" instead. Retained for back-compat
* with Ziptrak v2.1.2 and earlier. New tools should not set this field. */
productId?: string;
}
```
### Four line kinds (lineType)
[Section titled “Four line kinds (lineType)”](#four-line-kinds-linetype)
| `lineType` | `linkedItemId` resolves to | Behaviour |
| ----------------------- | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `"product"` (default) | `Stock_SKU.IdGuid` | If the linked SKU has a task sequence configured, the host auto-injects its task template lines (e.g. installation tasks). |
| `"task"` | `G_Task_Templates.IdGuid` | The line is the task itself. No auto-injection. Use for explicit installation, removal, configuration tasks. |
| `"cost"` *(deprecated)* | `COB_Items.IdGuid` | Legacy cost-of-business line. No auto-injection. Superseded by `"jobcost"` - prefer that for new tools. |
| `"jobcost"` | `JobCostTemplate.IdGuid` (optional) | Cost category (shipping, disposal, travel, check-measure) or an ad-hoc import line. Template-linked when `linkedItemId` is set (GL routed via the template’s cost code, extension price wins); ad-hoc when null (job-cost record materialised on quote-to-job conversion). No auto-injection. |
When `lineType` is omitted (or set to `"product"`) and `linkedItemId` is null, the host falls back to the legacy `productId` field - keeping Ziptrak v2.1.2 and earlier extensions working unchanged.
### Section grouping
[Section titled “Section grouping”](#section-grouping)
Quote lines are visually grouped by `section` in both the operator’s quote editor and the customer-facing quote preview. Use a small set of stable labels per tool - e.g. for an indoor blinds extension: `"Blinds"`, `"Motorisation"`, `"Installation"`, `"Removal"`, `"Extras"`. Lines with no `section` render in a trailing “Ungrouped” block.
### Summary-only sections
[Section titled “Summary-only sections”](#summary-only-sections)
Set `summaryOnly: true` on every line of a section to collapse it on customer-facing output. The section prints as a single row carrying its name and total; the individual lines are suppressed. Use this for cost groups that should not be negotiated line by line - travel, shipping and installation are the common case.
The lines still exist in full: the operator sees them itemised in the quote editor, they carry through to job costing on quote-to-job conversion, and they contribute to the quote’s grand total exactly as before. Only the customer-facing rendering changes.
Section identity is the pair `(section, summaryOnly)`, not `section` alone. Two lines with the same `section` label but different `summaryOnly` values resolve to **two separate sections** with the same name - which lets a tool itemise part of a category and collapse the rest, but also means an inconsistent flag across a section’s lines will split it in two. Set the flag identically on every line you intend to land in one section.
A collapsed section always prints its total, even for tenants whose quote template has section subtotals or unit prices switched off.
```javascript
// All three lines carry the same section AND the same summaryOnly value,
// so they land in one collapsed section totalling $1,250.
await pipeline.quotes.addLines([
{ description: "Travel to site", qty: 1, unitPrice: 400, taxRate: 15,
lineType: "jobcost", section: "Installation, Travel & Shipping", summaryOnly: true },
{ description: "Freight", qty: 1, unitPrice: 350, taxRate: 15,
lineType: "jobcost", section: "Installation, Travel & Shipping", summaryOnly: true },
{ description: "Installation labour", qty: 1, unitPrice: 500, taxRate: 15,
lineType: "task", section: "Installation, Travel & Shipping", summaryOnly: true },
]);
```
### Section notes and sections with no lines
[Section titled “Section notes and sections with no lines”](#section-notes-and-sections-with-no-lines)
Set `sectionNotes` on any line to give its section a note for the customer. The note prints under the section heading on the quote - including on a summary-only section, where it is often the only explanation of what the total covers. The first non-empty `sectionNotes` among a section’s lines wins; later lines may omit it.
To create a section that has no lines, declare it in the second argument of `addLines` (or use `addSections`):
```typescript
interface BridgeSectionDto {
name: string; // Required. Max 100 chars; longer names are truncated.
summaryOnly?: boolean; // Default false. Same identity rule as on a line.
notes?: string; // Plain text, max 2000. Line breaks are kept.
}
```
Declared sections are applied after the lines, so they sort after the sections the lines created. See [`quotes.addLines`](/developers/bridge/methods#quotesaddlineslines) for the full behaviour.
# Tool Manifest
> manifest.json fields that declare how a tool integrates with Vera.
Every tool bundle must include a `manifest.json` at the root. The manifest declares how the tool integrates with Vera.
**Example:**
```json
{
"name": "Ziptrak Retail Estimator",
"shortName": "Ziptrak",
"type": "quoting_extension",
"version": "2.0.0",
"description": "Calculate supply and install costs for Ziptrak outdoor blinds. Adds itemised lines directly to the open quote.",
"entry": "index.html"
}
```
**Manifest fields:**
| Field | Type | Required | Description |
| ----------- | ------------- | -------- | ----------------------------------------------------------------------------- |
| name | string | Yes | Full display name shown in the marketplace listing |
| shortName | string | Yes | Short name used in Vera UI chrome (e.g. tab labels) |
| type | enum | Yes | Integration type — see values below |
| version | semver string | Yes | Tool version (e.g. `"2.0.0"`) |
| description | string | Yes | One-sentence description shown in the marketplace |
| entry | string | Yes | Relative path to the HTML entry point inside the bundle (e.g. `"index.html"`) |
**`type` values:**
| Value | Behaviour |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `standalone` | Default. Tool renders as a sidebar panel, launched from the Vera tool launcher. Has read access to customers, products, quotes, and jobs, plus `quotes.create`. This is the right type for quoting tools that create a new quote rather than injecting into an existing one. |
| `quoting_extension` | Tool integrates with an already-open quote modal. Launched from inside the quote UI rather than the tool launcher. Unlocks `quotes.addLines` and `quotes.addSections`, which add lines and sections directly into the active in-memory quote. Use this type when your tool is designed to add lines to a quote the user is currently editing. |
# Bridge Methods
> Read and write methods exposed on window.pipeline for marketplace tools.
## Read Methods
[Section titled “Read Methods”](#read-methods)
All read methods are available to both `standalone` and `quoting_extension` tool types.
### context.get()
[Section titled “context.get()”](#contextget)
Returns the current user and tenant context.
```javascript
const ctx = await window.pipeline.context.get();
// Returns:
// {
// userName: "Jane Smith",
// userEmail: "jane@example.com",
// userRole: "H_Admin",
// tenantName: "Acme Corp",
// tenantId: "abc-123",
// cultureCode: "en-NZ"
// }
```
### customers.list(options?)
[Section titled “customers.list(options?)”](#customerslistoptions)
Returns a paginated list of customers.
```javascript
const result = await window.pipeline.customers.list({ page: 1, pageSize: 50 });
// Returns:
// {
// items: [{ id: "...", name: "John Doe", email: "john@example.com", phone: "021..." }],
// totalCount: 150,
// page: 1,
// pageSize: 50
// }
```
### products.list(options?)
[Section titled “products.list(options?)”](#productslistoptions)
Returns a paginated list of products/services. The `sku` field is the human-readable product code from `Stock_SKU.SKU` - use this for stable cross-environment product references (GUIDs can vary between environments).
```javascript
const result = await window.pipeline.products.list({ page: 1, pageSize: 50 });
// Returns:
// {
// items: [
// { id: "a1b2c3d4-...", sku: "WGT-001", name: "Widget A", price: 29.99, unit: "T_ITEM" }
// ],
// totalCount: 42,
// page: 1,
// pageSize: 50
// }
```
**Response item fields:** `id` (GUID), `sku` (human-readable code), `name`, `price` (retail sell price), `unit` (UOM token).
### taskTemplates.list(options?)
[Section titled “taskTemplates.list(options?)”](#tasktemplateslistoptions)
Returns task templates from `G_Task_Templates`, filtered to active rows in the current tenant. Use this to resolve a task template’s `code` (e.g. `T_DEFAULT_INSTALLATION_TASK`) to its GUID so the GUID can be passed as `linkedItemId` on a `lineType: "task"` line in `quotes.addLines`.
When `codes` is provided, page/pageSize are ignored and all matching rows are returned. When `codes` is omitted, results paginate the full active task-template list.
```javascript
const result = await window.pipeline.taskTemplates.list({
codes: ["T_DEFAULT_INSTALLATION_TASK", "T_DEFAULT_REMOVAL_TASK"]
});
// Returns:
// {
// items: [
// { id: "8a9d034f-...", code: "T_DEFAULT_INSTALLATION_TASK", name: "T_DEFAULT_INSTALLATION_TASK" }
// ],
// totalCount: 2,
// page: 1,
// pageSize: 50
// }
```
**Request fields:** `codes` (string\[], optional), `page` (number, optional), `pageSize` (number, optional).
**Response item fields:** `id` (GUID), `code` (stable token), `name`.
### costItems.list(options?)
[Section titled “costItems.list(options?)”](#costitemslistoptions)
Caution
**Deprecated for new quoting extensions.** Prefer [`jobCostTemplates.list`](#jobcosttemplates-list-options) with `lineType: "jobcost"`. The COB → JobCostTemplate migration replaces `lineType: "cost"` + `COB_Items` with `lineType: "jobcost"` + a `JobCostTemplate` link. `costItems.list` is retained for back-compat with Ziptrak v2.1.2 and earlier extensions.
Returns cost-of-business items from `COB_Items`, filtered to active rows in the current tenant. Use this to resolve a COB item’s `code` (e.g. `COS-TRAVEL-TIME`, `COS-SITE-VISIT`) to its GUID for use as `linkedItemId` on a `lineType: "cost"` line.
```javascript
const result = await window.pipeline.costItems.list({
codes: ["COS-TRAVEL-TIME", "COS-SITE-VISIT", "COS-SHIPPING", "COS-DISPOSAL"]
});
// Returns:
// {
// items: [
// { id: "95abe0dc-...", code: "COS-TRAVEL-TIME", name: "Travel time", type: "T_TRAVEL" }
// ],
// totalCount: 4,
// page: 1,
// pageSize: 50
// }
```
**Request fields:** `codes` (string\[], optional), `page` (number, optional), `pageSize` (number, optional).
**Response item fields:** `id` (GUID), `code` (stable token), `name`, `type` (`COB_Items.T_Type` token, e.g. `"T_FINANCIAL"`, `"T_TRAVEL"`).
### jobCostTemplates.list(options?)
[Section titled “jobCostTemplates.list(options?)”](#jobcosttemplateslistoptions)
Returns job-cost templates from `JobCostTemplate`, filtered to active rows in the current tenant and ordered by `CostCode`. This is the modern replacement for [`costItems.list`](#costitems-list-options): use it to resolve a template’s `code` (e.g. `SHIPPING`, `DISPOSAL`, `TRAVEL`, `CHECK-MEASURE`) to its GUID for use as `linkedItemId` on a `lineType: "jobcost"` line.
When the resolved GUID is passed back as `linkedItemId`, the host routes the line’s GL via the template’s cost code; the extension-supplied `unitPrice` / `costPrice` always win (the template contributes classification and GL routing only, not pricing).
When `codes` is provided, page/pageSize are ignored and all matching rows are returned. When `codes` is omitted, results paginate the full active job-cost-template list.
```javascript
const result = await window.pipeline.jobCostTemplates.list({
codes: ["SHIPPING", "DISPOSAL", "TRAVEL", "CHECK-MEASURE"]
});
// Returns:
// {
// items: [
// { id: "95abe0dc-...", code: "SHIPPING", name: "Shipping", type: "T_PURCHASED_ITEM" }
// ],
// totalCount: 4,
// page: 1,
// pageSize: 50
// }
```
**Request fields:** `codes` (string\[], optional), `page` (number, optional), `pageSize` (number, optional).
**Response item fields:** `id` (GUID), `code` (`JobCostTemplate.CostCode`), `name` (`CostName`), `type` (`T_CostType` token: `"T_ADHOC"` | `"T_PURCHASED_ITEM"` | `"T_THIRD_PARTY_COST"` | `"T_EXPENSE"`).
### jobs.list(options?)
[Section titled “jobs.list(options?)”](#jobslistoptions)
Returns a paginated list of active jobs for the tenant. Available to all tool types.
```javascript
const result = await window.pipeline.jobs.list({ page: 1, pageSize: 50 });
// Returns:
// {
// items: [
// {
// id: "e5f6a7b8-...",
// ref: "JOB-0042",
// customerName: "Acme Corp",
// customerIdGuid: "c1d2e3f4-...",
// status: "InProgress"
// }
// ],
// totalCount: 12,
// page: 1,
// pageSize: 50
// }
```
**Response item fields:** `id` (GUID), `ref` (human-readable job reference), `customerName`, `customerIdGuid` (GUID), `status`.
### quotes.list(options?)
[Section titled “quotes.list(options?)”](#quoteslistoptions)
Returns a paginated list of quotes.
```javascript
const result = await window.pipeline.quotes.list({ page: 1, pageSize: 50 });
// Returns:
// {
// items: [{ id: "...", ref: "QR-001", customerName: "John Doe", total: 115.00, status: "Draft", date: "2026-04-16T00:00:00" }],
// totalCount: 25,
// page: 1,
// pageSize: 50
// }
```
## Write Methods
[Section titled “Write Methods”](#write-methods)
### quotes.create(request)
[Section titled “quotes.create(request)”](#quotescreaterequest)
Creates a new quote in Vera. Available to all tool types.
**Marketplace tools do NOT need API keys or inbound tokens** - the bridge handles all authentication through the current user’s Vera session.
```javascript
const result = await window.pipeline.quotes.create({
customerName: "John Doe",
customerEmail: "john@example.com",
customerPhone: "021 123 4567",
upsertByEmail: true,
title: "Quick Quote",
quoteRef: "",
lines: [
{
description: "Widget A",
productCode: "WGT-001",
qty: 2,
unitPrice: 29.99,
taxRate: 0.15
}
]
});
// Returns:
// {
// id: "abc-123-...",
// ref: "QR-042",
// total: 68.98
// }
```
**Request fields:**
| Field | Type | Required | Description |
| ------------- | ------- | ----------- | --------------------------------------------- |
| customerName | string | No | Customer display name |
| customerEmail | string | Conditional | Required when upsertByEmail is true |
| customerPhone | string | No | Customer phone number |
| upsertByEmail | boolean | No | If true, creates or matches customer by email |
| title | string | No | Quote title |
| quoteRef | string | No | Custom quote reference |
| lines | array | Yes | At least one line item required |
**Line item fields:**
| Field | Type | Required | Description |
| ----------- | ------ | -------- | --------------------------------------- |
| description | string | No | Line item description |
| productCode | string | No | Product code reference |
| qty | number | Yes | Quantity (1-10000) |
| unitPrice | number | Yes | Unit price (0-1000000) |
| taxRate | number | Yes | Tax rate as decimal (e.g. 0.15 for 15%) |
**Validation rules:**
* Lines array must not be empty
* Maximum 200 line items per quote
* Quantity must be `> 0` and `<= 10,000`
* Unit price must be `>= 0` and `<= 1,000,000`
### quotes.addLines(lines)
[Section titled “quotes.addLines(lines)”](#quotesaddlineslines)
**Available to `quoting_extension` tools only.**
Appends one or more lines to the currently-open quote. No server round-trip - the host merges the lines into its in-memory quote and the user saves normally. Calling this method from a `standalone` tool will return an error.
```javascript
await window.pipeline.quotes.addLines([
// Product line (default lineType): generic SKU, with section grouping
{
description: "Roller blind - Main Lounge",
productCode: "BLIND",
qty: 1,
unitPrice: 480.00,
costPrice: 290.00,
taxRate: 15,
location: "Main Lounge",
specification: "Linesque Fleece, 1200×1500, Inside fit",
unit: "T_ITEM",
groupKey: "blind-1",
lineType: "product",
linkedItemId: "a1b2c3d4-...", // Stock_SKU.IdGuid - replaces productId
supplierRef: "WINDOWARE", // resolved against G_Suppliers (drives PO on quote-to-job)
discountPercent: 10, // RRP unitPrice, nets back to the real selling price
section: "Blinds"
},
// Task line: explicit installation task
{
description: "Installation",
qty: 1,
unitPrice: 95.00,
costPrice: 95.00,
taxRate: 15,
unit: "T_ITEM",
lineType: "task",
linkedItemId: "8a9d034f-...", // G_Task_Templates.IdGuid
section: "Installation"
},
// Job-cost line: shipping pass-through (template-linked)
{
description: "Shipping (standard)",
qty: 1,
unitPrice: 20.00,
costPrice: 20.00,
taxRate: 15,
unit: "T_ITEM",
lineType: "jobcost",
linkedItemId: "eaaebd29-...", // JobCostTemplate.IdGuid (from jobCostTemplates.list)
section: "Extras"
}
]);
```
**BridgeAddLineDto fields:**
| Field | Type | Required | Description |
| --------------- | ------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| description | string | optional | Free-text line description. Displayed as the line name in the quote. |
| productCode | string | optional | Human-readable SKU/code. Stored as `WorkObjectCode` on the quote line. |
| qty | number | required | Line quantity. Must be `> 0`. |
| unitPrice | number | required | Retail/sell price per unit. Markup must already be applied - the host does not re-mark up. |
| costPrice | number | optional | Buy/cost price per unit. When provided: BUY column = `costPrice`, SELL column = `unitPrice` (real margin visible in COB panel). When omitted: both BUY and SELL use `unitPrice`. |
| taxRate | number | required | Tax rate. Accepted as percentage (e.g. `15`) or decimal fraction (e.g. `0.15`) - the host normalises. |
| location | string | optional | Location or zone label. Maps to `QuoteLine.FreeTextField2`. Use for room, area, or zone labels (e.g. `"Patio"`, `"Living Room"`). |
| specification | string | optional | Configuration or specification detail. Maps to `QuoteLine.FreeTextField`. Use for dimensions, colours, or model info. |
| unit | string | optional | Unit of measure token. Valid values: `"T_ITEM"` (default), `"T_SQUARE_METRE"` (m²), `"T_LINEAR_METRE"` (lm). |
| groupKey | string | optional | Arbitrary stable string identifier. Lines sharing the same `groupKey` receive the same `QuoteLine.GroupId` on the host, keeping related lines visually grouped within their section. Lines without a `groupKey` are ungrouped (GroupId = 0). |
| lineType | string | optional | One of `"product"` \| `"task"` \| `"cost"` \| `"jobcost"`. Defaults to `"product"`. Selects which Vera table `linkedItemId` resolves into - see “Four line kinds” below. |
| linkedItemId | string (GUID) | optional | GUID into `Stock_SKU` / `G_Task_Templates` / `COB_Items` / `JobCostTemplate` based on `lineType`. Replaces `productId` for new tools. For `product` / `task` / `cost` the whole `addLines` batch is rejected if the GUID does not resolve to an active row in the indicated table. For `jobcost`, `linkedItemId` is optional (null = ad-hoc job cost, materialised on quote-to-job conversion). |
| section | string | optional | Categorical section label (e.g. `"Blinds"`, `"Motorisation"`, `"Installation"`, `"Extras"`, `"Removal"`). The host quote UI groups lines visually by section. Max 100 chars; trimmed; null/empty renders under “Ungrouped”. Section identity is the pair `(section, summaryOnly)`. |
| summaryOnly | boolean | optional | Default `false`. When `true`, the section this line belongs to renders on customer-facing output as a single name + total row, with its individual lines suppressed. Lines are unaffected everywhere else - editor, job costing, grand total. Lines sharing a `section` but differing on `summaryOnly` resolve to two separate sections, so set it identically across a section’s lines. |
| sectionNotes | string | optional | Customer-facing note for this line’s section, printed under the section heading on the quote (including when the section is `summaryOnly`). Plain text; line breaks are kept; max 2000 chars. Not part of section identity - the first non-empty value among a section’s lines wins, so later lines need not repeat it. |
| discountPercent | number | optional | Per-line discount percentage (0-100). When set, the host stores it on `QuoteLine.DiscountPercent` and computes `LineNett = sell × qty × (1 − discountPercent/100)`. Lets a tool pass an inflated RRP `unitPrice` with a discount that nets back to the real selling price. Null = 0 (no discount). |
| supplierRef | string | optional | Supplier identifier. Resolved host-side case-insensitively against `G_Suppliers.SupplierRef`, then `G_Suppliers.Name` (active suppliers only). Null or unresolved falls back to the Self supplier (`T_SELF`). A resolved supplier drives purchase-order and supplier-invoice creation after quote-to-job conversion. |
| freeTextField3 | string | optional | Free-text slot persisted onto `QuoteLine.FreeTextField3` (fields 1 and 2 are populated from `specification` / `location`). Use to stash source-system metadata with nowhere else to go. On quote-to-job conversion, the four free-text fields map 1:1 to `JobCost.FreeTextLine1-4`. |
| freeTextField4 | string | optional | Free-text slot persisted onto `QuoteLine.FreeTextField4`. See `freeTextField3`. |
| productId | string (GUID) | deprecated | **Use `linkedItemId` with `lineType="product"` instead.** Retained for back-compat with Ziptrak v2.1.2 and earlier. When set without `linkedItemId`, behaves as `linkedItemId` with `lineType="product"` - triggers task-sequence auto-injection if the SKU has one configured. |
**Four line kinds (lineType → linkedItemId target table):**
| `lineType` | Target table | Behaviour |
| ----------------------- | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `"product"` (default) | `Stock_SKU.IdGuid` | If the linked SKU has a task sequence configured, the host auto-injects its task template lines (e.g. installation tasks). |
| `"task"` | `G_Task_Templates.IdGuid` | The line **is** the task. No auto-injection. Use [`taskTemplates.list`](/developers/bridge/methods#tasktemplateslistoptions) to resolve codes to GUIDs. |
| `"cost"` *(deprecated)* | `COB_Items.IdGuid` | Legacy cost-of-business line. No auto-injection. Superseded by `"jobcost"` - prefer that for new tools. Use [`costItems.list`](/developers/bridge/methods#costitemslistoptions) to resolve codes to GUIDs. |
| `"jobcost"` | `JobCostTemplate.IdGuid` (optional) | Cost category (shipping, disposal, travel, check-measure) or an ad-hoc import line. No auto-injection. **Template-linked** when `linkedItemId` is set - GL routed via the template’s cost code, extension-supplied price wins. **Ad-hoc** when `linkedItemId` is null - the job-cost record is materialised on quote-to-job conversion (use for imports whose products don’t map to the catalogue). Use [`jobCostTemplates.list`](/developers/bridge/methods#jobcosttemplateslistoptions) to resolve codes to GUIDs. |
**Validation:** the host rejects the entire `addLines` batch if any line has an unknown `lineType` or a non-null `linkedItemId` that does not resolve to an active row in the indicated table. A `jobcost` line with a null `linkedItemId` is valid (ad-hoc). `summaryOnly` is never a validation failure - it defaults to `false` when absent or non-boolean. A `section` longer than 100 chars is truncated, not rejected. Failures surface to the extension as an exception from `addLines`.
#### Sections with no lines
[Section titled “Sections with no lines”](#sections-with-no-lines)
A section usually comes into existence because a line names it. To add a section that has no lines of its own - an “Optional Extras” section whose content is a list of add-ons, for example - pass it in `options.sections`, or call `quotes.addSections(sections)`, which is the same call with no lines.
```javascript
await window.pipeline.quotes.addLines(lines, {
sections: [
{
name: "Optional Extras",
notes: "Motorisation - add $180 per blind\nBlockout lining - add $45 per blind"
}
]
});
// Or on its own:
await window.pipeline.quotes.addSections([
{ name: "Optional Extras", notes: "Motorisation - add $180 per blind" }
]);
```
| Field | Type | Required | Description |
| ----------- | ------- | -------- | ------------------------------------------------------------------------------------ |
| name | string | required | Section label. Max 100 chars; longer names are truncated. |
| summaryOnly | boolean | optional | Default `false`. Part of section identity, exactly as on a line. |
| notes | string | optional | Printed under the section heading. Plain text; line breaks are kept; max 2000 chars. |
Declared sections are applied **after** the lines, so a new one lands after every section the lines created - which is where “Optional Extras” belongs. A declared section whose `(name, summaryOnly)` matches one the lines already created is not duplicated; its `notes` fill in the existing section only if that section has none yet.
On the customer’s quote, a section with notes but no lines prints its name and notes, with no subtotal or total. A section with neither lines nor notes is not printed.
A declared section with a blank `name` rejects the whole batch, lines included.
# Vera Bridge Overview
> Embed HTML/JS tools that run inside Vera as iframes.
Vera Marketplace lets you build HTML/JS tools that run inside Vera as embedded iframes. Tools can read and write Vera data through the JS Bridge — no authentication tokens needed.
# Examples
> A working Quick Quote tool plus the Ziptrak Retail Estimator reference implementation.
## Quick Quote Tool
[Section titled “Quick Quote Tool”](#quick-quote-tool)
This \~50-line tool demonstrates the full bridge loop for a `standalone` tool: read customers and products (now including `sku`), let the user build a quote, and submit via `quotes.create`.
```html
Quick Quote
```
## Reference: Ziptrak Retail Estimator
[Section titled “Reference: Ziptrak Retail Estimator”](#reference-ziptrak-retail-estimator)
This is the full reference implementation for a `quoting_extension` tool. It shows `initBridge` with `skuIdMap`, and `collectQuoteLines` with `groupKey`, `productId`, `costPrice`, `unit`, `location`, and `specification`.
Note
**This example uses the legacy `productId` field**, which is now deprecated in favour of `linkedItemId` + `lineType`. The deprecated field still works (Ziptrak v2.1.2 is unchanged). For new tools, prefer the modern API:
* Use `lineType: "product"` + `linkedItemId: ` for product lines (replaces `productId`).
* Use `lineType: "task"` + `linkedItemId: ` for explicit installation, removal, or service tasks. Resolve GUIDs from codes via [`taskTemplates.list`](/developers/bridge/methods#tasktemplateslistoptions).
* Use `lineType: "jobcost"` + `linkedItemId: ` for shipping, travel, disposal, and check-measure lines. Resolve GUIDs via [`jobCostTemplates.list`](/developers/bridge/methods#jobcosttemplateslistoptions). (`lineType: "cost"` still works but is deprecated.)
* Tag every line with a `section` (e.g. `"Blinds"`, `"Installation"`, `"Extras"`) — the host quote UI groups lines visually by section.
* Set `summaryOnly: true` on every line of a section that should print as a single name-and-total row (travel, shipping and installation are the usual case).
* Set `sectionNotes` on a line to give its section a note for the customer, for example what a summary-only total covers.
* Declare a section with no lines, such as “Optional Extras”, with [`quotes.addSections`](/developers/bridge/methods#quotesaddlineslines) or the `sections` option of `addLines`.
See [`quotes.addLines`](/developers/bridge/methods#quotesaddlineslines) for the full field reference and a modern multi-line example.
**manifest.json:**
```json
{
"name": "Ziptrak Retail Estimator",
"shortName": "Ziptrak",
"type": "quoting_extension",
"version": "2.0.0",
"description": "Calculate supply and install costs for Ziptrak outdoor blinds. Adds itemised lines directly to the open quote.",
"entry": "index.html"
}
```
**index.html (key JS excerpt):**
```html
```
**What the Ziptrak example demonstrates:**
* `manifest.json` with `type: "quoting_extension"` so `addLines` is unlocked
* `initBridge()` calls `products.list({ pageSize: 500 })` and populates `skuIdMap`
* `collectQuoteLines()` builds lines with:
* `groupKey` (`"blind-1"`, `"blind-2"`) so blind + pelmet lines are grouped in the quote
* `productId` resolved from `skuIdMap` for task template injection
* `productCode` as the human-readable SKU
* `costPrice` (wholesale) alongside `unitPrice` (retail) for real margin in the COB panel
* `unit: "T_ITEM"` for per-blind lines (use `"T_SQUARE_METRE"` for fabric area charges)
* `location` for the area/zone label and `specification` for dimensions and config detail
# SDK Include
> How to load the Vera SDK in your tool.
Add this script tag to your entry HTML file:
```html
```
The SDK creates a `window.pipeline` namespace with all available methods. All methods return Promises. The SDK waits internally for the bridge to be ready — you do not need to poll or delay before calling methods.
## Namespaces
[Section titled “Namespaces”](#namespaces)
The current SDK (v2.5.0) exposes:
```javascript
window.pipeline.context.get()
window.pipeline.customers.list({ page, pageSize })
window.pipeline.products.list({ page, pageSize })
window.pipeline.taskTemplates.list({ codes, page, pageSize }) // since v2.1.0
window.pipeline.costItems.list({ codes, page, pageSize }) // since v2.1.0
window.pipeline.jobCostTemplates.list({ codes, page, pageSize }) // since v2.2.0
window.pipeline.settings.get(key) // since v2.3.0
window.pipeline.settings.set(key, value) // since v2.3.0
window.pipeline.jobs.list({ page, pageSize })
window.pipeline.quotes.list({ page, pageSize })
window.pipeline.quotes.create(request)
window.pipeline.quotes.addLines(lines, { sections }) // quoting_extension only; sections since v2.5.0
window.pipeline.quotes.addSections(sections) // quoting_extension only; since v2.5.0
```
`window.pipeline.version` reports the SDK version string at runtime.
## Runtime environment
[Section titled “Runtime environment”](#runtime-environment)
Marketplace tools run inside a sandboxed iframe. A few host constraints to design around:
### Native modals are blocked
[Section titled “Native modals are blocked”](#native-modals-are-blocked)
`alert()`, `confirm()`, and `prompt()` are silently ignored — the iframe is sandboxed without the `allow-modals` capability. Calls to these functions log a warning to the DevTools console and return immediately without showing anything to the user.
**Use in-page UI for all user feedback instead:**
* For ephemeral confirmations and errors, render a toast (a small, non-interactive div positioned `fixed; bottom: 1rem; right: 1rem;` that auto-hides after 2-3 seconds).
* For persistent warnings (e.g. “couldn’t reach Vera catalogue, submit unavailable”), render a banner at the top of the tool with an inline retry button.
* For destructive confirmations (e.g. “clear all rows?”), use a two-click pattern: the first click changes the button label to “Click again to confirm” for a few seconds, the second click commits.
### Storage
[Section titled “Storage”](#storage)
Use `settings.get(key)` and `settings.set(key, value)` (since v2.3.0) for tool-side preferences such as pricing, defaults and the operator’s last-used settings. The host stores them per tenant and per tool, so they survive across sessions and devices.
Do not rely on `localStorage`: the tool runs in a sandboxed iframe with an opaque origin, where browser storage is not dependable.
Do **not** persist the in-progress quote in settings — Vera owns the quote. Submit-or-discard is the expected lifecycle.
### XSS hygiene
[Section titled “XSS hygiene”](#xss-hygiene)
If you build HTML via template strings (`element.innerHTML = \`…\`\`), escape every interpolated user-supplied value. A 6-line helper is enough:
```javascript
function escHtml(s) {
return String(s == null ? "" : s)
.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">")
.replaceAll('"', """).replaceAll("'", "'");
}
```
Apply it to anything the operator typed (notes, location names, free-text specifications) and to anything coming back from `customers.list` or `products.list` (supplier names, descriptions). Numeric and boolean values are safe.
Send the host plain text, not HTML. Section `notes` are always rendered as plain text, so HTML in them prints literally; do not put markup in line descriptions either.
# Tool Bundle Format
> Package format, allowed file types, and size limits for marketplace tools.
* Package as a `.zip` file containing your entry point HTML file at the root
* Allowed file types: .html, .css, .js, .svg, .png, .jpg, .woff2, .json
* Max compressed size: 10 MB
* Max decompressed size: 50 MB
* Max file count: 200
* No path traversal (../) in filenames
### manifest.json
[Section titled “manifest.json”](#manifestjson)
Every tool bundle must include a `manifest.json` at the root. The manifest declares how the tool integrates with Vera.
**Example:**
```json
{
"name": "Ziptrak Retail Estimator",
"shortName": "Ziptrak",
"type": "quoting_extension",
"version": "2.0.0",
"description": "Calculate supply and install costs for Ziptrak outdoor blinds. Adds itemised lines directly to the open quote.",
"entry": "index.html"
}
```
**Manifest fields:**
| Field | Type | Required | Description |
| ----------- | ------------- | -------- | ----------------------------------------------------------------------------- |
| name | string | Yes | Full display name shown in the marketplace listing |
| shortName | string | Yes | Short name used in Vera UI chrome (e.g. tab labels) |
| type | enum | Yes | Integration type — see values below |
| version | semver string | Yes | Tool version (e.g. `"2.0.0"`) |
| description | string | Yes | One-sentence description shown in the marketplace |
| entry | string | Yes | Relative path to the HTML entry point inside the bundle (e.g. `"index.html"`) |
**`type` values:**
| Value | Behaviour |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `standalone` | Default. Tool renders as a sidebar panel, launched from the Vera tool launcher. Has read access to customers, products, quotes, and jobs, plus `quotes.create`. This is the right type for quoting tools that create a new quote rather than injecting into an existing one. |
| `quoting_extension` | Tool integrates with an already-open quote modal. Launched from inside the quote UI rather than the tool launcher. Unlocks `quotes.addLines` and `quotes.addSections`, which add lines and sections directly into the active in-memory quote. Use this type when your tool is designed to add lines to a quote the user is currently editing. |
# Choosing a Path
> Compare the Public REST API and Vera Bridge to pick the right integration path.
Both integration paths target different use cases. Use this table to choose.
| | Public REST API | Vera Bridge |
| ------------- | --------------------------------------------- | --------------------------------------- |
| **Best for** | Backend sync, webhooks, third-party platforms | Embedded tools, estimators, calculators |
| **Auth** | API key (Bearer token) | None - inherits Vera session |
| **Language** | Any language (HTTP) | JavaScript (browser) |
| **Entry** | REST endpoints | `window.pipeline.*` methods |
| **Use cases** | CRM bridges, automated quoting, data export | Quote tools, configurators, lookups |
# Knowledge Base
> Guides and how-tos for using Vera.
Browse Vera guides by topic.
[Getting Started](/kb/getting-started/index)Learn the basics of Vera and get up and running quickly.
[Jobs & Pipeline](/kb/jobs-and-pipeline/index)Everything about creating and managing jobs, tasks, quotes, and the job lifecycle.
[Scheduling](/kb/scheduling/index)Schedule jobs, allocate workers, and manage your team's calendar.
[Invoicing & Finance](/kb/invoicing-and-finance/index)Create invoices, manage aging, track purchase orders, and handle supplier invoices.
[Stock & Inventory](/kb/stock-and-inventory/index)Manage SKUs, track stock levels, allocate materials to jobs, and create stock kits.
[Assets](/kb/assets/index)Register equipment, track locations, log faults, and manage asset history.
[Time Tracking](/kb/time-tracking/index)Log employee hours, manage weekly timesheets, and track time against jobs.
[Customers & CRM](/kb/customers-and-crm/index)Manage customer profiles, view activity, and use CRM reminders.
[Settings & Configuration](/kb/settings-and-configuration/index)System configuration for administrators - workflows, users, teams, and integrations.
[Mobile & Field Worker](/kb/mobile-and-field-worker/index)Using the Vera mobile app — jobs, timers, expenses, photos, and more.
[Pulse & Analytics](/kb/pulse-and-analytics/index)Admin dashboards, business intelligence, and AI-powered insights.
[Notifications & Messaging](/kb/notifications-and-messaging/index)Send emails and SMS to customers, manage message templates, and understand real-time notifications.
[Xero Integration](/kb/xero-integration/index)Connect Vera to Xero for automatic invoice, customer, and payment synchronisation.
# Assets
> Register equipment, track locations, log faults, and manage asset history.
Register equipment, track locations, log faults, and manage asset history.
[Asset Registry](/kb/assets/asset-registry)
[Logging Asset Faults](/kb/assets/logging-asset-faults)
[Asset History](/kb/assets/asset-history)
# Asset History
> Asset History - Vera knowledge base.
## Asset History
[Section titled “Asset History”](#asset-history)
Vera maintains a complete history of where each asset has been and what has happened to it, giving you full traceability.
### Location History
[Section titled “Location History”](#location-history)
> **Screenshot:** The asset location history grid showing Date, Location, Address, User, and Accessories Checked columns, with the Update Location button visible in the toolbar.
The history grid shows every recorded location change:
* **Date** - When the location was recorded
* **Location** - Physical location name
* **Address** - Full address of the location
* **User** - Who recorded the location change
* **Accessories Checked** - List of accessories present at the time
* **Notes** - Additional notes about the move (shown in tooltip)
### Recording a Location Change
[Section titled “Recording a Location Change”](#recording-a-location-change)
1. Open the asset detail page
2. Click **Update Location**
3. Fill in the location details:
* **Date/Time** - When the asset was moved
* **Location Type**:
* **Local** - On-site at a known location (select from dropdown)
* **Ad-hoc** - Temporary location (enter address manually)
* **Supplier** - At a supplier’s premises
* **Customer** - At a customer’s site
* **Location** - Select or enter the specific location
* **Accessories Checked** - Tick the checkboxes for accessories present with the asset
* **Notes** - Add any notes about the asset’s condition
4. Save the location record
### Exporting History
[Section titled “Exporting History”](#exporting-history)
Click **Export to Excel** to download the complete location history for the asset.
### Current Location
[Section titled “Current Location”](#current-location)
The asset grid’s Location column always shows the most recently recorded location, with a tooltip displaying the full address. This gives you real-time visibility of where all your assets are.
# Asset Registry
> Asset Registry - Vera knowledge base.
## Asset Registry
[Section titled “Asset Registry”](#asset-registry)
The Asset Registry is your central database for tracking all equipment, tools, vehicles, and other assets used in your operations.
### Accessing Assets
[Section titled “Accessing Assets”](#accessing-assets)
Click **Assets** in the top navigation bar to open the asset management page.
### Asset Grid
[Section titled “Asset Grid”](#asset-grid)
> **Screenshot:** The Asset Registry grid showing columns for UID, Type, Name, Manufacturer, Model, Serial Number, Location, and Status with colour-coded status pills. Include the search box, status filter radio buttons, and Add/Export toolbar buttons.
The main grid displays all registered assets with columns:
* **UID** - System-generated unique identifier
* **Type** - Asset category (equipment, tools, vehicle, etc.)
* **Name** - Asset description
* **Manufacturer** - Brand name
* **Model** - Model number
* **Description** - Additional details
* **Serial Number** - Serial or registration number
* **Location** - Current location (with address tooltip)
* **Status** - Active, Retired, In Repair, etc. (colour-coded)
* **Custom Dates** - Configurable date fields (e.g., purchase date, next service date)
### Filtering and Searching
[Section titled “Filtering and Searching”](#filtering-and-searching)
* Use the **search box** to find assets by any column value
* Filter by **status** (Active, All, etc.) using the radio buttons
* Apply **tag filters** using the multi-select dropdown
* Combine filters with AND/OR logic using the predicate toggle
### Creating a New Asset
[Section titled “Creating a New Asset”](#creating-a-new-asset)
1. Click the **Add** button in the toolbar
2. Choose numbering: **Auto** (system-generated) or **Manual** (custom UID)
3. Fill in the required fields:
* **Name** (required)
* **Type** - Select from the asset category dropdown
* **Serial Number**
* **Manufacturer** - Select from dropdown or add a new one
* **Model**
* **Owner** - Link to a supplier or organisation
* **Description** (up to 1,000 characters)
4. Optionally set custom date fields
5. Click **Save**
Vera automatically creates a default hire cost code and supply line for the new asset.
### Exporting
[Section titled “Exporting”](#exporting)
Click the **Export** button to download the asset list as an Excel spreadsheet.
# Logging Asset Faults
> Logging Asset Faults - Vera knowledge base.
## Logging Asset Faults
[Section titled “Logging Asset Faults”](#logging-asset-faults)
When equipment breaks down or has issues, Vera’s fault logging system helps you track and manage the problem through to resolution.
### Viewing Faults
[Section titled “Viewing Faults”](#viewing-faults)
> **Screenshot:** The fault report modal showing the read-only asset info (UID, Name, Manufacturer), the Report Type radio buttons (Return to Store / Drop for Repair), the Synopsis text area, and the Submit button.
The fault registry for each asset shows a grid with:
* **Date** - When the fault was reported
* **Ref** - Unique fault reference number
* **Status** - Open (red badge) or Closed
* **Fault Description** - Summary of the issue
* **User** - Email of the person who reported the fault
### Reporting a New Fault
[Section titled “Reporting a New Fault”](#reporting-a-new-fault)
1. Navigate to the asset detail page
2. Open the fault section
3. Click **Report Fault**
4. The modal shows read-only asset information: UID, Name, Manufacturer, Type, Serial Number
5. Select the **Report Type**:
* **Return to Store (Faulty)** - The asset is being returned to warehouse storage. Select the warehouse location.
* **Drop for Repair** - The asset is going to an external repair shop. Select the repair shop supplier and optionally enter the shop address.
6. Enter a **Synopsis** describing the fault in detail
7. Submit the fault report
### Fault Status
[Section titled “Fault Status”](#fault-status)
* **Open** - Fault has been reported and is being addressed (shown with a red badge)
* **Closed** - Fault has been resolved
### Tracking Faults
[Section titled “Tracking Faults”](#tracking-faults)
The asset detail page shows:
* **Open Fault Count** - Number of currently open faults
* **Open Fault Ref** - Reference of the current open fault
* **Asset Status** - Updates to reflect the fault state (e.g., “In Repair”)
This provides quick visibility of which assets have active problems.
# Customers & CRM
> Manage customer profiles, view activity, and use CRM reminders.
Manage customer profiles, view activity, and use CRM reminders.
[Customer Profiles](/kb/customers-and-crm/customer-profiles)
[CRM Reminders](/kb/customers-and-crm/crm-reminders)
# CRM Reminders
> CRM Reminders - Vera knowledge base.
## CRM Reminders
[Section titled “CRM Reminders”](#crm-reminders)
The Reminders board is Vera’s built-in CRM tool for managing follow-ups, customer engagement, and task tracking.
### Accessing Reminders
[Section titled “Accessing Reminders”](#accessing-reminders)
Click **Reminders** in the top navigation bar to open the reminder board.
### Reminder Board Layout
[Section titled “Reminder Board Layout”](#reminder-board-layout)
> **Screenshot:** The Reminders board showing the section headers (Overdue, Due Today, Upcoming, Open Tasks) with count badges, the “My Reminders / All” toggle, and several reminder cards with titles, due dates, and priority indicators.
The board organises reminders into sections by status:
* **Overdue** - Reminders past their due date (with count badge)
* **Due Today** - Reminders due today (with count badge)
* **Upcoming** - Future reminders (with count badge)
* **Open Tasks** - Active tasks (with count badge)
* **Completed** - Finished reminders (shown when the “Show Completed” toggle is on)
### Filtering Reminders
[Section titled “Filtering Reminders”](#filtering-reminders)
* **My Reminders / All** - Toggle between viewing only your reminders or the entire team’s
* **Show Completed** - Toggle to reveal or hide completed items
### Creating a Reminder
[Section titled “Creating a Reminder”](#creating-a-reminder)
1. Click **Create New**
2. Fill in the details:
* **Title** (required) - e.g., “Follow up on trial feedback”
* **Description** - Additional context (optional)
* **Due Date** - When the reminder should trigger (optional)
* **Priority** - Low, Normal, or High
* **Assigned To** - Select a team member from the dropdown
* **Company** - Optionally link to a CRM company
3. Click **Save**
### Managing Reminders
[Section titled “Managing Reminders”](#managing-reminders)
* Click a reminder to edit its details
* Mark a reminder as complete when the follow-up is done
* Reminders past their due date automatically appear in the Overdue section
### CRM Item Board
[Section titled “CRM Item Board”](#crm-item-board)
The reminder board also includes a CRM item view with colour-coded expiration indicators:
* **Green** - Not expired, on track
* **Amber** - Warning, approaching expiration
* **Red** - Overdue or expired
Categories show the count of items by status. Click a category to focus on that type of follow-up.
# Customer Profiles
> Customer Profiles - Vera knowledge base.
## Customer Profiles
[Section titled “Customer Profiles”](#customer-profiles)
Every customer in Vera has a detailed profile page where you can view their information, activity, invoices, files, and history.
### Accessing a Customer
[Section titled “Accessing a Customer”](#accessing-a-customer)
Click on a customer name from any job, invoice, or search result to open their profile page.
### Profile Header
[Section titled “Profile Header”](#profile-header)
The header displays:
* **Customer reference** and **name**
* **Phone number** (Contact 1)
* **Email address** (Contact 2)
* **Billing address** (formatted)
### Profile Tabs
[Section titled “Profile Tabs”](#profile-tabs)
> **Screenshot:** A customer profile page showing the header with customer name, phone, email, and billing address, and the four tabs (Activity, Invoices, Files, History) with the Activity tab selected showing the timeline.
The customer profile has four tabs:
**Activity Tab** Shows a timeline of all customer interactions using a visual timeline component. This includes jobs, quotes, communications, and other transactions - giving you a complete picture of your relationship with the customer.
**Invoices Tab** Displays a table of all financial transactions for the customer, including:
* Invoice references and amounts
* Invoice status
* Payment history Click any invoice to view its full details.
**Files Tab** Manage documents associated with this customer:
* **Upload** - Drag and drop files or click to browse
* **File List** - View all uploaded files with options to preview, download, or delete Supports images, PDFs, and other document types.
**History Tab** A complete audit trail showing every change made to this customer record:
* Object type and record type (Create, Edit, Delete)
* Description of what changed
* Who made the change
* Date and time Expand any entry to see detailed change information.
# Getting Started
> Learn the basics of Vera and get up and running quickly.
Learn the basics of Vera and get up and running quickly.
[Welcome to Vera](/kb/getting-started/welcome-to-pipeline)
[Logging In and Your Dashboard](/kb/getting-started/logging-in-and-your-dashboard)
[Understanding User Roles](/kb/getting-started/understanding-user-roles)
[Using Global Search](/kb/getting-started/using-global-search)
# Logging In and Your Dashboard
> Logging In and Your Dashboard - Vera knowledge base.
## Logging In
[Section titled “Logging In”](#logging-in)
Navigate to your organisation’s Vera URL in your web browser. Enter your email address and password to sign in.
If you have forgotten your password, click the “Forgot password?” link on the login page to receive a password reset email.
## Your Dashboard
[Section titled “Your Dashboard”](#your-dashboard)
After logging in, you land on the Dashboard - your central hub for viewing and managing jobs.
### Dashboard Views
[Section titled “Dashboard Views”](#dashboard-views)
The Dashboard has two main sections:
**Pipeline Matrix**
The top of the Dashboard shows the Pipeline Matrix - a summary grid where:
* **Columns** represent workflow stages: Pending, Pricing, Stock, Scheduling, In Progress, Back Costing, Invoicing, Payments
* **Rows** represent status colours: Purple (priority), Red (critical), Amber (warning), Green (on track)
* Each **cell** shows a count of jobs matching that stage and status
* Click any cell to open a filtered list of those specific jobs
> **Screenshot:** The Pipeline Matrix at the top of the Dashboard showing the grid of workflow stages (columns) and status colours (rows) with count numbers in each cell.
**Job List**
Below the matrix, a detailed job grid shows all active jobs with columns for Job Ref, Stage, Schedule, Customer, Service Address, Channel, and traffic light status indicators.
> **Screenshot:** The job list grid below the Pipeline Matrix showing several rows of jobs with their reference numbers, workflow stages, customer names, and coloured status dots.
### Activity Panel
[Section titled “Activity Panel”](#activity-panel)
The right-hand sidebar displays a real-time activity feed showing messages, notifications, and status changes. It includes a **New Job** button and a **Message** button at the top.
### Quick Actions
[Section titled “Quick Actions”](#quick-actions)
* Click the **New Job** button in the activity panel to create a new job
* Click any job reference in the grid to open the full job detail page
* Click any cell in the Pipeline Matrix to see jobs matching that stage and status
# Understanding User Roles
> Understanding User Roles - Vera knowledge base.
## User Roles in Vera
[Section titled “User Roles in Vera”](#user-roles-in-vera)
Vera uses role-based access to control what each user can see and do. Your administrator assigns roles when creating your account.
### Available Roles
[Section titled “Available Roles”](#available-roles)
**Super User** Full access to all features including system configuration, integrations, debug tools, and all module settings. This is typically reserved for system administrators.
**Admin** Access to administrative features including user management, workflow configuration, and all operational modules. Can view Pulse analytics dashboards.
**Office** Designed for office-based staff who manage the day-to-day operations. Access includes:
* Creating and managing jobs
* Sales and invoicing
* Purchase order management
* Stock management (if Stock module is enabled)
* Customer management
* Time tracking
* CRM reminders
**Field** Designed for field workers who perform on-site work. Access includes:
* Viewing assigned jobs
* Updating job and task status
* Schedule viewing
* Asset management (if Assets module is enabled)
### Module Access
[Section titled “Module Access”](#module-access)
In addition to roles, your organisation may have specific modules enabled:
* **Vera** - Core job management, scheduling, and invoicing
* **Stock** - Inventory and stock management
* **Assets** - Equipment tracking and fault logging
Your navigation bar only shows modules that are both enabled for your organisation and accessible by your role.
### Checking Your Access
[Section titled “Checking Your Access”](#checking-your-access)
If you cannot see a particular feature or menu item, it may be because your role does not include access to that area. Contact your administrator to request a role change if needed.
# Using Global Search
> Using Global Search - Vera knowledge base.
## Global Search
[Section titled “Global Search”](#global-search)
Vera’s Global Search lets you quickly find customers, jobs, contacts, and other records across the system.
### How to Search
[Section titled “How to Search”](#how-to-search)
1. Click the **Search** icon in the navigation bar, or navigate to the search page
2. Type your search term in the search box (up to 50 characters)
3. Results appear automatically as you type (with a short delay for performance)
4. Click the **X** button to clear your search and start over
### Search Scope
[Section titled “Search Scope”](#search-scope)
> **Screenshot:** The Global Search page showing the search box at the top with scope checkboxes (Customers, Prospects, Contacts, Quotes) and a set of search results below.
Use the checkboxes to control which types of records to search:
* **Customers** - Search by customer name, reference, phone, email, or address
* **Prospects** (Jobs) - Search by job reference, customer name, phone, email, or address
* **Contacts** - Search individual contact records
* **Quotes** - Search quote references
You can enable multiple scopes at once to search across different record types simultaneously.
### Search Results
[Section titled “Search Results”](#search-results)
Results are displayed in separate grids by type:
**Customer Results** show:
* Customer Reference
* Customer Name
* Phone Number
* Email Address
* Billing Address
* Date Created
**Job Results** show:
* Job Reference (auto-number)
* Customer Name
* Phone and Email
* Billing Address
* Current Status
### Navigating to Results
[Section titled “Navigating to Results”](#navigating-to-results)
Click any row in the search results to navigate directly to that record’s detail page.
### Tips
[Section titled “Tips”](#tips)
* Search is case-insensitive
* Partial matches are supported - you don’t need to type the full name or reference
* Use the most specific term you can to narrow down results quickly
# Welcome to Vera
> Welcome to Vera - Vera knowledge base.
## What is Vera?
[Section titled “What is Vera?”](#what-is-vera)
Vera is a complete field service management platform designed to help your business manage jobs, scheduling, invoicing, stock, assets, and customer relationships - all in one place.
### Key Modules
[Section titled “Key Modules”](#key-modules)
Vera is organised into several core modules, each accessible from the top navigation bar:
* **Dashboard** - Your home base. The Pipeline Matrix shows a summary grid of all jobs by workflow stage and status colour, with a detailed job list below and a real-time activity panel on the right.
* **Schedule** - Plan and allocate resources with multiple views including Month, Timeline, Week, and Agenda. Drag-and-drop workers onto jobs.
* **Sales** - Track invoices by aging bucket (7, 30, 60, 90, 120+ days), create and send invoices, and manage quotes.
* **Purchases** - Manage supplier invoices, purchase orders, and back-costing reconciliation.
* **Stock** - Full inventory management with SKUs, stock in/out tracking, job allocation, and stock kits.
* **Assets** - Register and track equipment, log faults, and maintain location history.
* **Time Tracking** - Weekly timesheet entry for employees with daily status indicators.
* **Reminders** - CRM-style reminder board for customer follow-ups and task management.
* **Pulse** - Admin-only analytics dashboards with AI-powered insights, charts, and business intelligence.
* **Settings** - System configuration for workflows, users, teams, templates, and integrations.
> **Screenshot:** The top navigation bar showing all module links (Dashboard, Schedule, Pulse, Reminders, Stock, Sales, Purchases, Time Tracking, Assets, Settings). Capture while logged in as an Admin user so all modules are visible.
### Navigation
[Section titled “Navigation”](#navigation)
The top navigation bar adapts based on your role and the modules enabled for your organisation. Click any module name to navigate to it. Your current location is highlighted in the navigation bar.
### Real-Time Updates
[Section titled “Real-Time Updates”](#real-time-updates)
Vera uses real-time communication so your screen updates automatically when colleagues make changes. You don’t need to manually refresh - new jobs, status changes, and notifications appear instantly.
### Getting Help
[Section titled “Getting Help”](#getting-help)
If you need assistance, browse the articles in this Knowledge Base by category, or use the search bar at the top of the Knowledge Base page to find specific topics.
# Invoicing & Finance
> Create invoices, manage aging, track purchase orders, and handle supplier invoices.
Create invoices, manage aging, track purchase orders, and handle supplier invoices.
[Sales Aging Overview](/kb/invoicing-and-finance/sales-aging-overview)
[Creating and Editing Invoices](/kb/invoicing-and-finance/creating-and-editing-invoices)
[Sending Invoices by Email](/kb/invoicing-and-finance/sending-invoices-by-email)
[Purchase Orders](/kb/invoicing-and-finance/purchase-orders)
[Supplier Invoices](/kb/invoicing-and-finance/supplier-invoices)
# Creating and Editing Invoices
> Creating and Editing Invoices - Vera knowledge base.
## Creating and Editing Invoices
[Section titled “Creating and Editing Invoices”](#creating-and-editing-invoices)
Vera provides a full invoice editor for creating, editing, and managing invoices linked to your jobs.
### Invoice Header
[Section titled “Invoice Header”](#invoice-header)
> **Screenshot:** The draft invoice editor showing the header (Invoice Reference, Date, Customer), the line items table with Cost Code, Description, Units, Rate, and Line Nett columns, and the Nett/Tax/Total summary box at the bottom right.
When editing a draft invoice, the header contains:
* **Invoice Reference** - Editable reference number (required, shown with red border if empty)
* **Invoice Date** - Date picker for when the invoice is issued
* **Customer Name** - The invoiced customer
* **Customer Address** - Full billing address
Click the **pencil icon** next to the date to enter edit mode for header fields.
### Invoice Line Items
[Section titled “Invoice Line Items”](#invoice-line-items)
Each invoice line includes:
* **Job Date** - Date the work was performed
* **Job Ref** - Reference to the related job
* **Cost Code** - Select from the dropdown (automatically fills description, rate, and tax rate)
* **Description** - Line item description (editable)
* **Units** - Quantity or hours (0 to 1000)
* **Charge Rate** - Rate per unit (calculated from cost code)
* **Tax Rate** - Tax percentage (from cost code)
* **Line Nett** - Automatically calculated (Units x Rate)
**Editing a line:** Click the pencil icon on any line to enter edit mode. The row highlights and becomes editable. Click the checkmark to save or X to cancel.
**Deleting a line:** Click the trash icon (requires PIN confirmation for security).
### Invoice Totals
[Section titled “Invoice Totals”](#invoice-totals)
The summary box at the bottom right shows:
* **Nett** - Subtotal before tax
* **Tax** - Total tax amount
* **Total** - Gross amount (all formatted to 2 decimal places)
### Invoice Workflow
[Section titled “Invoice Workflow”](#invoice-workflow)
Invoices progress through three statuses:
1. **Draft** - Fully editable. Title shows “DRAFT Invoice”. You can add/edit/delete lines and change the date and reference.
2. **Approved** - Click “Approve Only” to lock the invoice. Lines are no longer editable. You can “Unapprove” to return to Draft if needed.
3. **Sent** - After sending, the invoice is fully locked. You can only view the PDF.
# Purchase Orders
> Purchase Orders - Vera knowledge base.
## Purchase Orders
[Section titled “Purchase Orders”](#purchase-orders)
Purchase Orders (POs) in Vera let you order materials and services from suppliers, linked to specific jobs.
### PO Header
[Section titled “PO Header”](#po-header)
> **Screenshot:** The Purchase Order modal showing the PO header (Reference, Supplier, Delivery Option), the line items grid with SKU, Description, Quantity, Rate, and Nett columns, and the Send PO button.
Each PO contains:
* **PO Reference** - Unique purchase order number
* **Supplier Name** - The supplier you are ordering from
* **Supplier Email** - For sending the PO electronically
* **Delivery Option** - Choose between:
* **Deliver** - Delivery to the project service address
* **Collection** - Pick up from the supplier
* **Delivery Address** - Automatically filled based on the delivery option
### PO Line Items
[Section titled “PO Line Items”](#po-line-items)
POs support two types of lines:
**Stock/SKU Lines** (for inventory items):
* Our Ref (SKU code)
* Supplier Ref
* Description
* Quantity (editable inline)
* GL Account
* Supplied Rate
* Nett total (auto-calculated)
* Manifest link status
**Generic Lines** (for non-stock items):
* Supplier Ref
* Description
* Quantity (editable inline)
* GL Account
* Supplied Rate
* Nett total
Edit quantities by clicking directly in the quantity cell (inline editing). Line totals recalculate automatically.
### Sending a PO
[Section titled “Sending a PO”](#sending-a-po)
1. Ensure at least one line item exists (the Send button is disabled without lines)
2. Click **Send PO**
3. The email modal opens with a template including the supplier name, PO reference, and a link for the supplier to view the PO
4. Click **Send** to deliver the PO to the supplier
### Deleting Lines
[Section titled “Deleting Lines”](#deleting-lines)
Click the trash icon on any line to remove it from the PO.
# Sales Aging Overview
> Sales Aging Overview - Vera knowledge base.
## Sales Aging Overview
[Section titled “Sales Aging Overview”](#sales-aging-overview)
The Sales page provides a clear picture of your outstanding invoices, organised by how long they have been due.
### Aging Buckets
[Section titled “Aging Buckets”](#aging-buckets)
> **Screenshot:** The Sales Aging page showing the five aging bucket cards (7, 30, 60, 90, 120+ days) at the top with invoice counts and amounts, and the invoice summary table below.
At the top of the Sales page, five aging cards show your invoice aging at a glance:
| Bucket | Description |
| ------------- | ------------------------- |
| **7 Days** | Invoices 0-7 days old |
| **30 Days** | Invoices 8-30 days old |
| **60 Days** | Invoices 31-60 days old |
| **90 Days** | Invoices 61-90 days old |
| **120+ Days** | Invoices over 90 days old |
Each card displays:
* **Invoice count** - A badge showing how many invoices fall in that range
* **Amount outstanding** - The gross amount minus any credits applied
* **Credits** - Shown separately in red if credit notes have been issued
* **Sales total** - Original sales amount before credits
### Invoice Summary Table
[Section titled “Invoice Summary Table”](#invoice-summary-table)
Below the aging cards, a detailed table lists all invoices with:
* **Customer Name/Ref** - The customer linked to the invoice
* **Invoice Reference** - Unique invoice number
* **Invoice Date** - When the invoice was issued
* **Amount Outstanding** - Balance still due
* **Total Paid** - Cumulative payments received (shown in green, click to view payment breakdown)
* **Invoice Status** - Draft, Approved, or Sent
* **Credit Notes** - Any related credit notes with their own outstanding and paid amounts
### Actions
[Section titled “Actions”](#actions)
* **Click an invoice row** to open a detailed invoice preview and analysis
* **Click the green “Total Paid” amount** to see a breakdown of payments received
* **Create Credit Note** - Available via the dropdown action for qualifying invoices
* **Search and filter** invoices using the toolbar
# Sending Invoices by Email
> Sending Invoices by Email - Vera knowledge base.
## Sending Invoices by Email
[Section titled “Sending Invoices by Email”](#sending-invoices-by-email)
Once an invoice is approved, you can send it directly to your customer via email.
### How to Send
[Section titled “How to Send”](#how-to-send)
1. Open the invoice from the Sales page
2. If the invoice is in Draft, click **Approve and Send** or approve first, then click **Send**
3. The send modal opens with the email details
### Email Configuration
[Section titled “Email Configuration”](#email-configuration)
> **Screenshot:** The invoice send modal showing the customer name, email address, rich text email body editor with template placeholders, the “Alert on Status Update” checkbox, and the Send button.
The send modal shows:
* **Customer name** - Confirmed recipient
* **Email address** - Pre-filled from the customer record
**Email Body:** A rich text editor with a pre-populated template that includes:
* Customer name
* Invoice reference
* Total amount
* Link to view the invoice online
* Link for online payment
* Your organisation’s accounts team name
You can customise the email text before sending.
**Alert on Status Update:** Tick this checkbox to receive notifications when the customer opens or interacts with the invoice.
### What Happens When You Send
[Section titled “What Happens When You Send”](#what-happens-when-you-send)
When you click **Send**:
1. An HTML version of the invoice is generated
2. A PDF copy is created and stored
3. The email is queued with the invoice attached
4. The invoice status updates to “Sent”
5. A confirmation notification appears
The invoice is now locked and cannot be edited. To view it later, use the **View PDF** option.
### After Sending
[Section titled “After Sending”](#after-sending)
* The invoice appears as “Sent” in the Sales aging view
* Payment tracking begins
* If “Alert on Status Update” was enabled, you will be notified of customer interaction
# Supplier Invoices
> Supplier Invoices - Vera knowledge base.
## Supplier Invoices
[Section titled “Supplier Invoices”](#supplier-invoices)
The Purchases page lets you manage invoices received from your suppliers and reconcile them against purchase orders.
### Supplier Invoice Grid
[Section titled “Supplier Invoice Grid”](#supplier-invoice-grid)
> **Screenshot:** The Purchases page showing the supplier invoice grid with columns for Type, Reference, Supplier, PO, Date, Nett/Tax/Gross, and Reconciliation Status. Include a visible “Reconcile” button on an unreconciled row.
The main grid shows all supplier invoices with columns:
* **Type** - Invoice classification
* **Reference** - Supplier’s invoice reference number (click to open details)
* **Supplier** - Supplier company name
* **Purchase Order** - Linked PO reference
* **Date** - Invoice date
* **Nett / Tax / Gross** - Financial amounts
* **Payment Due Date** - When payment is due
* **Payment Status** - Current payment state
* **Reconciliation Status** - Whether the invoice has been matched to PO lines
### Searching and Filtering
[Section titled “Searching and Filtering”](#searching-and-filtering)
Use the search box in the toolbar to filter invoices across all visible columns.
### Importing Supplier Invoices
[Section titled “Importing Supplier Invoices”](#importing-supplier-invoices)
Drag and drop supplier invoice files onto the upload area in the toolbar, or click to browse for files.
### Reconciliation (Back Costing)
[Section titled “Reconciliation (Back Costing)”](#reconciliation-back-costing)
For invoices that are not yet reconciled, a **Reconcile** button appears. Click it to open the Back Costing modal:
**Left panel** - Supplier invoice lines showing:
* Item name, Supplier Ref, Quantity, Rate, Nett
* Allocation status
* Reconciliation status
**Right panel** - Unreconciled PO lines available for matching
**Auto Allocate** - Click the magic wand icon to automatically match PO lines to invoice lines by SKU name.
**Manual Allocation** - Drag PO lines from the right panel onto invoice lines in the left panel to create manual matches.
After reconciliation, the status updates and the invoice is linked to the corresponding purchase order lines.
# Jobs & Pipeline
> Everything about creating and managing jobs, tasks, quotes, and the job lifecycle.
Everything about creating and managing jobs, tasks, quotes, and the job lifecycle.
[Creating a New Job](/kb/jobs-and-pipeline/creating-a-new-job)
[Understanding Workflow Stages](/kb/jobs-and-pipeline/understanding-workflow-stages)
[Managing Job Tasks](/kb/jobs-and-pipeline/managing-job-tasks)
[Job Holds and Status Changes](/kb/jobs-and-pipeline/job-holds-and-status-changes)
[Adding Notes and Communications](/kb/jobs-and-pipeline/adding-notes-and-communications)
[Working with Quotes](/kb/jobs-and-pipeline/working-with-quotes)
# Adding Notes and Communications
> Adding Notes and Communications - Vera knowledge base.
## Notes and Communications
[Section titled “Notes and Communications”](#notes-and-communications)
Vera tracks all communications related to a job in a dedicated activity view, giving you a complete history of interactions.
### Communications View
[Section titled “Communications View”](#communications-view)
> **Screenshot:** The Communications view showing the split-panel layout - message list on the left with type icons and timestamps, and the full message detail on the right with subject, from/to, and body content.
The communications panel uses a split-panel layout:
* **Left panel** - Message list showing all communications, newest first
* **Right panel** - Full message detail when a message is selected
### Message List
[Section titled “Message List”](#message-list)
Each message in the list shows:
* **Type icon** - Email, SMS, phone call, or manual note
* **Sender name** - Who sent or created the message
* **Direction** - “Sent” with the recipient, or “Received” with the sender
* **Date and time** - When the communication occurred
* **Subject or synopsis** - Brief preview of the content
### Message Detail
[Section titled “Message Detail”](#message-detail)
Click a message to view full details:
* **Subject** - Full message subject line
* **Send Date** - Exact date and time
* **From/To** - Sender and recipient information
* **Attachments** - Count and list of attached files (click to preview or download)
* **Message Body** - Complete message content
### Communication Types
[Section titled “Communication Types”](#communication-types)
* **Received** - Incoming communications from the customer
* **Sent** - Outgoing communications from your organisation
* **Notes** - Internal notes added by team members
### Attachments
[Section titled “Attachments”](#attachments)
Messages can include file attachments. Click an attachment to preview it, or use the download option to save it locally.
# Creating a New Job
> Creating a New Job - Vera knowledge base.
## Creating a New Job
[Section titled “Creating a New Job”](#creating-a-new-job)
To create a new job in Vera, click the **Add Job** button from your Dashboard or navigate to the new job page.
### Required Information
[Section titled “Required Information”](#required-information)
> **Screenshot:** The New Job form showing the full page with Workflow dropdown, Channel selector, Customer Information fields, Location section, and Enquiry text area.
**Workflow** Select the workflow type from the dropdown. This determines how the job will progress through stages (e.g., Quoted Job, Reactive Job). This is a required field.
**Channel** Select how the customer enquiry came in - phone, web, email, referral, etc.
**Customer Information**
* **Company Name** - Start typing to search for an existing customer, or enter a new name to create one
* **Account Reference** - The customer’s account reference number
* **Primary Contact** - The main contact person’s name
* **Phone Number** - Contact phone number
* **Email Address** - Contact email
Use the **Find Customer** icon to open a customer lookup if you need to search by different criteria.
**Location Information**
* Tick the checkbox if the billing address is the same as the service address
* Enter the **Billing Address** - Vera will verify the address and calculate travel time
* Enter the **Service Address** if different from billing
A green checkmark confirms the address has been verified.
**Job Details**
* **Enquiry** - Describe the customer’s requirements in the large text area
* **Tags** - Add searchable tags to categorise the job
### After Creation
[Section titled “After Creation”](#after-creation)
When you click **Save and Close**:
1. Vera generates a unique job reference number
2. The workflow instance is created at the first stage
3. You are returned to the Dashboard with a confirmation notification
4. Depending on the workflow selected, you may need to create a quote or schedule the job next
# Job Holds and Status Changes
> Job Holds and Status Changes - Vera knowledge base.
## Job Holds and Status Changes
[Section titled “Job Holds and Status Changes”](#job-holds-and-status-changes)
Vera allows you to put jobs on hold and manage their status throughout the lifecycle.
### Placing a Job on Hold
[Section titled “Placing a Job on Hold”](#placing-a-job-on-hold)
Sometimes a job needs to be paused - waiting for a customer decision, materials, or approvals. To place a job on hold:
1. Open the job detail page
2. Click the **Options** button in the job header
3. Select **Hold Job**
4. Choose the hold reason (e.g., Hold for Quote, Hold for Schedule)
> **Screenshot:** A job detail page header showing the red Hold badge next to the workflow stage, the Options button, and the Close Job button.
When a job is on hold:
* A **red badge** appears in the job header showing the hold status
* Certain actions may be restricted until the hold is released
* The job remains visible in your Dashboard and reports
### Releasing a Hold
[Section titled “Releasing a Hold”](#releasing-a-hold)
To remove a hold:
1. Open the job detail page
2. Click the **Options** button
3. Select **Unhold Job**
The red hold badge will be removed and normal operations resume.
### Closing a Job
[Section titled “Closing a Job”](#closing-a-job)
When all work is complete, a **Close Job** button appears in the job header (only visible when the job is ready and in Open status):
1. Click **Close Job** in the header bar
2. Confirm the closure
Closing a job finalises it and prevents further task updates.
### Configuring a Job
[Section titled “Configuring a Job”](#configuring-a-job)
Click the **pencil icon** in the job header to open the configuration modal where you can change:
* **Channel** - How the enquiry was received
* **Workflow** - The job workflow type (changes available stages)
* **Invoice Option** - How the customer should be invoiced
* **Credit Limit** - Maximum spend allowed for this job
# Managing Job Tasks
> Managing Job Tasks - Vera knowledge base.
## Managing Job Tasks
[Section titled “Managing Job Tasks”](#managing-job-tasks)
Tasks are the individual units of work within a job. Each job contains tasks that need to be completed as the job progresses through its workflow.
### Viewing Tasks
[Section titled “Viewing Tasks”](#viewing-tasks)
Tasks can be viewed in two formats:
**Kanban View** Three columns showing task status:
* **Todo** - Tasks not yet started (sorted ascending)
* **Started** - Tasks currently in progress (sorted ascending)
* **Completed** - Finished tasks (sorted newest first)
Each column shows a count of tasks in that status.
> **Screenshot:** The task Kanban view showing the three columns (Todo, Started, Completed) with task cards in each column and count badges in the column headers.
**List View** A detailed table showing all task properties including status, estimated time, due date, and assigned workers.
### Task Properties
[Section titled “Task Properties”](#task-properties)
Each task has:
* **Name** - The task description (from the task template)
* **Status** - Todo, Started, or Completed
* **Estimated Minutes** - Time budget for the task
* **Due Date** - When the task should be completed
* **Chargeable** - Whether time on this task is billable to the customer
* **Assigned Workers** - Employees allocated to this task
### Updating a Task
[Section titled “Updating a Task”](#updating-a-task)
Click on a task to open the task update modal:
> **Screenshot:** The task update modal showing the status dropdown, chargeable checkbox, time tracking fields (Total Time, Chargeable, Unchargeable), and the employee assignment grid with the “Add Employee” button.
1. **Change Status** - Use the status dropdown to move the task from Todo to Started or Completed
2. **Toggle Chargeable** - Check or uncheck the chargeable box to control billing
3. **View Time** - See total time logged, chargeable time, and unchargeable time (read-only)
4. **Manage Workers** - Click “Add Employee” to assign workers. The grid shows each employee’s name, hours, rates, and cost codes
### Task Time Tracking
[Section titled “Task Time Tracking”](#task-time-tracking)
Time is tracked automatically when workers log their hours against tasks. The task update modal shows:
* **Total Time on Task** - All hours logged
* **Chargeable Time** - Hours that will be invoiced
* **Unchargeable Time** - Hours absorbed as cost
# Understanding Workflow Stages
> Understanding Workflow Stages - Vera knowledge base.
## Understanding Workflow Stages
[Section titled “Understanding Workflow Stages”](#understanding-workflow-stages)
Every job in Vera follows a workflow - a defined sequence of stages that the job progresses through from creation to completion.
### What Are Workflow Stages?
[Section titled “What Are Workflow Stages?”](#what-are-workflow-stages)
Workflow stages represent the key milestones in a job’s lifecycle. Common stages include:
* **Pending** - Job has been created but not yet actioned
* **Pricing** - Quote or estimate is being prepared
* **Stock** - Materials are being allocated or ordered
* **Scheduling** - Job is being scheduled for a site visit
* **In Progress** - Work is being carried out
* **Completed** - Work has been finished
* **Invoiced** - Invoice has been sent to the customer
The exact stages depend on the workflow type selected when the job was created. Your administrator configures these in Settings.
### Stage Indicators
[Section titled “Stage Indicators”](#stage-indicators)
> **Screenshot:** A job detail page header showing the workflow stage tabs along the top, with the current stage highlighted and completed stages showing checkmarks.
On the Dashboard, the Pipeline Matrix groups jobs by their current stage (columns) and status colour (rows). Each cell shows a colour-coded count:
* **Green** - On track, no issues
* **Amber** - Warning, approaching a deadline or requires attention
* **Red** - Overdue or a problem has been identified
* **Purple** - Critical priority
### Moving Between Stages
[Section titled “Moving Between Stages”](#moving-between-stages)
Jobs advance through stages as tasks are completed or as you manually update the workflow. Some transitions happen automatically (e.g., completing all tasks at a stage may advance the job), while others require manual action.
### Viewing Stage Progress
[Section titled “Viewing Stage Progress”](#viewing-stage-progress)
On the job detail page, tabs correspond to workflow stages. The current stage is highlighted, and completed stages show a checkmark. You can review the work done at each stage by clicking the relevant tab.
# Working with Quotes
> Working with Quotes - Vera knowledge base.
## Working with Quotes
[Section titled “Working with Quotes”](#working-with-quotes)
Vera’s quoting system lets you create, edit, and send quotes to customers as part of the job workflow.
### Quote Lifecycle
[Section titled “Quote Lifecycle”](#quote-lifecycle)
Quotes move through these statuses:
1. **Draft** - Editable, not yet sent to the customer
2. **Sent** - Delivered to the customer, awaiting response
3. **Accepted** - Customer has accepted the quote
4. **Rejected** - Customer has declined the quote
5. **Expired** - Quote validity period has passed
### Creating a Quote
[Section titled “Creating a Quote”](#creating-a-quote)
From the job detail page:
1. Navigate to the Quotes section
2. Click **New Quote**
3. Fill in the quote details
> **Screenshot:** The Quote editor showing the header fields (Customer, Date, Expiry, Address), the line items table with columns for description, quantity, rate, and total, and the financial summary (Nett, Tax, Total) at the bottom.
**Quote Header Fields:**
* **Customer** - Pre-filled from the job (editable in Draft only)
* **Date** - Quote date (editable in Draft only)
* **Expiry** - Select quote validity period from the dropdown
* **Address** - Toggle between billing and service address
* **Type** - Switch between Quote and Estimate (Draft only)
**Quote Line Items:** Each line includes:
* Task or item description
* Quantity
* Unit rate
* Total price
* Whether the line is chargeable
* Notes
### Hiding line detail in a section
[Section titled “Hiding line detail in a section”](#hiding-line-detail-in-a-section)
Some sections are better shown to the customer as a single figure. Travel, shipping and installation costs are the usual example - you want the customer to see what the work costs, not a breakdown they can pick apart line by line.
Click the eye icon on a section heading in the quote editor. On the customer’s quote that section prints as one row with its name and total, and the heading in your editor changes to read “Total only on customer quote” so you can see at a glance which sections are collapsed.
Everything else stays exactly as it was:
* You still see every line, itemised, in the editor.
* The lines still flow through to job costing when the quote becomes a job.
* The quote’s total is unchanged - nothing is hidden from the arithmetic, only from the customer’s view of the detail.
A collapsed section always shows its total, even if your quote template has section subtotals turned off.
Quoting extensions can set this automatically, so a section that should always be summarised is collapsed the moment the lines arrive - no need to remember it on each quote.
### Financial Summary
[Section titled “Financial Summary”](#financial-summary)
The quote header displays key financial metrics:
* **Cost** - Total cost of quoted items
* **Margin** - Profit amount (Gross minus Cost)
* **Margin %** - Percentage profit
* **Budget** - Project budget limit
The bottom of the quote shows:
* **Nett** - Subtotal before tax
* **Tax** - Tax amount
* **Total** - Gross amount including tax
### Sending a Quote
[Section titled “Sending a Quote”](#sending-a-quote)
Once your quote is ready:
1. Review all line items and totals
2. Click **Send Quote**
3. The quote status changes to Sent and fields become locked
### Quote Actions
[Section titled “Quote Actions”](#quote-actions)
* **Preview** - View the quote as a formatted PDF
* **Clone** - Create a copy of an existing quote
* **Create Invoice** - Generate an invoice from an accepted quote
* **Export** - Download as PDF
# Mobile & Field Worker
> Using the Vera mobile app — jobs, timers, expenses, photos, and more.
Using the Vera mobile app — jobs, timers, expenses, photos, and more.
[Linking Your Device](/kb/mobile-and-field-worker/linking-your-device)
[Your Job List](/kb/mobile-and-field-worker/your-job-list)
[Scheduling a Job from Mobile](/kb/mobile-and-field-worker/scheduling-a-job-from-mobile)
[Arriving on Site and Risk Assessment](/kb/mobile-and-field-worker/arriving-on-site-and-risk-assessment)
[Task Completion and Time Tracking](/kb/mobile-and-field-worker/task-completion-and-time-tracking)
[The Job Timer](/kb/mobile-and-field-worker/the-job-timer)
[Job Photos and Files](/kb/mobile-and-field-worker/job-photos-and-files)
[Job Notes and Messages](/kb/mobile-and-field-worker/job-notes-and-messages)
[Expenses and Receipt Scanning](/kb/mobile-and-field-worker/expenses-and-receipt-scanning)
[Calendar View](/kb/mobile-and-field-worker/calendar-view)
[App Settings](/kb/mobile-and-field-worker/app-settings)
# App Settings
> App Settings - Vera knowledge base.
## App Settings
[Section titled “App Settings”](#app-settings)
The Settings tab lets you configure the app to suit your preferences.
### Your Profile
[Section titled “Your Profile”](#your-profile)
Shows your name and login status with an avatar displaying your initials.
### Organisation Switching
[Section titled “Organisation Switching”](#organisation-switching)
If you have access to multiple organisations, the Settings page lists them all. Tap an organisation to switch — you will be prompted for your password to confirm.
### Theme
[Section titled “Theme”](#theme)
Toggle **Dark Mode** on or off. The change applies immediately across the entire app.
### Timer Auto-Stop
[Section titled “Timer Auto-Stop”](#timer-auto-stop)
Choose how long timers can run before automatically stopping:
* 1 hour, 2 hours, 4 hours, 8 hours, 12 hours, 24 hours, or **No limit**
This prevents timers from running indefinitely if you forget to stop them.
### API Environment
[Section titled “API Environment”](#api-environment)
Shows the current server URL. This can be changed for testing or if directed by your administrator.
### Logging Out
[Section titled “Logging Out”](#logging-out)
Tap **Log Out** to sign out and remove all local data from the device. This clears:
* Authentication tokens
* Cached job data and databases
* Your profile information
Your theme preference, API URL, and timer settings are preserved.
# Arriving on Site and Risk Assessment
> Arriving on Site and Risk Assessment - Vera knowledge base.
## Arriving on Site and Risk Assessment
[Section titled “Arriving on Site and Risk Assessment”](#arriving-on-site-and-risk-assessment)
When you arrive at a job site, Vera records your arrival and ensures you have reviewed any identified risks.
### Starting the Arrival Flow
[Section titled “Starting the Arrival Flow”](#starting-the-arrival-flow)
From the job card, tap **Arrive on Site**, or open the job and use the actions menu.
### Risk Assessment
[Section titled “Risk Assessment”](#risk-assessment)
> **Screenshot:** The Risk Acceptance screen showing the “Identified Risks” section with risk content, and the “Decline” and “Accept & Proceed” buttons at the bottom.
Before confirming arrival, you are shown any risks identified for the job:
* **Identified risks** are displayed with their descriptions
* If no risks have been recorded, a message confirms this
You have two options:
* **Accept & Proceed** — Acknowledges the risks and confirms your arrival
* **Decline** — Returns you to the job detail without arriving
### What Happens on Arrival
[Section titled “What Happens on Arrival”](#what-happens-on-arrival)
When you accept and proceed:
1. The job status changes to **In Progress**
2. The job timer starts automatically
3. A success notification confirms “Arrived on site”
4. The job card updates to show the “On Site” status badge
### Already Arrived
[Section titled “Already Arrived”](#already-arrived)
If you have already arrived on site, the app shows a warning and prevents duplicate arrivals.
# Calendar View
> Calendar View - Vera knowledge base.
## Calendar View
[Section titled “Calendar View”](#calendar-view)
The Calendar tab gives you a month-at-a-glance view of your scheduled work.
### Navigating
[Section titled “Navigating”](#navigating)
* Use **Previous** and **Next** buttons to move between months
* Swipe left or right to navigate months
* The current month and year are shown in the header
### Day Indicators
[Section titled “Day Indicators”](#day-indicators)
> **Screenshot:** The Calendar month view showing the day grid with blue dots under dates that have jobs, an orange circle on dates with leave/unavailability, today highlighted with a blue ring, and the selected date with a blue filled circle.
Each day in the calendar can show:
* **Blue dots** (1-3) — Days with scheduled jobs
* **Orange circle** — Days with leave or unavailability
* **Blue ring** — Today’s date
* **Blue filled circle** — Currently selected date
* **Dimmed dates** — Weekend-blocked dates (if weekends are disabled)
### Viewing a Day
[Section titled “Viewing a Day”](#viewing-a-day)
Tap any date to select it and view the agenda for that day, including scheduled jobs and any blocked time.
# Expenses and Receipt Scanning
> Expenses and Receipt Scanning - Vera knowledge base.
## Expenses and Receipt Scanning
[Section titled “Expenses and Receipt Scanning”](#expenses-and-receipt-scanning)
The Expenses tab lets you track job-related expenses with optional receipt photo scanning.
### Viewing Expenses
[Section titled “Viewing Expenses”](#viewing-expenses)
> **Screenshot:** The Expenses list showing the summary card (total count and amount, this month’s count and amount), and expense cards with category icon, vendor, date, amount, and category badge.
The expenses page shows:
* **Summary** — Total expense count and amount, plus current month figures
* **Expense cards** — Each showing vendor name, date, amount, category badge, and linked job reference
* Expenses marked “Auto-extracted” include a confidence percentage from OCR
### Adding an Expense
[Section titled “Adding an Expense”](#adding-an-expense)
1. Tap the **+** button
2. Optionally capture or select a receipt photo:
* **Take Photo** — Opens the device camera
* **Choose Photo** — Selects from your photo library
3. If a photo is provided, Vera attempts **OCR receipt extraction** to auto-fill fields
4. Fill in or review the expense details:
* **Vendor Name** (required)
* **Date** (required)
* **Total Amount** (required)
* **Tax** (optional)
* **Category** — Food, Fuel, Materials, Other, etc.
* **Payment Method** — e.g., “Company Card”, “Cash”
* **Link to Job** — Select a job to associate the expense with
* **Description** (optional)
5. Tap **Save Expense**
### Receipt OCR
[Section titled “Receipt OCR”](#receipt-ocr)
When you capture or select a receipt photo, Vera automatically extracts:
* Merchant name
* Transaction date
* Total amount and tax
* Payment method
A success message shows the confidence percentage. Always review extracted data before saving.
### Editing and Deleting
[Section titled “Editing and Deleting”](#editing-and-deleting)
Tap any expense to view details. Use the **Edit** (pencil) button to modify or the **Delete** (trash) button to remove it.
# Job Notes and Messages
> Job Notes and Messages - Vera knowledge base.
## Job Notes and Messages
[Section titled “Job Notes and Messages”](#job-notes-and-messages)
Vera’s mobile app lets you add notes to jobs and send messages to your team.
### Adding Notes
[Section titled “Adding Notes”](#adding-notes)
1. Open a job and navigate to the **Notes** tab
2. Tap **Add Note**
3. Type your note in the text area
4. Save the note
Notes display with:
* Author name
* Timestamp
* “System” badge for system-generated notes
* Note text
Notes are visible to all team members with access to the job.
### Job Messages
[Section titled “Job Messages”](#job-messages)
The **Messages** tab on each job shows messages related to that specific job.
* Unread messages are marked with a blue dot
* Messages show sender name, timestamp, and content
* Tap **New Message** to compose
**Composing a Message:**
1. Tap the **New Message** button (pencil icon)
2. Select recipients using the autocomplete search
3. Selected recipients appear as removable chips
4. Type your message in the text area
5. Tap **Send**
### Global Messages
[Section titled “Global Messages”](#global-messages)
The **Messages** tab in the bottom navigation shows all your messages (not just job-specific ones):
* **Inbox** — Received messages with unread count badge
* **Sent** — Messages you have sent
Swipe left on any inbox message to dismiss it. Pull down to refresh.
# Job Photos and Files
> Job Photos and Files - Vera knowledge base.
## Job Photos and Files
[Section titled “Job Photos and Files”](#job-photos-and-files)
The Files tab on each job lets you upload and manage photos and documents.
### Uploading Files
[Section titled “Uploading Files”](#uploading-files)
1. Open a job and navigate to the **Files** tab
2. Tap the **Upload** button
3. Select a photo from your device or take a new one
> **Screenshot:** The Files tab showing a thumbnail grid of uploaded images, the Upload button, and the Edit toggle button.
Files are uploaded to the server and linked to the job. A spinning indicator shows while the upload is processing.
### Viewing Files
[Section titled “Viewing Files”](#viewing-files)
* **Images** display as thumbnail previews in a grid
* **Non-image files** (documents, PDFs) show a generic file icon with the filename below
* Tap any file to view it in full size
### Deleting Files
[Section titled “Deleting Files”](#deleting-files)
1. Tap the **Edit** toggle to enter edit mode
2. Tap the delete button on any file
3. Confirm the deletion
### Requirements
[Section titled “Requirements”](#requirements)
File management requires an active server connection. If the job is not connected, a message prompts you to connect first.
# Linking Your Device
> Linking Your Device - Vera knowledge base.
## Linking Your Device
[Section titled “Linking Your Device”](#linking-your-device)
Before you can use the Vera mobile app, you need to link it to your account. There are two ways to sign in.
### Method 1: Email and Password
[Section titled “Method 1: Email and Password”](#method-1-email-and-password)
1. Open the Vera app
2. Enter your **email address** and **password**
3. Tap **Sign In**
### Method 2: 16-Digit Activation Code
[Section titled “Method 2: 16-Digit Activation Code”](#method-2-16-digit-activation-code)
Your administrator can generate an activation code for your device from the web portal.
> **Screenshot:** The activation code entry screen showing the 4x4 grid of digit input fields and the “Link My Account” button.
1. Open the Vera app
2. Tap **Use activation code** to switch to code entry
3. Enter the 16-digit code in the grid (you can also paste the full code)
4. Tap **Link My Account**
5. A success message confirms your device is linked
### Switching Methods
[Section titled “Switching Methods”](#switching-methods)
You can switch between email/password and activation code sign-in by tapping the link at the bottom of the login screen.
### After Linking
[Section titled “After Linking”](#after-linking)
Once linked, the app downloads your job data and you are taken to the Jobs list. Your login persists until you explicitly log out from Settings.
# Scheduling a Job from Mobile
> Scheduling a Job from Mobile - Vera knowledge base.
## Scheduling a Job from Mobile
[Section titled “Scheduling a Job from Mobile”](#scheduling-a-job-from-mobile)
You can schedule unscheduled jobs directly from the mobile app.
### Opening the Scheduler
[Section titled “Opening the Scheduler”](#opening-the-scheduler)
From the job card, tap the **Schedule** button, or use the three-dot menu and select **Schedule Job**.
### Selecting a Date
[Section titled “Selecting a Date”](#selecting-a-date)
> **Screenshot:** The mobile schedule page showing the date navigator with previous/next arrows, the “Expected Duration” card, and the time slot grid with available and unavailable slots.
Use the **previous** and **next** arrows to navigate between dates. The current date is displayed as “Month Day, Year”.
### Setting Duration
[Section titled “Setting Duration”](#setting-duration)
Tap the **Expected Duration** card to adjust how long the job will take. Use the +/- buttons to set hours and minutes.
### Choosing a Time Slot
[Section titled “Choosing a Time Slot”](#choosing-a-time-slot)
The schedule page shows available time slots based on your organisation’s settings:
* Available slots show the time range and duration
* **Unavailable slots** are greyed out and disabled (due to existing bookings, blocked dates, or outside work hours)
* Tap an available slot to select it (highlighted with an outline)
### Scheduling Rules
[Section titled “Scheduling Rules”](#scheduling-rules)
The app respects your organisation’s scheduling configuration:
* Work hours (earliest and latest times)
* Weekend booking restrictions
* Buffer time between site visits
* Slot size increments
* Existing calendar conflicts
### Confirming
[Section titled “Confirming”](#confirming)
After selecting a time slot, confirm to schedule the job. It will move from “Unscheduled” to “Upcoming” or “Today” in your job list.
# Task Completion and Time Tracking
> Task Completion and Time Tracking - Vera knowledge base.
## Task Completion and Time Tracking
[Section titled “Task Completion and Time Tracking”](#task-completion-and-time-tracking)
The Tasks tab on each job shows all tasks that need to be completed, with options to log time and track progress.
### Simple Task Mode
[Section titled “Simple Task Mode”](#simple-task-mode)
In simple mode, tasks appear as a checklist. Tap a task to mark it complete. Use the **Complete All** button to finish all tasks at once (with confirmation).
### Detailed Task Mode
[Section titled “Detailed Task Mode”](#detailed-task-mode)
> **Screenshot:** The Tasks tab showing an expanded task with the task name, time logged, percentage complete bar, +/- 30min time buttons, +/- 25% progress buttons, and the task timer play/stop button.
In detailed mode, each task shows more information and controls:
**Viewing Tasks:**
* Task name
* Time logged so far
* Percentage complete
**Expanding a Task** (tap to expand):
* **Log Time** — Use the +/- 30 minute buttons to add or remove logged time
* **Percentage Complete** — Use the +/- 25% buttons to update progress
* **Task Timer** — Tap the play button to start a timer for this specific task. Tap stop to pause it.
Use **Expand All** or **Collapse All** to toggle all tasks at once.
### Complete All
[Section titled “Complete All”](#complete-all)
The **Complete All** button marks every task as done. A confirmation dialog appears before applying.
### Permissions
[Section titled “Permissions”](#permissions)
Task completion and time logging require the appropriate permissions. If you cannot edit tasks, contact your administrator.
# The Job Timer
> The Job Timer - Vera knowledge base.
## The Job Timer
[Section titled “The Job Timer”](#the-job-timer)
Vera includes timers at both the job level and individual task level to accurately track time on site.
### Job-Level Timer
[Section titled “Job-Level Timer”](#job-level-timer)
The job timer appears in the Details tab when you are on site:
* Shows **“JOB TIMER”** heading with a red **“RECORDING”** indicator
* Displays elapsed time in **h:mm:ss** format
* Use the play/stop button to control the timer
The job timer starts automatically when you arrive on site and stops when you depart.
### Task-Level Timers
[Section titled “Task-Level Timers”](#task-level-timers)
Each task in detailed mode has its own timer (play/stop button). Use task timers when you want to track time against specific tasks.
### Floating Timer Widget
[Section titled “Floating Timer Widget”](#floating-timer-widget)
> **Screenshot:** The floating timer widget shown at the bottom of the screen during an active timer, displaying the job title, timer type (Job timer or Task timer), elapsed time, red pulsing dot, and stop button.
When any timer is running, a floating widget appears at the bottom of every screen showing:
* Job title
* Timer type (“Job timer” or “Task timer”)
* Elapsed time (h:mm:ss)
* Red pulsing dot indicating active recording
* Stop button
Tap the floating timer to navigate directly to that job.
### Auto-Stop
[Section titled “Auto-Stop”](#auto-stop)
Timers can be configured to automatically stop after a set duration. Configure this in **Settings > Timer Auto-Stop**:
* 1 hour, 2 hours, 4 hours, 8 hours, 12 hours, 24 hours, or no limit
This prevents accidentally leaving a timer running overnight.
# Your Job List
> Your Job List - Vera knowledge base.
## Your Job List
[Section titled “Your Job List”](#your-job-list)
The Jobs tab is your home screen in the Vera mobile app, showing all your assigned work.
### Job Grouping
[Section titled “Job Grouping”](#job-grouping)
> **Screenshot:** The mobile job list showing cards grouped under “Today”, “Unscheduled”, and “Upcoming” section headers, with status badges and visit indicators on each card.
Jobs are organised into four sections:
* **Today** — Jobs scheduled for today, showing the time slot (e.g., “Wed, Mar 13 · 9:30 AM”)
* **Unscheduled** — Jobs assigned to you but not yet scheduled, marked “Awaiting scheduling”
* **Upcoming** — Future scheduled jobs
* **Archived** — Completed or past jobs
### Job Cards
[Section titled “Job Cards”](#job-cards)
Each job card displays:
* Job title and service address
* **Status badge** — Scheduled (blue), On Site (blue), Completed (green), or Unscheduled (grey)
* **Visit sequence** — “Visit 1 of 3” for multi-site jobs
* **Primary action button** — Changes based on job status (Schedule, Arrive on Site, or Leave Site)
* **More actions menu** (three dots) — Additional options
### Search
[Section titled “Search”](#search)
Use the search bar at the top to filter jobs by title, address, customer name, or phone number. Results update as you type.
### Pull to Refresh
[Section titled “Pull to Refresh”](#pull-to-refresh)
Pull down on the job list to manually refresh and sync with the server.
### Blocked Dates
[Section titled “Blocked Dates”](#blocked-dates)
Unavailable dates appear in the Upcoming section as yellow cards with a “Blocked” badge, showing the date range and reason.
# Notifications & Messaging
> Send emails and SMS to customers, manage message templates, and understand real-time notifications.
Send emails and SMS to customers, manage message templates, and understand real-time notifications.
[Activity Panel and Notifications](/kb/notifications-and-messaging/activity-panel-and-notifications)
[Sending Emails from Vera](/kb/notifications-and-messaging/sending-emails-from-pipeline)
[Sending SMS Messages](/kb/notifications-and-messaging/sending-sms-messages)
[Managing Message Templates](/kb/notifications-and-messaging/managing-message-templates)
[Internal Messaging](/kb/notifications-and-messaging/internal-messaging)
# Activity Panel and Notifications
> Activity Panel and Notifications - Vera knowledge base.
## Activity Panel and Notifications
[Section titled “Activity Panel and Notifications”](#activity-panel-and-notifications)
Vera keeps you informed with real-time notifications through the Activity Panel and toast alerts.
### Activity Panel
[Section titled “Activity Panel”](#activity-panel)
> **Screenshot:** The Activity Panel on the right side of the Dashboard showing message cards with avatars, timestamps, and close buttons, plus the New Job and Message buttons at the top.
The Activity Panel appears on the right side of the Dashboard and shows a live feed of events:
* **System messages** — Automated notifications (job started, completed, etc.)
* **User messages** — Communications from team members
* **Status events** — Quotes accepted/rejected, invoices paid, app events
Each message shows:
* Colour-coded avatar (system logo, user initials, or status icon)
* Sender name
* Elapsed time since the event
* Message content
* Close button to dismiss
### Toast Notifications
[Section titled “Toast Notifications”](#toast-notifications)
When important events occur, a toast notification briefly appears at the top centre of the screen:
* **Green** — Success (e.g., “Job updated”, “Invoice sent”)
* **Orange** — Warning (e.g., data conflict detected)
* **Red** — Error (e.g., save failed)
Toasts automatically dismiss after a few seconds with a progress bar animation.
### Real-Time Updates
[Section titled “Real-Time Updates”](#real-time-updates)
Vera uses SignalR for instant updates. When a colleague makes a change — starting a job, updating a schedule, or sending a message — your screen updates automatically without needing to refresh.
# Internal Messaging
> Internal Messaging - Vera knowledge base.
## Internal Messaging
[Section titled “Internal Messaging”](#internal-messaging)
Vera includes an internal messaging system for team communication, available on both web and mobile.
### Sending Messages from the Dashboard
[Section titled “Sending Messages from the Dashboard”](#sending-messages-from-the-dashboard)
The Activity Panel includes a **Message** button for quick messaging:
1. Click **Message** in the Activity Panel
2. Select recipients from the grid (use **Select All** or pick individually)
3. Type your message (up to 1,000 characters)
4. Click **Send**
### Job-Specific Messages
[Section titled “Job-Specific Messages”](#job-specific-messages)
You can also send messages linked to specific jobs from the job’s Communications tab or the mobile app’s Messages tab.
### Mobile Messaging
[Section titled “Mobile Messaging”](#mobile-messaging)
On the mobile app, the **Messages** tab in the bottom navigation shows:
* **Inbox** — Received messages with an unread count badge
* **Sent** — Messages you have sent
Messages are grouped by date with headers like “Today”, “Yesterday”, or the specific date.
**Composing on mobile:**
1. Tap the **New Message** button (pencil icon)
2. Search and select recipients (shown as removable chips)
3. Type your message
4. Tap **Send**
### Unread Indicators
[Section titled “Unread Indicators”](#unread-indicators)
Unread messages are marked with a blue dot. The Messages tab badge shows the total unread count.
### Dismissing Messages
[Section titled “Dismissing Messages”](#dismissing-messages)
On mobile, swipe left on any inbox message to reveal the **Dismiss** button. This removes the message from your inbox view.
# Managing Message Templates
> Managing Message Templates - Vera knowledge base.
## Managing Message Templates
[Section titled “Managing Message Templates”](#managing-message-templates)
Message templates control the content of automated emails and SMS messages sent by Vera. Administrators can customise templates to match your organisation’s communication style.
### Accessing Templates
[Section titled “Accessing Templates”](#accessing-templates)
Navigate to **Settings > Message Templates**.
### Template Types
[Section titled “Template Types”](#template-types)
> **Screenshot:** The Message Templates grid showing the Name column and System column with filled/empty icons indicating system vs custom templates.
The template grid shows:
* **Name** — Template name
* **System** — Filled icon for built-in system templates, empty icon for custom templates
**System templates** are provided with Vera and serve as starting points. **Custom templates** can be created and fully edited.
### Template Structure
[Section titled “Template Structure”](#template-structure)
Each template is composed of parts that are rendered in sequence:
* **Header** — Top section of the message
* **Body** — Main content
* **Footer** — Bottom section
* **Signature** — Closing block
Each part can be toggled on/off using the Active and Visible settings.
### Dynamic Placeholders
[Section titled “Dynamic Placeholders”](#dynamic-placeholders)
Templates support placeholders that are replaced with real data when sent:
* Customer name and contact details
* Job and invoice references
* Amounts and dates
* Links to view documents online
* Links for online payment
### Editing a Template
[Section titled “Editing a Template”](#editing-a-template)
Double-click a template in the grid to open the editor:
1. Use the rich text editor to modify HTML content
2. Insert placeholders from the variable dropdown
3. Preview the rendered output
4. Reorder parts using the sort order field
5. Save your changes
### Where Templates Are Used
[Section titled “Where Templates Are Used”](#where-templates-are-used)
* Invoice and quote emails
* Purchase order emails
* Workflow task actions (automatic emails on task completion)
* SMS notifications
* CRM automation rules
# Sending Emails from Vera
> Sending Emails from Vera - Vera knowledge base.
## Sending Emails from Vera
[Section titled “Sending Emails from Vera”](#sending-emails-from-vera)
Vera can send emails to customers for invoices, quotes, purchase orders, and other documents.
### How Email Sending Works
[Section titled “How Email Sending Works”](#how-email-sending-works)
When you send a document (invoice, quote, or PO), Vera:
1. Generates an HTML version of the document
2. Converts it to a PDF attachment in the background
3. Sends the email via your configured email provider
4. Records the message for tracking
### The Send Modal
[Section titled “The Send Modal”](#the-send-modal)
> **Screenshot:** The Send Modal showing the document preview on the left, and the email configuration panel on the right with the recipient email, rich text editor for the email body, and the Send button.
When sending a document, the Send Modal shows:
* **Document preview** on the left side
* **Email configuration** on the right:
* Customer name and email (pre-filled)
* Rich text editor with the email body
* Pre-populated template with placeholders for customer name, document reference, amounts, and view/pay links
* **Alert on Status Update** checkbox — tick this to be notified when the customer opens or acts on the document
You can customise the email text before sending. Click **Send** to deliver.
### Message Status Tracking
[Section titled “Message Status Tracking”](#message-status-tracking)
Emails are queued and processed in the background:
* **Queued** — Email is waiting to be sent
* **Sending** — Email is being delivered
* **Sent** — Email was delivered successfully
* **Failed** — Delivery failed (will be retried automatically up to 3 times)
### Email Provider
[Section titled “Email Provider”](#email-provider)
Your organisation’s email is sent via a configured provider (such as AWS SES or Resend). Custom sending domains can be set up in **Settings > Email Domains** to send from your own company domain.
# Sending SMS Messages
> Sending SMS Messages - Vera knowledge base.
## Sending SMS Messages
[Section titled “Sending SMS Messages”](#sending-sms-messages)
Vera can send SMS text messages to customers for job reminders and other communications.
### Enabling SMS
[Section titled “Enabling SMS”](#enabling-sms)
SMS sending is controlled by a system setting. If SMS is not available, contact your administrator to enable it.
### Sending an SMS
[Section titled “Sending an SMS”](#sending-an-sms)
> **Screenshot:** The SMS confirmation modal showing the message text preview and the send button options (“Send SMS Only” or “Send SMS and Email”).
When sending an SMS:
1. A confirmation modal shows the message text before sending
2. You can review the message content
3. Choose your send option:
* **Send SMS Only** — Sends just the text message
* **Send SMS and Email** — Sends both an SMS and an email simultaneously (when available)
### SMS Use Cases
[Section titled “SMS Use Cases”](#sms-use-cases)
Common scenarios for SMS:
* **Schedule reminders** — Notify customers of upcoming appointments
* **Job updates** — Inform customers when work is starting or completed
* **General communication** — Send quick messages to customers
### Message Templates
[Section titled “Message Templates”](#message-templates)
SMS messages use pre-configured templates with variable substitution, so customer names, job references, and dates are automatically inserted. Templates are managed in **Settings > Message Templates**.
# Pulse & Analytics
> Admin dashboards, business intelligence, and AI-powered insights.
Admin dashboards, business intelligence, and AI-powered insights.
[Pulse Dashboard Overview](/kb/pulse-and-analytics/pulse-dashboard-overview)
[AI Insights and Chat](/kb/pulse-and-analytics/ai-insights-and-chat)
# AI Insights and Chat
> AI Insights and Chat - Vera knowledge base.
## AI Insights and Chat
[Section titled “AI Insights and Chat”](#ai-insights-and-chat)
Vera’s Pulse module includes AI-powered features that analyse your operational data and provide actionable business intelligence.
### Accessing AI Features
[Section titled “Accessing AI Features”](#accessing-ai-features)
> **Screenshot:** The AI panel slid open from the right side of the Pulse page, showing the three tabs (Chat, Insights, Visualisations). Capture the Chat tab active with a sample conversation and the “Ask about your data…” input field at the bottom.
Click the **sparkle button** in the bottom-right corner of the Pulse page to open the AI panel. The panel slides in from the right and contains three tabs.
### AI Chat
[Section titled “AI Chat”](#ai-chat)
The Chat tab provides an interactive conversation interface where you can ask questions about your business data.
**How to use:**
1. Type your question in the “Ask about your data…” input field
2. Press Enter or click Send
3. The AI analyses your data and responds
**Example questions:**
* “Show me my stock valuation”
* “Which projects are over budget?”
* “What’s my Cost of Business breakdown?”
* “Show me stock valued over $50,000”
* “Give me a business overview”
* “Show me active projects with credit limits”
The AI can query your live operational data to provide current answers. A “Thinking…” indicator shows while processing. Token usage and estimated cost are displayed in the footer.
### AI Insights
[Section titled “AI Insights”](#ai-insights)
The Insights tab generates automated business intelligence.
**Generating Insights:**
1. Select a domain from the dropdown: All Domains, Stock, Projects, or Cost of Business
2. Click **Generate Insights**
3. Insights appear as collapsible cards
**Each insight card shows:**
* **Impact level** - High (red), Medium (orange), or Low (green)
* **Confidence percentage** - How certain the AI is about the finding
* **Category** - What area the insight relates to
* **Description** - Explanation of the finding
* **Recommended Actions** - Suggested next steps (expandable)
* **Related Items** - Top 5 linked records (expandable)
* **Timestamp** - When the insight was generated
### AI Visualisations
[Section titled “AI Visualisations”](#ai-visualisations)
The Visualisations tab creates dynamic charts from your data.
**Supported chart types:**
* Line charts (time series and trends)
* Bar charts (comparisons)
* Pie charts (composition)
* Area charts (trends over time)
* Stacked area charts (multi-series)
Click **Generate Business Overview** to create a default set of charts covering key business metrics. Each chart includes a title, axis labels, and an expandable insights panel.
# Pulse Dashboard Overview
> Pulse Dashboard Overview - Vera knowledge base.
## Pulse Dashboard Overview
[Section titled “Pulse Dashboard Overview”](#pulse-dashboard-overview)
Pulse is Vera’s analytics dashboard, giving administrators a comprehensive view of business performance across all operational areas.
### Accessing Pulse
[Section titled “Accessing Pulse”](#accessing-pulse)
Click **Pulse** in the top navigation bar (Admin access required).
### Dashboard Layout
[Section titled “Dashboard Layout”](#dashboard-layout)
> **Screenshot:** The Pulse dashboard showing the tile layout with COB breakdown, Current Jobs grid, Sales/Quotes section, Cashflow panel, Stock Valuation, and Task Effort Analysis. Show at least three tiles visible with data.
Pulse uses a responsive tile layout with six main sections. Tiles can be dragged to reorder and resized to focus on what matters most.
**Cost of Business (COB)** Displays a breakdown of operational costs with three columns:
* Budgeted amounts
* Actual amounts
* Predicted amounts Individual line items (labour, materials, etc.) with totals. The current period row is highlighted.
**Current Jobs** A detailed grid showing active projects with:
* Customer name and workflow status
* Project reference (clickable to open the job)
* Budgeted, Current, and Predicted costs
* Predicted profit vs quoted cost Sortable and paginated (10 rows per page).
**Sales** Tracks quote and invoice performance:
* Quotes: Issued, Accepted, and Rejected counts across time periods
* Invoices: Period-over-period financial comparison Current period is highlighted for easy comparison.
**Cashflow** Monitors money in and out:
* Purchase order flow and accounts payable
* Invoice receipts and payments
**Back Costing** Tracks cost allocations against projects:
* Links purchase orders to job cost analysis
* Helps identify margin discrepancies
**Stock Valuation** Three valuation perspectives:
* **Purchased rate** - Acquisition cost
* **Replacement value** - Current market cost
* **Sales value** - Marked-up retail price Split between held inventory and allocated inventory.
**Task Effort Analysis** Compares estimated vs actual time on tasks:
* Sample size and default effort
* Average actual time
* Tasks exceeding estimates are highlighted in red
# Scheduling
> Schedule jobs, allocate workers, and manage your team's calendar.
Schedule jobs, allocate workers, and manage your team’s calendar.
[Schedule Overview](/kb/scheduling/schedule-overview)
[Allocating Workers to Jobs](/kb/scheduling/allocating-workers-to-jobs)
[Managing Unallocated Jobs](/kb/scheduling/managing-unallocated-jobs)
# Allocating Workers to Jobs
> Allocating Workers to Jobs - Vera knowledge base.
## Allocating Workers to Jobs
[Section titled “Allocating Workers to Jobs”](#allocating-workers-to-jobs)
Allocating workers to scheduled jobs ensures the right people are assigned to the right work at the right time.
### Drag-and-Drop Allocation
[Section titled “Drag-and-Drop Allocation”](#drag-and-drop-allocation)
The primary way to allocate workers is by dragging scheduled items on the calendar:
1. Click and hold a scheduled item
2. Drag it to the desired date, time, and resource lane
3. Release to drop it
When you drop an item, Vera automatically:
* Validates the proposed time slot
* Checks for resource conflicts (employee availability)
* Verifies required certifications
* Calculates travel time between locations
If there are conflicts, a modal dialog appears showing the issues and letting you confirm or cancel the move.
> **Screenshot:** The conflict resolution modal showing employee availability indicators (green/red/amber), certification checks, and Accept/Cancel buttons.
### Allocation Details Panel
[Section titled “Allocation Details Panel”](#allocation-details-panel)
The allocation panel shows two views:
**By Staff** Lists each employee with their assigned tasks, showing:
* Employee name and reference
* Tasks assigned to them
* Minutes allocated for “This” visit vs “All” visits (cumulative)
* Progress gauges for task completion
**By Task** Lists each task with its employee assignments, showing:
* Task reference with progress gauge (Allocated vs Required)
* Employee names assigned
* Individual time allocations
### Allocation Modes
[Section titled “Allocation Modes”](#allocation-modes)
Choose how time is allocated using the mode buttons:
* **Sequence** - Allocate jobs for consecutive days
* **Date Only** - Allocate for a single date only
* **Single Span** - Allocate total duration across a selected period
### Conflict Resolution
[Section titled “Conflict Resolution”](#conflict-resolution)
When a conflict is detected, the conflict modal shows:
* Which employees are affected
* The nature of the conflict (availability, certifications, travel time)
* Visual indicators (green/red/amber) for each employee’s status
* Options to accept or cancel the allocation
# Managing Unallocated Jobs
> Managing Unallocated Jobs - Vera knowledge base.
## Managing Unallocated Jobs
[Section titled “Managing Unallocated Jobs”](#managing-unallocated-jobs)
Unallocated jobs are scheduled work items that have not yet been assigned to workers. Vera makes it easy to identify and allocate these jobs.
### Finding Unallocated Jobs
[Section titled “Finding Unallocated Jobs”](#finding-unallocated-jobs)
> **Screenshot:** The Schedule toolbar showing the Allocate button with a blue badge displaying the count of unallocated items.
The **Schedule button** in the toolbar shows a badge with the count of unallocated items. Click it to open the unallocated jobs panel.
Each unallocated item shows:
* **Job Reference** - The unique job identifier
* **Customer Name** - Who the work is for
* **Service Address** - Where the work needs to happen
* **Duration** - How long the job is estimated to take
* **Status** - Current scheduling status
### Allocating from the List
[Section titled “Allocating from the List”](#allocating-from-the-list)
You can allocate unallocated jobs in several ways:
**Drag to Schedule** Drag an unallocated item from the list directly onto the schedule calendar. Drop it on the desired date, time, and resource to assign it.
**Allocation Mode** Select an allocation mode before dragging:
* **Sequence** - Fills consecutive days with work
* **Date Only** - Assigns to a single day
* **Single Span** - Spreads the total duration across a period
### Bulk Operations
[Section titled “Bulk Operations”](#bulk-operations)
Select multiple unallocated items to allocate them as a batch. This is useful when scheduling a group of related jobs for the same crew or timeframe.
### Tips
[Section titled “Tips”](#tips)
* Regularly check the unallocated count badge to ensure no jobs are missed
* Use the Timeline view for efficient allocation when planning weeks ahead
* Consider travel time between locations when scheduling consecutive jobs
# Schedule Overview
> Schedule Overview - Vera knowledge base.
## Schedule Overview
[Section titled “Schedule Overview”](#schedule-overview)
The Schedule module is your central hub for planning and managing when and where work happens. It offers multiple views to suit different planning needs.
### Schedule Views
[Section titled “Schedule Views”](#schedule-views)
> **Screenshot:** The Schedule page showing the view toggle buttons (Month, Timeline, Week, Agenda) at the top, with the Week view active displaying scheduled items in hourly time slots across multiple resource lanes.
Switch between views using the buttons at the top of the schedule:
**Month View** A calendar month layout showing all scheduled items. Good for getting a big-picture overview of the month’s workload.
**Timeline View** A horizontal timeline spanning multiple months. Ideal for long-range resource planning and seeing how work is distributed over time.
**Week View** A detailed weekly calendar with hourly time slots. Best for day-to-day scheduling and fine-tuning appointment times. Shows:
* Job reference (clickable)
* Allocated resource/worker
* Job title
* Service address
* Project reference
**Agenda View** A list-based view of upcoming appointments. Useful for quickly seeing what’s coming up, with full details including:
* Reference and status
* Customer name
* Service address
* Duration
* SMS send option
### Scheduled Item Information
[Section titled “Scheduled Item Information”](#scheduled-item-information)
Each scheduled item displays:
* Job/appointment reference (clickable to open the job)
* Customer name
* Start and end times
* Duration
* Service address
* Allocated workers
* Current status
### Navigating the Schedule
[Section titled “Navigating the Schedule”](#navigating-the-schedule)
* Use the **date picker** or **arrow buttons** to move between time periods
* Click a scheduled item to view its details
* Use the **Allocate** button (with badge showing unallocated count) to manage resource allocation
# Settings & Configuration
> System configuration for administrators - workflows, users, teams, and integrations.
System configuration for administrators - workflows, users, teams, and integrations.
[Workflow Configuration](/kb/settings-and-configuration/workflow-configuration)
[Managing Users](/kb/settings-and-configuration/managing-users)
[Teams](/kb/settings-and-configuration/teams)
[Message Templates](/kb/settings-and-configuration/message-templates)
[Email Domain Setup](/kb/settings-and-configuration/email-domain-setup)
# Email Domain Setup
> Email Domain Setup - Vera knowledge base.
## Email Domain Setup
[Section titled “Email Domain Setup”](#email-domain-setup)
Configure a custom email domain so Vera can send emails from your company’s address (e.g., ) rather than a generic sender.
### Why Set Up a Custom Domain?
[Section titled “Why Set Up a Custom Domain?”](#why-set-up-a-custom-domain)
By default, Vera sends emails from a shared system address. Setting up your own domain:
* Makes emails appear more professional and trustworthy to customers
* Reduces the chance of emails being marked as spam
* Allows customers to reply directly to your company
### Accessing Domain Settings
[Section titled “Accessing Domain Settings”](#accessing-domain-settings)
Navigate to **Settings > Email Domains** (Super User access required).
> **Screenshot:** The Email Domains settings page showing the domain name input field, the “Add Domain” button, and a verified domain with its DNS records table and green checkmark status.
### Adding a Domain
[Section titled “Adding a Domain”](#adding-a-domain)
1. Enter your domain name (e.g., yourcompany.com)
2. Click **Add Domain**
3. Vera generates the DNS records you need to add
### Configuring DNS Records
[Section titled “Configuring DNS Records”](#configuring-dns-records)
After adding your domain, Vera displays the required DNS records. You need to add these to your domain’s DNS settings (usually managed by your domain registrar or hosting provider):
* **CNAME records** — For domain verification
* **MX records** — For email routing
* **TXT records** — For sender authentication (SPF/DKIM)
Use the **copy** button next to each record to copy it to your clipboard for easy pasting into your DNS management panel.
### Verifying Your Domain
[Section titled “Verifying Your Domain”](#verifying-your-domain)
After adding the DNS records, click **Verify Domain** to check if they have propagated.
**Domain Status:**
* **Pending** — DNS records have been provided but not yet verified
* **Verified** — Domain is confirmed and emails can be sent (green checkmark)
* **Failed** — Verification failed — double-check your DNS settings
### Tips
[Section titled “Tips”](#tips)
* DNS changes can take up to 48 hours to propagate, though most verify within a few hours
* If verification fails, check for typos in the DNS records and ensure they are set on the correct domain
* You can re-click **Verify Domain** at any time to re-check
* For help with DNS settings, contact your domain registrar’s support team
# Managing Users
> Managing Users - Vera knowledge base.
## Managing Users
[Section titled “Managing Users”](#managing-users)
User management lets administrators create, edit, and control access for everyone in the organisation.
### Accessing User Management
[Section titled “Accessing User Management”](#accessing-user-management)
Navigate to **Settings > Users** (Admin access required).
### User List
[Section titled “User List”](#user-list)
> **Screenshot:** The User Management grid showing columns for Name (with avatar), Email, Phone, Roles (colour-coded pill), Linked Employee (green badge), and Status (green/red dot). Include the search box and New User button.
The user grid displays:
* **Name** - With a colour-coded avatar showing initials
* **Email Address** - The user’s login identifier
* **Phone** - Contact number
* **Roles** - Colour-coded role pill (Super User, Admin, Office, Field)
* **Linked Employee** - Green badge showing linked employee name, or “No employee” if not linked
* **Status** - Green dot for “Active” or red dot for “Inactive” (locked out)
Use the **search box** to filter by name, email, or other fields. Results are paginated with “Showing X of Y users” at the bottom.
### Creating a New User
[Section titled “Creating a New User”](#creating-a-new-user)
1. Select the organisation from the dropdown (required before creating)
2. Click **New User**
3. Fill in the user details:
* First and Last Name
* Email address (used for login)
* Phone number
* Role assignment
* Employee linking (optional)
4. Save to create the account
### Editing a User
[Section titled “Editing a User”](#editing-a-user)
Click any user row to open the edit modal, where you can:
* Update name, email, and phone
* Change role assignment
* Link or unlink an employee record
* **Reset Password** - Send a password reset to the user
* **Lock/Unlock** - Lock a user account to prevent login, or unlock a previously locked account
### User Status
[Section titled “User Status”](#user-status)
* **Active** - User can log in and access Vera
* **Inactive** - User is locked out and cannot log in (lockout end date is in the future)
# Message Templates
> Message Templates - Vera knowledge base.
## Message Templates
[Section titled “Message Templates”](#message-templates)
Message templates define the content used for automated emails, SMS messages, and notifications sent by Vera.
### Accessing Templates
[Section titled “Accessing Templates”](#accessing-templates)
Navigate to **Settings > Message Templates**.
### Template List
[Section titled “Template List”](#template-list)
> **Screenshot:** The Message Templates grid showing the Name and System columns, with a mix of system templates (filled icon) and custom templates (empty icon).
The grid shows all templates with:
* **Name** - Template name/title
* **System** - A filled icon indicates a system template (built-in), an empty icon indicates a custom template
System templates are provided with Vera and serve as reference. Custom templates can be created and edited freely.
### Template Structure
[Section titled “Template Structure”](#template-structure)
Each template is composed of multiple parts:
* **Header** - Top section of the message
* **Body** - Main content area
* **Footer** - Bottom section
* **Signature** - Closing signature block
Each part has:
* HTML content (can include dynamic placeholders)
* Sort order (controls rendering sequence)
* Active/Visible toggles
* System flag (whether it’s a built-in or custom part)
### Dynamic Placeholders
[Section titled “Dynamic Placeholders”](#dynamic-placeholders)
Templates support dynamic placeholders that are replaced with real data when sent. Common placeholders include:
* Customer name and contact details
* Job and invoice references
* Amounts and dates
* Links to view documents online
### Editing Templates
[Section titled “Editing Templates”](#editing-templates)
Double-click a template in the grid to open the editor. Modify the HTML content of any part, reorder parts using sort order, and toggle parts on or off as needed.
### Usage
[Section titled “Usage”](#usage)
Templates are used by:
* Workflow task actions (automatic emails on task completion)
* Invoice sending
* Purchase order sending
* CRM automation rules
# Teams
> Teams - Vera knowledge base.
## Teams
[Section titled “Teams”](#teams)
Teams let you organise your employees into groups for easier scheduling, assignment, and management.
### Accessing Teams
[Section titled “Accessing Teams”](#accessing-teams)
Navigate to **Settings > Teams**.
### Managing Teams
[Section titled “Managing Teams”](#managing-teams)
The team manager allows you to:
**Create a Team:**
1. Click **Add Team**
2. Enter the team name and details
3. Assign team members
4. Save
**Edit a Team:** Click on a team to modify its name, description, or member list.
**Team Assignments:** Add or remove employees from teams. Employees can belong to multiple teams.
### Using Teams
[Section titled “Using Teams”](#using-teams)
Teams are used throughout Vera for:
* **Scheduling** - View and filter the schedule by team
* **Assignment** - Allocate work to teams rather than individuals
* **Reporting** - Group performance metrics by team
* **Access Control** - Some features may be restricted by team membership
# Workflow Configuration
> Workflow Configuration - Vera knowledge base.
## Workflow Configuration
[Section titled “Workflow Configuration”](#workflow-configuration)
Workflows define how jobs progress through your business processes. Administrators can create and configure workflows to match your operational needs.
### Accessing Workflow Settings
[Section titled “Accessing Workflow Settings”](#accessing-workflow-settings)
Navigate to **Settings** and select **Configuration** (Super User access required), or use the dedicated Workflows admin page.
### Workflow Components
[Section titled “Workflow Components”](#workflow-components)
> **Screenshot:** The Workflow configuration page showing the workflow list grid with Name, Last Modified, and Actions columns, and a workflow expanded to show its stages with task rows and action buttons.
Each workflow is made up of:
**Stages** Sequential steps that a job moves through. Stages can be:
* **External** - Visible and actionable by users
* **Internal** - Milestone gates shown in amber (for internal checkpoints)
* **Option** - Conditional stages that may or may not apply
**Tasks within Stages** Each stage contains tasks that need to be completed. Tasks show:
* Completion checkmark (for finished tasks)
* Active/inactive indicator
* Task name and assignee
* Completion date
* Action buttons (if applicable)
**Task Actions** Tasks can trigger automated actions when completed:
* **Email** - Send an email using a template, with optional CC recipients
* **SMS** - Send a text message using a message template
* **Webhook** - Call an external URL with configurable HTTP method, headers, and payload
* **Notification** - Send an in-app notification to specified users with priority levels
### Managing Workflows
[Section titled “Managing Workflows”](#managing-workflows)
**Creating a Workflow:**
1. Click **New Workflow**
2. Enter the workflow name
3. Define stages and their order
4. Add tasks to each stage
5. Configure actions for each task
6. Save and activate
**Editing a Workflow:** Click a workflow in the list, then click **Edit** to modify stages, tasks, and actions.
**Deactivating a Workflow:** Workflows can be deactivated to prevent new jobs from using them, while existing jobs continue on the current workflow.
# Stock & Inventory
> Manage SKUs, track stock levels, allocate materials to jobs, and create stock kits.
Manage SKUs, track stock levels, allocate materials to jobs, and create stock kits.
[Managing SKUs](/kb/stock-and-inventory/managing-skus)
[Stock In and Stock Out](/kb/stock-and-inventory/stock-in-and-stock-out)
[Allocating Stock to Jobs](/kb/stock-and-inventory/allocating-stock-to-jobs)
[Stock Kits](/kb/stock-and-inventory/stock-kits)
# Allocating Stock to Jobs
> Allocating Stock to Jobs - Vera knowledge base.
## Allocating Stock to Jobs
[Section titled “Allocating Stock to Jobs”](#allocating-stock-to-jobs)
Stock allocation links inventory items to specific jobs, ensuring materials are reserved for the work that needs them.
### Allocation Status Flow
[Section titled “Allocation Status Flow”](#allocation-status-flow)
> **Screenshot:** The auto-allocate modal showing the progress bar, allocation line items grouped by supplier and SKU, and the status indicators (Unallocated, Allocated, Completed).
Stock allocations move through three statuses:
1. **Unallocated** - Stock is needed but not yet reserved
2. **Allocated** - Stock has been reserved from inventory
3. **Completed** - Stock has been consumed or delivered
### Manual Allocation
[Section titled “Manual Allocation”](#manual-allocation)
To manually allocate stock to a job:
1. Open the allocation interface for the job
2. The grid shows available stock by location and batch, displaying:
* Location name
* Free balance (available)
* Allocated balance (already committed)
* Total stock
3. Click **Select** on the batch you want to allocate from
4. Enter the quantity to allocate in the popup
5. Confirm the allocation
Allocation details include:
* Job and task reference
* Stock location and bin position
* Serial number (for trackable items)
* Delivery option
* Whether the allocation is chargeable to the customer
### Auto-Allocation
[Section titled “Auto-Allocation”](#auto-allocation)
For faster allocation across multiple items:
1. Open the auto-allocate modal
2. Vera processes all allocation lines automatically:
* Groups items by supplier and SKU
* Attempts to fulfil from available stock
* Handles partial allocations when stock is insufficient
* Creates purchase orders for unmet quantities
3. A progress bar shows processing status
4. Status updates to Allocated for fulfilled items
### Delivery Options
[Section titled “Delivery Options”](#delivery-options)
When allocating, choose how the stock should be delivered:
* **Allocate Materials** - Reserve from existing warehouse stock
* **Direct Delivery** - Order directly to the job site
* **To Warehouse** - Order to warehouse for later dispatch
# Managing SKUs
> Managing SKUs - Vera knowledge base.
## Managing SKUs
[Section titled “Managing SKUs”](#managing-skus)
SKUs (Stock Keeping Units) are the individual products and materials you track in Vera’s inventory system.
### Navigating to Stock
[Section titled “Navigating to Stock”](#navigating-to-stock)
Click **Stock** in the top navigation bar to open the stock management page. Use the search component to find existing SKUs.
> **Screenshot:** The Stock management page showing the SKU search component and a selected SKU with its detail fields (name, pack info, free/allocated quantities) visible.
### SKU Fields
[Section titled “SKU Fields”](#sku-fields)
Each SKU record contains:
**Identification:**
* **SKU Code** - Unique product identifier
* **Name** - Product name
* **UPC** - Universal Product Code (barcode)
* **EAN** - European Article Number
**Physical Characteristics:**
* Height, Width, Depth (dimensions)
* Weight
* Container Type (box, case, pallet, etc.)
* Pieces per pack
**Supplier & Pricing:**
* Primary Supplier and Supplier Code
* Buy price (cost)
* Sell price
* Markup percentage
* Default discount percentage
**Classifications:**
* Unit of Measure (unit, item, or weight)
* Handling Category
* Installation Category
* Stock Rotation (FIFO/LIFO)
**Descriptions:**
* Purchase Description (for supplier orders)
* Sales Description (for customer-facing documents)
* Additional notes
### Creating a New SKU
[Section titled “Creating a New SKU”](#creating-a-new-sku)
1. Click **Add SKU** on the stock page
2. Enter the SKU name
3. Vera checks for duplicates - if it already exists, you will be linked to the existing record
4. Fill in the SKU details in the editor
5. Save your changes
### Editing a SKU
[Section titled “Editing a SKU”](#editing-a-sku)
Click the pencil icon on any field to enter edit mode. Fields validate in real-time with colour-coded error indicators. Save changes when done.
# Stock In and Stock Out
> Stock In and Stock Out - Vera knowledge base.
## Stock In and Stock Out
[Section titled “Stock In and Stock Out”](#stock-in-and-stock-out)
Vera tracks all stock movements as either input (receiving) or output (consumption) transactions.
### Stock In (Receiving Stock)
[Section titled “Stock In (Receiving Stock)”](#stock-in-receiving-stock)
> **Screenshot:** The Stock In form showing the Date, Supplier, Batch Number, Packs, Items, Location, and Sub-location fields.
To record stock received from a supplier:
1. Navigate to the SKU detail page
2. Open the Stock In section
3. Fill in the transaction details:
* **Date** - When the stock was received
* **Supplier** - Which supplier delivered it
* **Batch Number** - Supplier’s batch or lot reference
* **Packs** - Number of packs received
* **Items** - Automatically calculated (Packs x Pack Quantity)
* **Location** - Which warehouse or store location
* **Sub-locations (A-E)** - Bin, shelf, aisle, or other position identifiers
4. Save the transaction
Additional tracking fields are available for:
* Best Before End (BBE) date
* Use By date
* Manufactured date
* Serial number
* Shipment reference and expected date
### Stock Out (Consuming Stock)
[Section titled “Stock Out (Consuming Stock)”](#stock-out-consuming-stock)
To record stock consumption:
1. Navigate to the SKU detail page
2. Open the Stock Out section
3. The grid shows available stock by location with:
* Location name
* Free Balance (available for allocation)
* Allocated Balance (committed to jobs)
* Total Stock on hand
4. Expand a row to see individual batches and sub-locations
5. Click **Select** on the batch you want to use
6. Enter the quantity in the popup
7. Link the output to a specific job if applicable
### Stock Activity History
[Section titled “Stock Activity History”](#stock-activity-history)
All transactions are recorded in the activity history for the SKU, providing a complete audit trail of stock movements.
# Stock Kits
> Stock Kits - Vera knowledge base.
## Stock Kits
[Section titled “Stock Kits”](#stock-kits)
Stock Kits allow you to bundle multiple items together as a package that can be assigned to jobs as a single unit.
### What is a Stock Kit?
[Section titled “What is a Stock Kit?”](#what-is-a-stock-kit)
> **Screenshot:** The Stock Kit manager in Settings showing the kit list grid with Name, Charge Type, Charge Code, and Total columns, and an expanded kit showing its line items.
A kit is a pre-defined collection of items - SKUs, tasks, or assets - that are commonly used together. For example, a “Bathroom Installation Kit” might include pipes, fittings, sealant, and the installation labour task.
### Kit Structure
[Section titled “Kit Structure”](#kit-structure)
Each kit has:
**Kit Header:**
* **Description** - Kit name and title
* **Charge Type** - How the kit is billed (bundled kit charge or specific charge code)
* **Charge Code** - Links to a cost code for billing
* **Summary** - Description or notes about the kit
* **Total** - Total kit cost
* **Buy** - Wholesale cost
**Kit Lines:** Each item in the kit includes:
* **Item Type** - SKU, Task, or Asset
* **Description** - What’s included
* **Quantity** - How many of this item
* **Markup** - Individual line markup percentage
* **Multiplier** - Quantity multiplier
* **Chargeable** - Whether to bill the customer for this line
### Managing Kits
[Section titled “Managing Kits”](#managing-kits)
Navigate to **Settings > Stock Kits** to manage your kits.
The kit manager shows a grid of all kits with:
* Kit name
* Charge type
* Charge code
* Total cost
**Creating a Kit:**
1. Click the **Add** button
2. Enter the kit description and charge settings
3. Use the item selection modal to add SKUs, tasks, or assets
4. Set quantities and markup for each line
5. Save the kit
**Editing a Kit:** Click a kit row to expand it and modify items, quantities, or pricing.
**Searching Kits:** Use the search function to find kits by name.
# Time Tracking
> Log employee hours, manage weekly timesheets, and track time against jobs.
Log employee hours, manage weekly timesheets, and track time against jobs.
[Entering Time](/kb/time-tracking/entering-time)
[Timesheet Status Indicators](/kb/time-tracking/timesheet-status-indicators)
# Entering Time
> Entering Time - Vera knowledge base.
## Entering Time
[Section titled “Entering Time”](#entering-time)
Vera’s Time Tracking module uses a weekly timesheet view where you log hours for each day of the week.
### Accessing Timesheets
[Section titled “Accessing Timesheets”](#accessing-timesheets)
Click **Time Tracking** in the top navigation bar to open the timesheet page.
### Weekly View
[Section titled “Weekly View”](#weekly-view)
> **Screenshot:** The weekly timesheet grid showing employee names in the left column, Monday through Sunday columns with colour-coded status cells (green, amber, red, grey), and the weekly total column on the right.
The timesheet displays as a grid with:
* **Rows** - One per employee
* **Columns** - Monday through Sunday, plus a weekly total
* **Cells** - Each cell shows the hours logged for that employee on that day
### Daily Status Indicators
[Section titled “Daily Status Indicators”](#daily-status-indicators)
Each cell is colour-coded to show the status:
* **Green** - Time has been logged and is complete
* **Amber** - Time has been partially logged
* **Red** - Time is missing or overdue
* **Grey** - No activity expected (e.g., non-working day)
### Logging Time
[Section titled “Logging Time”](#logging-time)
1. Click on any daily cell in the grid
2. The time entry dialog opens
3. Enter the hours and minutes worked
4. Link the time to specific jobs and tasks if applicable
5. Save the entry
Time can be entered as:
* **Task time** - Linked to specific job tasks (TimeOnTasks)
* **Manual entries** - General time entries not linked to a specific task (TimeSheetManualEntries)
### Weekly Totals
[Section titled “Weekly Totals”](#weekly-totals)
The rightmost column shows the total hours and minutes logged for each employee across the week. This gives a quick overview of each person’s workload.
### Searching Employees
[Section titled “Searching Employees”](#searching-employees)
Use the search function to filter the grid to specific employees when managing large teams.
# Timesheet Status Indicators
> Timesheet Status Indicators - Vera knowledge base.
## Timesheet Status Indicators
[Section titled “Timesheet Status Indicators”](#timesheet-status-indicators)
Time Tracking uses visual indicators to quickly communicate the state of each employee’s timesheet entries.
### Daily Cell Status
[Section titled “Daily Cell Status”](#daily-cell-status)
Each cell in the weekly timesheet grid shows a colour-coded status:
| Colour | Meaning |
| --------- | ----------------------------------------------------------------- |
| **Green** | Time fully logged for the day |
| **Amber** | Partial time entry (some hours logged but potentially incomplete) |
| **Red** | Time is due but has not been logged |
| **Grey** | No time expected (non-working day, leave, etc.) |
The status is rendered as an HTML badge within each cell, making it easy to scan across the entire week at a glance.
### Reading the Grid
[Section titled “Reading the Grid”](#reading-the-grid)
* **Scan horizontally** to see an individual employee’s week
* **Scan vertically** to see the team’s status for a particular day
* Look for **red cells** to quickly identify missing timesheet entries
### Weekly Total Column
[Section titled “Weekly Total Column”](#weekly-total-column)
The total column aggregates all daily entries into a single hours/minutes figure. Compare this against expected hours to identify under- or over-reporting.
### Approval and Lock Status
[Section titled “Approval and Lock Status”](#approval-and-lock-status)
Timesheets may have approval and lock statuses:
* **Locked** entries cannot be modified (typically after manager approval)
* **Unlocked** entries can still be edited
If you need to change a locked entry, contact your manager or administrator to unlock it first.
### Tips
[Section titled “Tips”](#tips)
* Log your time daily to maintain accuracy
* Review your weekly totals before the end of the week
* Ensure time is linked to the correct jobs and tasks for accurate project costing
# Xero Integration
> Connect Vera to Xero for automatic invoice, customer, and payment synchronisation.
Connect Vera to Xero for automatic invoice, customer, and payment synchronisation.
[Connecting Vera to Xero](/kb/xero-integration/connecting-pipeline-to-xero)
[Invoice Synchronisation with Xero](/kb/xero-integration/invoice-synchronisation-with-xero)
[Customer and Contact Sync](/kb/xero-integration/customer-and-contact-sync)
[Payment Tracking from Xero](/kb/xero-integration/payment-tracking-from-xero)
[Troubleshooting Xero Connection Issues](/kb/xero-integration/troubleshooting-xero-connection-issues)
# Connecting Vera to Xero
> Connecting Vera to Xero - Vera knowledge base.
## Connecting Vera to Xero
[Section titled “Connecting Vera to Xero”](#connecting-vera-to-xero)
Vera integrates with Xero accounting software to automatically sync invoices, customers, and payment data. This guide covers how to set up and manage the connection.
### Before You Start
[Section titled “Before You Start”](#before-you-start)
You will need:
* A Xero account with access to the organisation you want to connect
* Super User access in Vera (the Accounting settings page is restricted to Super Users)
### Setting Up the Connection
[Section titled “Setting Up the Connection”](#setting-up-the-connection)
> **Screenshot:** The Accounting settings page showing the Xero card in its “Not Connected” state, with the Xero logo, feature list, and the blue “Connect to Xero” button.
1. Navigate to **Settings > Accounting**
2. Find the **Xero** integration card — it shows “Not Connected” if no connection exists
3. Click **Connect to Xero**
4. You will be redirected to Xero’s login page
5. Sign in to your Xero account
6. Grant Vera the requested permissions:
* Access to invoices and transactions
* Read access to contacts
* Offline access (for background sync)
7. After granting access, you are redirected back to Vera
8. A success notification confirms the connection
### Connected State
[Section titled “Connected State”](#connected-state)
Once connected, the Xero card shows:
* **Status** — “Connected” (green badge)
* **Organisation** — The name of your connected Xero organisation
* **Connected Date** — When the connection was established
> **Screenshot:** The Xero integration card in its “Connected” state showing the organisation name, connected date, and Disconnect button.
### Token Refresh
[Section titled “Token Refresh”](#token-refresh)
The connection uses secure tokens that expire periodically. Vera handles this automatically in the background. If a manual refresh is needed:
* A yellow warning appears: “Token Refresh Required — Your access token is expiring soon”
* Click the **Refresh Token** button to renew the connection
* If the token has already expired, the status shows “TOKEN\_EXPIRED” and you may need to reconnect
### Disconnecting from Xero
[Section titled “Disconnecting from Xero”](#disconnecting-from-xero)
1. Navigate to **Settings > Accounting**
2. Click **Disconnect** on the Xero card
3. Confirm the disconnection in the dialog
Disconnecting does not delete any previously synced data — it only stops future synchronisation.
# Customer and Contact Sync
> Customer and Contact Sync - Vera knowledge base.
## Customer and Contact Sync
[Section titled “Customer and Contact Sync”](#customer-and-contact-sync)
Vera synchronises customer records with Xero contacts so your accounting and job management systems share the same customer data.
### What Gets Synced
[Section titled “What Gets Synced”](#what-gets-synced)
The following customer fields are synchronised:
* Company name / display name
* Email address
* Phone number
* Website
* City and postal address
* Customer reference (stored as Xero’s Account Number)
### Sync Direction
[Section titled “Sync Direction”](#sync-direction)
**Vera to Xero:** When you create or update a customer in Vera, the corresponding Xero contact is automatically created or updated. Vera’s customer reference is stored in Xero’s “Account Number” field for matching.
**Xero to Vera:** When a contact is updated in Xero, Vera receives a webhook notification and refreshes the local record.
### Creating Xero Contacts from Admin
[Section titled “Creating Xero Contacts from Admin”](#creating-xero-contacts-from-admin)
Administrators can create new Xero contacts directly from the Vera admin panel:
> **Screenshot:** The “Create Xero Contact” modal showing fields for Company Name, First Name, Last Name, Email, Phone, Website, City, and Postal Address, with the “Create in Xero & Link” button.
1. Open the contact creation modal
2. Fill in the required fields (Company Name is required)
3. Click **Create in Xero & Link**
4. The contact is created in Xero and linked to the Vera record
### Limitations
[Section titled “Limitations”](#limitations)
* Contact management is primarily driven from Vera
* Deleting a contact in Vera archives it in Xero (Xero does not support true contact deletion)
* Contacts are matched using the Xero Contact ID — once linked, the relationship is maintained automatically
# Invoice Synchronisation with Xero
> Invoice Synchronisation with Xero - Vera knowledge base.
## Invoice Synchronisation with Xero
[Section titled “Invoice Synchronisation with Xero”](#invoice-synchronisation-with-xero)
When Vera is connected to Xero, invoices are automatically synchronised so your accounting records stay up to date.
### What Gets Synced
[Section titled “What Gets Synced”](#what-gets-synced)
The following invoice data is sent from Vera to Xero:
* Invoice number and reference
* Customer/contact details
* Invoice date and due date
* All line items (description, quantity, unit amount, tax, account code)
* Currency code
* Invoice status (Draft, Submitted, Paid)
### How Sync Works
[Section titled “How Sync Works”](#how-sync-works)
**Vera to Xero (automatic):**
* When you create an invoice in Vera, it is automatically created in Xero
* When you update an invoice, the changes sync to Xero
* When you delete an invoice, it is voided in Xero (Xero does not allow true deletion)
**Xero to Vera (via webhooks):**
* When an invoice is updated in Xero (e.g., marked as paid), Vera receives a notification
* Payment data is automatically fetched and displayed in Vera
* Status changes in Xero are reflected in Vera
> **Screenshot:** An invoice detail page showing the sync status with Xero, with payment information that has been synced back from Xero.
### Important Notes
[Section titled “Important Notes”](#important-notes)
* **Invoices created directly in Xero are not synced to Vera** — the sync is initiated from Vera
* Sync happens in the background via a job queue, so there may be a short delay
* All dates are handled in UTC to prevent timezone conversion issues
### Out-of-Sync Detection
[Section titled “Out-of-Sync Detection”](#out-of-sync-detection)
If an invoice is modified in both Vera and Xero, the system detects the conflict and marks the invoice as **out of sync**. This happens when:
* The gross total, net total, or tax amount differs
* The invoice date or due date was changed in Xero
* The number of line items differs
When out of sync, further automatic syncing is paused to prevent data loss. You will need to review and resolve the discrepancy manually.
# Payment Tracking from Xero
> Payment Tracking from Xero - Vera knowledge base.
## Payment Tracking from Xero
[Section titled “Payment Tracking from Xero”](#payment-tracking-from-xero)
When customers pay invoices through Xero, the payment information is automatically synced back to Vera.
### How Payment Sync Works
[Section titled “How Payment Sync Works”](#how-payment-sync-works)
1. A payment is recorded against an invoice in Xero
2. Xero sends a webhook notification to Vera
3. Vera fetches the full payment details from Xero’s API
4. Payment data is stored against the corresponding Vera invoice
5. The invoice status updates to reflect the payment (e.g., marked as Paid)
### What Payment Data is Shown
[Section titled “What Payment Data is Shown”](#what-payment-data-is-shown)
For each payment synced from Xero, Vera displays:
* **Payment Amount** — How much was paid
* **Payment Date** — When the payment was received
* **Payment Status** — The current status (e.g., Authorised)
Payments appear in the invoice detail view under the payments section.
### Deleted Payments
[Section titled “Deleted Payments”](#deleted-payments)
If a payment is deleted or reversed in Xero, Vera detects this during the next sync and updates the local records accordingly.
### Automatic Processing
[Section titled “Automatic Processing”](#automatic-processing)
Payment sync is fully automatic — there are no manual steps required. The system processes payments in the background, so there may be a brief delay between a payment being recorded in Xero and appearing in Vera.
### Viewing Payments
[Section titled “Viewing Payments”](#viewing-payments)
To see payment data for an invoice:
1. Open the invoice from the **Sales** page
2. Click the green **Total Paid** amount to view the payment breakdown
3. Individual payments from Xero are listed with their amounts and dates
# Troubleshooting Xero Connection Issues
> Troubleshooting Xero Connection Issues - Vera knowledge base.
## Troubleshooting Xero Connection Issues
[Section titled “Troubleshooting Xero Connection Issues”](#troubleshooting-xero-connection-issues)
If you experience problems with the Xero integration, this guide covers common issues and how to resolve them.
### Connection Fails During Setup
[Section titled “Connection Fails During Setup”](#connection-fails-during-setup)
**Problem:** Clicking “Connect to Xero” redirects to Xero but the connection does not complete.
**Solutions:**
* Ensure you are signing into the correct Xero account
* Check that you are granting all requested permissions
* Try clearing your browser cookies and attempting the connection again
* Ensure pop-up blockers are not interfering with the redirect
### Token Expired
[Section titled “Token Expired”](#token-expired)
**Problem:** The Xero card shows “TOKEN\_EXPIRED” status.
**Solutions:**
* Click **Refresh Token** if the button is available
* If refresh fails, click **Disconnect** and then reconnect with **Connect to Xero**
* Token expiry is usually handled automatically — if it keeps expiring, check your Xero app permissions
### Invoice Not Syncing
[Section titled “Invoice Not Syncing”](#invoice-not-syncing)
**Problem:** An invoice was created in Vera but does not appear in Xero.
**Solutions:**
* Check the connection status is “Connected” (not expired or disconnected)
* Sync operates in the background — wait a few minutes and check again
* Ensure the customer linked to the invoice has a valid Xero contact mapping
* If the customer does not exist in Xero, the invoice sync will fail. Create the customer first.
### Out of Sync Invoice
[Section titled “Out of Sync Invoice”](#out-of-sync-invoice)
**Problem:** An invoice shows as out of sync between Vera and Xero.
**Cause:** The invoice was modified in both systems. Vera blocks further sync to prevent data loss.
**Solutions:**
* Review the differences between the Vera and Xero versions
* Make corrections in one system to align with the other
* The sync will resume once the data is consistent
### Payments Not Appearing
[Section titled “Payments Not Appearing”](#payments-not-appearing)
**Problem:** A payment was recorded in Xero but is not showing in Vera.
**Solutions:**
* Webhook notifications may take a few minutes to process
* Check the connection status is active
* If the issue persists, the webhook may have failed — contact your administrator
### General Tips
[Section titled “General Tips”](#general-tips)
* Always manage invoices and customers from Vera, not directly in Xero
* Keep the connection active — disconnecting stops all synchronisation
* If you need to make changes directly in Xero, be aware of out-of-sync detection
* Contact your system administrator if connection issues persist