
Campaign detail
Campaign overview with the lead list and call states.
Voice AI · SaaS Platform
Organisations upload leads. An AI voice agent dials each one, holds the conversation, and records the outcome. Every call leaves an immutable compliance audit trail.
Category
Generative AI / Voice AI · SaaS Platform
Industry
Debt collection, insurance, banking, healthcare
Technology
Next.js 16, React 19, TypeScript, Tailwind v4, NestJS 11, Prisma 5, PostgreSQL, Python, ElevenLabs
Status
In development on staging. Production on GCP, EU only, planned.
Platforms
Web. Operator dashboard and marketing site.


Campaign overview with the lead list and call states.

A single call with transcript and compliance result.

Funnel, intent classification, and time series charts.
100%
EU data residency
3
Compliance gates before every call
30s
Dialer cycle
15 min
JWT token lifetime
2
Isolated databases
Evolution

Version 01 — Composed
The original design used Deepgram for speech to text, Cartesia for text to speech, and a separate telephony provider, each with its own API key and integration surface. It was designed but superseded before completion.

Version 02 — Single vendor
ElevenLabs now runs the full loop end to end behind one Python service: speech to text, an LLM driven conversation, text to speech, and telephony. Chosen to cut latency and integration surface. The call status model was simplified accordingly.
Foundation
Multi tenant single database architecture with org scoping and soft deletes. JWT auth with rotated refresh tokens and MFA.
Calling domain
Lead and call state machines settled. The voice pipeline consolidated on ElevenLabs end to end.
Security and infra
Signed webhooks, error tracking, AdminJS excluded from production. Hosting locked to GCP EU only on GKE with CMEK.
MVP service model
Internal facing managed service for the first year. Astos staff operate orgs, credits, and campaigns for clients.
The Problem
Outbound calling in regulated industries carries strict duties: consent, do not call lists, allowed calling windows, and recording disclosures.
Compliance proof cannot be editable. Astos writes immutable check and audit records that are never updated or deleted.
The dialer automates lead selection and call placement per campaign, honouring schedule windows, attempt limits, and lead state.
GDPR and EU data residency are a locked architecture decision, not an afterthought added later.
The Product

Step 1
Create a campaign with agent persona, script, caller number, schedule window, and retry rules. Upload leads via CSV. Columns become dynamic variables that fill placeholders in the script.

Step 2
The dialer picks due leads every 30 seconds. Before each call it validates consent, do not call status, and the calling window. Blocked calls never dial. Passed calls run live on ElevenLabs.

Step 3
The AI service returns status, duration, transcript, intent, and sentiment via webhooks. Dashboards show funnel, intent, and time series. Customers can receive signed outbound webhooks.
How It Works
Next.js 16 + React 19 + TanStack Query
Operators trigger and monitor campaigns and calls. The browser talks to the API behind an auth proxy that keeps the refresh token in an HttpOnly cookie.
NestJS 11 + Prisma 5 + PostgreSQL
The source of truth for all tenant data. Loads campaign and lead, runs the compliance gate, writes immutable records, and initiates the call.
NestJS compliance checks
Consent, then do not call, then calling window, before every call. A block cancels the call and is recorded permanently.
Python + ElevenLabs
Places and runs the live voice conversation, records audio and transcript, and reports back through authenticated webhooks.
HMAC SHA256 webhooks
Call and lead events are delivered to customer endpoints, signed and retried with backoff.
What makes Astos special
Outbound calling with configurable agent persona, script, voice, schedule, and retry rules, across a clear draft to archived lifecycle.
Consent records, do not call suppression, calling windows, and recording disclosures. Immutable audit trail with CSV export.
Async CSV upload, a full lead state machine, do not call protection, and dynamic variables for script personalisation.
A scheduler that selects and places due calls every 30 seconds, honouring schedule, attempt limits, and lead state.
Overview KPIs plus per campaign funnel, intent classification, and time series charts.
Signed outbound webhooks with retries, phone number provisioning with a KYC flow, and a prepaid credits system.
Architecture & Technology
A cross service architecture: a Next.js operator dashboard, a NestJS multi tenant API as the source of truth, and a separate Python AI voice service. Each service runs its own database and integrates over HTTP and webhooks only. EU hosted throughout.
Next.js 16, React 19
TypeScript, Tailwind v4, TanStack Query & Form, Zod, Radix UI, Recharts
NestJS 11
Node.js 22, Prisma 5, JWT & MFA auth, throttling, Helmet
PostgreSQL 15+
Two isolated databases, soft deletes, immutable audit tables
Python + ElevenLabs
Speech to text, LLM, text to speech end to end
Hetzner DE + Railway EU
Production target: GCP GKE, Cloud SQL with CMEK, EU only
Every row carries an org id and every query is scoped to it from the JWT, so there is no cross tenant access. Soft deletes everywhere. Audit and compliance logs are immutable.
Isolation
Org-scoped · soft deletes
No call is placed without passing consent, do not call, and calling window checks. Results are written as immutable records, with recording disclosures per jurisdiction.
Gate
Consent · DNC · window
Staging on Hetzner Falkenstein and Railway Amsterdam. Production locked to GCP EU only with CMEK and private Cloud SQL, with no US failover.
Region
EU only · no US failover
Learnings
01
GDPR and data residency drove the stack from day one. EU only hosting is locked, soft deletes and immutable audit tables are schema level, and the compliance gate runs in the call path itself, not as a reporting afterthought.
02
The original multi vendor design was superseded by ElevenLabs end to end. Fewer integration seams and lower latency. The old adapters remain as a failover seam.
03
Lead status stays empty until a call completes, and contacted is derived rather than stored. This avoids denormalised flags and phantom states.
04
The voice API exposes no per call training opt out, so that requirement is bound contractually in the data processing agreement. Vendor limits shape legal posture.
What this means for your business
At Astos
becomesfor you
becomes for you
For Your Business
The same engine fits any high volume calling team that has to stay inside the rules.
At Astos
becomesfor you
becomes for you
For Your Business
You can show exactly which checks ran on each call, with records that cannot be altered.
At Astos
becomesfor you
becomes for you
For Your Business
Data and processing stay inside the EU by design, not by configuration.
Frequently Asked
On staging, the backend, frontend, and database run on a Hetzner server in Falkenstein, Germany. The AI service and its database run on Railway EU West in Amsterdam. Production is locked to GCP, EU region only, with CMEK encryption and no US failover.
15 minutes. Free. No strings attached.
Not a sales pitch. Promised.
More Projects

AI Chatbot
An AI assistant for customer support – trained on company data, deployed in under 2 weeks.

D2C E-Commerce
Children's drawings become unique 3D figures to paint — powered by a multi-model AI pipeline.

Marketplace
Tattoo marketplace for discovering and booking artists. Google Maps integration, real-time search.