Vetria is management software for veterinary clinics, ready to operate as SaaS: many clinics in a single installation, each isolated in the database with Row-Level Security from PostgreSQL. It is not a UI kit: scheduling, clinical records, prescriptions, payments, cash management, inventory, hospitalization, guardian portal, and reports work end-to-end, with documented REST API, demo data, and automated tests.
Language: interface 100% in Spanish (Mexico)
The interface, emails, PDFs, and validation messages are only in Spanish, with formats from Mexico (es-MX, default currency MXN, VAT 16%, CFDI). It does not include an internationalization (i18n) system or translations. Code identifiers are in English; comments and documentation are in Spanish. If you read this translated announcement, the product is not.
Who it is for
- Agencies and freelancers selling software to veterinary clinics in Mexico and Latin America.
- Entrepreneurs looking to launch their own subscription-based veterinary SaaS.
- Teams seeking a multi-tenant base in TypeScript for health or services.
Functionality
Scheduling
- Appointment list and calendar with drag and drop; overlap detection by veterinarian.
- Available hours by veterinarian according to the clinic's schedule and time zone.
- Recurring appointments (weekly, biweekly, or monthly, from 2 to 12): created as individual appointments, and the series stops at the first overlap.
- Waiting list with suggestions when a slot opens and confirmation of attendance via link.
Clinical Records
- Patients with photo and multiple patients per guardian; logical archiving that preserves history and payments.
- Clinical notes in Markdown with version history.
- Vital signs with weight graph and attachments (images with WebP thumbnail).
- Vaccines and deworming: upcoming boosters, expirations, and vaccination card in PDF.
Prescriptions and Documents
- Prescription in PDF with digitized signature and professional license of the veterinarian.
- Receipts, vaccination card, cash report, and hospitalization sheet in PDF.
Payments and Cash Management
- Total or partial payments per appointment, with sequential folio by clinic.
- Cash management with opening, closing, and reconciliation (expected vs. counted).
- Simulated CFDI invoices: XML and PDF test files without fiscal validity, with the interface ready to connect to a real PAC.
Inventory
- Catalog of services and products, stock with minimum and movement records.
- Automatic stock deduction upon completing or charging the appointment, with return if reversed.
Hospitalization
- Cages and areas, admissions, follow-up notes by shift (morning, afternoon, night), and discharge.
Guardian Portal
- Passwordless access via magic link: appointments, vaccination card, prescriptions, receipts, and appointment requests.
- Request tray for staff to accept or reject.
Reminders
- Automatic appointment reminders via email, SMS, or WhatsApp (Twilio), with a link to confirm or cancel.
- Daily email alerts for upcoming vaccine boosters and deworming expirations.
- Log of each send with its status.
Reports and Export
- Dashboard and reports with graphs by date, veterinarian, and payment method.
- Export to CSV and Excel (.xlsx); consultable and exportable audit log.
Multi-Clinic and Branches
- Clinic registration, team invitations, and roles: owner, administrator, veterinarian, and reception.
- Branches with their own time zone; subscription plans with limits (Stripe or simulated mode).
- Global search with ⌘K / Ctrl+K, installable PWA, and dark mode by default.
Security
- RLS in PostgreSQL: the API uses a role without bypass, so a query cannot leave its clinic.
- JWT with rotating refresh tokens in httpOnly cookies, Argon2, email verification, and password recovery.
- Rate limiting by IP and by clinic, CSP and security headers, logs with requestId, optional Sentry.
Technical Stack
CapaTecnologíaMonorepo npm workspaces + Turborepo, strict TypeScript Web Next.js 15 (App Router), React 19, Tailwind CSS v4, Radix UI, FullCalendar, Recharts API NestJS 11 over Fastify, Zod, OpenAPI/Swagger (more than 180 operations) Data PostgreSQL 16, Drizzle ORM, versioned migrations, RLS Jobs Redis 7 + BullMQ (emails, reminders, backups), separable worker Files S3 compatible storage (MinIO locally) Quality Vitest, Playwright, ESLint, GitHub Actions
What it includes
- Complete source code: web, API, worker, database schema, migrations, and seed with 2 demo clinics.
- Docker Compose for development, multi-stage Dockerfiles, and CI and release workflows (images to GHCR).
- 45 E2E tests with Playwright and unit tests with Vitest.
- README and guides in Spanish: getting started, deployment, security, backups, and rebranding.
- THIRD_PARTY_NOTICES.md and CHANGELOG. npm dependencies are installed with pnpm (not included in the ZIP).
Requirements
- Node.js 22 LTS (recommended; minimum 20) and pnpm 10.
- Docker with Docker Compose v2 (Docker Desktop, OrbStack, Colima, or Docker Engine).
Installation
After pnpm install and copying .env.example to .env:
- pnpm infra:up: Postgres, Redis, Mailpit, and MinIO in Docker.
- pnpm db:migrate: schema, API role, and RLS policies.
- pnpm db:seed: demo data.
- pnpm dev: web on localhost:3000 and API on localhost:4000.
Deployment
Step-by-step guides for a VPS with Docker Compose and Caddy (automatic HTTPS), Fly.io, and Google Cloud Run. The API image includes the commands api, worker, and migrate; it includes a runbook for Postgres backups to S3.
What is simulated or requires your accounts
- Stripe: the clinic subscription works in simulated mode; to charge for real you need your Stripe account and pricing.
- Twilio: without credentials, SMS and WhatsApp are only logged; to send you need your account.
- Email: locally it uses Mailpit; in production you need your SMTP provider.
- CFDI: does not include a PAC. The receipts are test receipts and do not have fiscal validity; the structure is ready to connect a real PAC, whose integration and contract are your responsibility.
- S3 storage, PostgreSQL, and production Redis are provided by you.
License
It is sold with the standard buyer license from Bernuvia: you can use and modify Vetria, deploy it as your own SaaS, and build products for your clients. You cannot resell or redistribute the code as a template. Open source dependencies retain their licenses (THIRD_PARTY_NOTICES.md). The purchase does not include rights to the “Vetria” brand: it includes a guide to put yours.
Frequently Asked Questions
Is it in English?
No. The interface, emails, and PDFs are only in Spanish (Mexico) and there is no i18n system. You can add one (for example, next-intl), but it requires extracting the texts and is not included.
Are CFDI invoices valid before the SAT?
No. The internal generator produces test XML and PDF. To stamp, you must hire a PAC and implement its connector in the included interface.
How is data isolated between clinics?
Each table has the clinic as a key and an RLS policy in PostgreSQL. The API connects with a role without bypass and fixes the clinic in each transaction.
Can I sell it as SaaS to veterinary clinics?
Yes, with your brand. What you cannot do is resell the code as a template.
Do I need Stripe or Twilio to test it?
No. Without credentials, they work in simulated mode and everything is tested locally with Docker.
Can I use another database?
No without rewriting important parts: isolation depends on RLS from PostgreSQL 16.
Does it work on mobile?
It is an adaptable web application that can be installed as a PWA. It does not include native apps for iOS or Android.