Approvers get a daily reminder. Requests still waiting after the escalation period move to the escalation contact. Set 0 to turn either off.
Remind after (working days)
Escalate after (working days)
Escalate to
Define who approves each request type, in order. Steps run as a chain — a request moves to the next approver once the previous one approves. Set a company default, or override per employee.
Policy for
Currently following the company default.
{{ row.typeLabel }}
{{ s.stepNo }}. {{ s.name }}
{{ row.autoNote }}
People
Only administrators can access this page. Edit any user's role, department, leave balances and feature access, reset passwords, or disable accounts.
{{ u.initials }}
{{ u.name }}
{{ u.email }}
{{ u.roleLabel }}{{ u.srcLabel }}
{{ u.dept }}
{{ u.balText }} · {{ u.featText }}
{{ u.statusLabel }}
⊞
Microsoft Entra ID
VerifiedNot verified
Cloud directory for user import and Microsoft Teams meeting links. Uses an app registration in your Microsoft 365 tenant. Last import: {{ adLastSync }}.
Tenant domain
Directory (tenant) ID
Application (client) ID
Client secret value
{{ adVerifyMsgText }}
⛁
LDAP sign-in · on-premises Active Directory
Enabled · {{ ldUserCount }} LDAP usersDisabled
Users sign in with their domain credentials, validated against your domain controller. Each user is either Local (password stored in this system) or LDAP (password checked by Active Directory) — set this per user in User management.
Server URL
Port
Base DN
NetBIOS domain
Bind DN (service account)
Bind password
User search filter
{{ ldSslCheck }}Use LDAPS (TLS, port 636)
{{ ldJitCheck }}Auto-create the user on first domain sign-in
{{ ldMsgText }}
▦
Microsoft Teams
ActiveNeeds Entra IDOff
Every 1:1 meeting request gets a Teams join link. The meeting is created in the requester's Microsoft 365 calendar; if their account is not in the tenant, the default organizer below is used.
Default organizer (Microsoft 365 account)
One-time setup in Microsoft 365
1. App registration → API permissions → Application → OnlineMeetings.ReadWrite.All → Grant admin consent.
Recommended for Microsoft 365. Sends verification codes and notifications through Microsoft Graph with the Entra ID app above, so no mailbox password or SMTP AUTH is needed.
Sender mailbox
One-time setup: App registration → API permissions → Microsoft Graph → Application → Mail.Send → Grant admin consent. The sender must be a mailbox in your tenant (a shared mailbox works).
{{ msMailMsgText }}
{{ msMailTestText }}
G
Google (Gmail / Workspace)
Sending emailNot used
Send all notification emails and two-factor sign-in codes through a Google account. Requires 2-Step Verification on that account and an app password (myaccount.google.com → Security → App passwords).
Google account (sender)
App password (16 characters)
{{ gMsgText }}
{{ gTestText }}
@
Email server (SMTP) · any provider
In use
Outgoing mail server used for every notification and two-factor code. Pick your email provider to fill in the server settings, or choose Other to enter any SMTP server. Microsoft 365 and Google can also be connected with the cards above.
Email provider
{{ smtpPresetHint }}
Host
Port
Security
From address
Username
Password
{{ smtpMsgText }}
✦
Claude assistant
OnOff
An AI assistant inside the workspace that answers questions about the pipeline, projects and requests, summarises analytics and drafts text. It only sees what the user is allowed to see, and asks before creating anything.
Anthropic API key
Model
Who can use it
The system administrator always can. Tick the groups that should also have it.
No groups yet. Create one on the Groups page.
{{ aiEnabledCheck }}Assistant turned on
{{ aiMsgText }}
G
GoDaddy domains & DNS
ConnectedNot set up
Manage your GoDaddy domains from here: DNS records, nameservers, auto-renew, domain lock and renewals. GoDaddy does not let other apps sign in with your account password, so connect once with an API key: sign in to GoDaddy on the key page, create a Production key and paste both values below. GoDaddy only opens its Domains API to accounts with 10+ domains or a Domain Pro plan.
Define which email is sent for each event, who receives it, and the exact wording. Use the variables when editing a rule to insert live details. The sending account (SMTP, Microsoft 365 or Google) is set up in Integrations.
No rules yet. Add one to start sending notification emails.
Licences, registrations and contracts. Every view, upload and change is recorded, and administrators are reminded 1 month, 1 week and on the day before a paper expires.
⚿
This area is locked
{{ papersUnlockHint }}
🔓 Unlocked — locks automatically after 10 minutes of the session
Grant a set of administration permissions and extra feature views to several people at once, and route notifications to the group's email addresses.
No groups yet. Create one to delegate administration.
{{ g.initials }}
{{ g.name }}
{{ g.memberText }} · {{ g.emailText }}
{{ g.privText }}
{{ g.featText }}
Activity log
Every action taken in the system, and every sign-in attempt.
Search
User
Action
Keep fordays
{{ lgCount }}
Nothing recorded for these filters yet.
Date
User
Action
Details
{{ r.when }}
{{ r.by }}
{{ r.action }}
{{ r.detail }}
Date
User
Result
IP address
Device
{{ r.when }}
{{ r.name }}
{{ r.result }}
{{ r.ip }}
{{ r.device }}
Active Directory connected · {{ orgDomain }}Last sync {{ adLastSync }}Active Directory not connected
{{ u.initials }}
{{ u.name }}
{{ u.title }}
AD
✉ {{ u.email }}
{{ u.roleLabel }}{{ u.dept }}
{{ u.balanceText }}
No one matches "{{ chatSearch }}".
{{ chatPartnerInitials }}
{{ chatPartnerName }}
{{ chatPartnerTitle }}
{{ m.text }}
{{ m.time }}
No messages yet — say hello 👋
Select a colleague on the left to start chatting.
Product license
{{ licPhaseLabel }}
{{ lr.k }}{{ lr.v }}
{{ licReason }}
Licensed by Sahl-ERP · Check status or renew on the server: sudo /opt/techvera/bin/license.sh status
◐
Company branding
Name, logo and colour shown on the sign-in page, the sidebar, the installed phone app and everywhere else. Colour changes preview immediately; press Save to apply them for everyone.
Company name
Tagline under the name
Full legal name (footer)
Colours from your logo
Upload a logo to pick colours from it.
▦
Page theme
{{ brThemeName }}
Colours for the whole workspace: page background, cards, sidebar, top bar, text and buttons. Pick a theme, then fine-tune any colour below. Changes preview immediately.
Customise colours
Leave a colour on Auto to follow the theme.
{{ c.label }}
{{ c.value }}
▤
Document design
Applies to quotations, purchase orders, invoices and credit notes. Every document carries the company logo; the accent colour can follow the theme or a colour from the logo.
Header layout
Logo size
Accent colour
Footer text
Signature and stamp block
QUOTATION
عرض سعر · QT-0042
⚿
Two-factor sign-in
Required for everyoneOptional
After the password, users confirm with a 6-digit code: from Microsoft Authenticator or Google Authenticator if they set one up in My profile, otherwise by email (sent through Google or your SMTP server). Users with an authenticator app always get the second step, even when this is optional.
Locked out? On the server run: sudo -u techvera TECHVERA_CONF=/etc/techvera/techvera.conf python3 /opt/techvera/app/server.py disable-mfa
⛨
Security assessment
Running…
Checks this server for security issues: default passwords and two-factor, HTTPS and certificate, security headers, access control and file exposure, sign-in rate limiting, open ports, database exposure, SELinux, firewall and pending security updates. Optionally adds an OWASP ZAP web scan. The PDF report is emailed to the addresses below.
Send the report to
{{ e.addr }}
{{ ptZapCheck }}Include OWASP ZAP web scan{{ ptZapNote }}
{{ ptZapHelp }}
Recent assessments
{{ r.when }}{{ r.rating }}{{ r.counts }}Download PDF
{{ r.meta }}
⟲
Factory reset
Deletes every user, request, deal, file, document, message, notification and setting, then recreates the single administrator account (admin / admin). A full backup is saved on the server first, under /var/lib/techvera/reset-backups.
🗎
Company papers access
Opening the company papers always needs the user's password. Turn this on to also require an authenticator code, even for users who don't otherwise use two-factor sign-in.
{{ papersTotpCheck }}Require an authenticator code to open company papers
{{ pfInitials }}
{{ pfName }}
{{ pfTitle }} · {{ pfDept }} · {{ pfEmail }}
Identity
Iqama number
{{ pfIqamaNo }}
Iqama expiry
{{ pfIqamaExp }}{{ pfIqamaBadge }}
Passport number
{{ pfPassNo }}
Passport expiry
{{ pfPassExp }}{{ pfPassBadge }}
⚿
Authenticator app
OnOff
Ask for a 6-digit code from Microsoft Authenticator or Google Authenticator every time you sign in.
Moves the year's income and expense to retained earnings and locks all 12 months.
{{ p.label }}{{ p.status }}
Management
Figures in {{ exBase }} from the ledger, open invoices and bills, the pipeline and timesheets.
Updated {{ exUpdated }}
{{ k.label }}
{{ k.value }}
{{ k.sub }}
Revenue and expense by month
Posted to the ledger · net result above each month
Revenue {{ exRev12 }}Expense {{ exExp12 }}
Nothing posted to the ledger yet.
{{ m.net }}
{{ y.v }}
{{ m.label }}
Cash forecast · next 12 weeks
Starting cash plus invoices due, minus bills and payroll. Overdue items fall in week 1.
Week 12
{{ exFcEnd }}
Low point {{ exFcLow }}
No cash movements to forecast yet.
{{ w.label }}
Pipeline by stage
Value in each stage
Win rate
{{ exWin }}
{{ f.stage }}
{{ f.count }}
{{ f.value }}
Receivables ageing
Open invoice balances by days overdue
Outstanding
{{ exAgeTotal }}
No open invoices.
{{ r.label }}{{ r.n }}{{ r.value }}{{ r.pct }}
Utilisation · last 4 weeks
160 h = 100% · marker shows full capacity
No timesheets in the last 4 weeks.
{{ u.name }}
{{ u.pct }}{{ u.tone }}
Top projects by value
Won projects · price, booked cost and margin
No won projects yet.
Project
Price
Cost
Margin
{{ p.name }}
{{ p.client }}
{{ p.priceT }}
{{ p.cost }}
{{ p.margin }}
Migration & Sync
Move data in or out of other ERPs, or keep them in sync both ways.
{{ k.l }}{{ k.v }}{{ k.s }}
No connections yet
Connect another ERP to import its data, export your data to it, or keep both systems in sync. Every run starts with a test run, so nothing is written until you confirm.
{{ mgConflictCount }} records changed in both systemsSync for these records is paused until you choose which value to keep.
{{ c.rec }}{{ c.src }}
{{ c.f }}
SourceMethodDirectionLast runRecordsStatus
Data{{ r.ents }}
Schedule{{ r.sched }} {{ r.nextRun }}
LogNo runs yet.
{{ l.t }}{{ l.m }}
Supported systems
{{ p }}
{{ mgTitle }}{{ mgProvName }}
{{ st.n }}{{ st.l }}
Which system are you connecting?
How to connect
Direction
Data to include
When a record changes in both systems
Sync schedule
{{ mgNote }}
{{ f.label }}
{{ mgTestMsg }}
{{ mgFileHint }} You can upload only the files you have and add the rest later.
{{ u.l }}{{ u.info }}
Nothing to connect. You will download one file per data type, laid out for {{ mgProvName }}'s import tools.
{{ mgExportNote }}
Columns were matched automatically. Check each one, and pick from the drop-down to change it. Fields marked * are required.
No columns found for this data type. Upload a file or fetch a sample first.
{{ m.label }} *←
{{ mgMissing }}
{{ mgExportNote }}
A test run reads everything and checks it against your data without saving anything.
DataNewUpdateSkipErrors
{{ x.l }}{{ x.nw }}{{ x.up }}{{ x.sk }}{{ x.er }}
{{ z.t }}
{{ mgErr }}
Data import
Download a template, fill it in Excel and upload it. Existing clients, suppliers and employees are matched by name or email and updated.
{{ c.title }}
{{ c.sub }}
{{ c.result }}
{{ e }}
Recurring invoices
Created automatically on the next date (as drafts, or issued if you choose).
No recurring invoices.
{{ r.client }}
{{ r.every }}
{{ r.next }}
{{ r.total }}
{{ r.status }}
Approval rules by amount and department
The first matching rule replaces the normal chain. Amounts are in {{ acBase }}. Purchase orders without a matching rule go to Finance.
No rules. Example: purchase orders over 50,000 → Finance manager → CEO.
Applies to
From amount
Up to (blank = no limit)
Department (optional)
Approvers in order:{{ c.n }}
Phone and browser notifications
{{ pushText }}
Excel workbooks
Formatted .xlsx files with a title, frozen header, filters, number formats and totals.
No notifications yet.
{{ n.text }}
{{ n.time }}
New request
Request type
From
To
{{ rqDaysText }}
Half day
Meet with
You are not in a group with anyone yet. Ask an administrator to add you to a group.
Date
Time
Amount
Project (optional)
Start date
Estimated end date
Actual end date
Project
Freelancer
Who worked the overtime
{{ rqEffortLabel }}
Hourly rate ({{ rqHourlyCur }})
{{ rqCostPreview }}
There are no won projects yet. Claims must be booked to a won project.
Equipment needed
Reason / notes
Approval chain: {{ rqChainPreview }}
{{ rqError }}
{{ rmTitle }}
Rule name
When this happens
Send to
…or specific people
…or groups (their members and the group's notification emails)
{{ umActiveCheck }}Account activeDisabled users cannot sign in
{{ umMsg }}
{{ umError }}
Turn on two-factor sign-in
Freelance accounts must use Microsoft Authenticator. After this, every sign-in asks for a 6-digit code from the app.
1. Install Microsoft Authenticator on your phone. Tap + → Other account (Google, Facebook, etc.) → Or enter code manually. Account name: {{ brandName }}. Secret key:
Connect to your Active Directory (on-premises via LDAP when LDAP sign-in is enabled, otherwise Microsoft Entra ID) to import employees instead of managing local users.
Tenant domain
Directory scope
{{ adFoundText }}
Everyone in the directory is already imported — you're fully in sync. ✓