Aangan Studio

Development data present. 1 simulated call come from seed scripts or mock adapters, not real callers. 22 live calls recorded. Use Live only to exclude them.

Configuration

Integrations

Live, simulated or not configured — shown honestly. Secrets are never displayed here; they live in server-side environment variables only.

Vaani Voice

live

Answers the call (Input layer), calls our tool endpoint mid-call, and posts call events.

Needs

  • VAANI_API_KEY
  • VAANI_AGENT_ID
  • VOICE_TOOL_SECRET
  • VAANI_WEBHOOK_TOKEN
  1. Create the agent and paste the generated prompt (npm run vaani:tools prints the tool definitions).
  2. Add the six custom cURL tools pointing at /api/voice/tools/aangan-workflow-action with the X-Aangan-Tool-Key header.
  3. Settings -> Webhooks: add the webhook URL below (with ?token=).
  4. Settings -> Telephony: provision or connect a number and assign it to the agent for inbound calls.

Open point: Vaani's public docs do not specify the custom-tool placeholder syntax or signing for call webhooks. Both must be confirmed in the dashboard (see docs/vaani-integration.md).

Google Gemini

live

Post-call extraction, summaries and the transcript compliance audit. Never decides qualification.

Needs

  • GEMINI_API_KEY
  • GEMINI_MODEL (optional)
  1. Create a key in Google AI Studio and use a paid-tier key for production volumes.

HubSpot

live

Contact + call note per enquiry, including declined calls.

Needs

  • HUBSPOT_ACCESS_TOKEN
  1. Create a Private App with scopes crm.objects.contacts.read/write and crm.schemas.contacts.read/write.
  2. Run npm run hubspot:setup once to create the aangan_* properties (existing ones are never duplicated).

Open point: Deal creation is optional and needs HUBSPOT_CREATE_DEALS plus the pipeline and stage IDs.

Calendar (Cal.com or Calendly)

live

Real availability lookup and booking through the provider's API; the provider emails the confirmation.

Needs

  • CALCOM_API_KEY (free) or CALENDLY_ACCESS_TOKEN (paid plan)
  • CALENDAR_PROVIDER (optional)
  • an event type per designer (Settings -> Team)
  1. Cal.com (free): create an API key under Settings -> Security, create an event type (turn OFF 'requires confirmation') and put its id in Settings -> Team as calcom:<id>.
  2. Calendly: needs a paid plan (Standard+); the booking endpoint returns 403 on Free. Paste each event type URI in Settings -> Team.

Open point: Cal.com's free plan has a single host, so every consultation lands on one shared calendar; the designer is named in our handoff email. Confirm that the provider's notification emails to the invitee (and host) are enabled.

Email (Resend)

live

Handoff and escalation emails to designers, front desk and senior people.

Needs

  • RESEND_API_KEY
  • EMAIL_FROM
  • FRONT_DESK_EMAIL
  • SENIOR_ESCALATION_EMAIL
  1. Verify a sending domain in Resend; the test sender can only reach the account owner.
  2. Set EMAIL_TEST_RECIPIENT during the pilot to redirect every message to one inbox.

Neon PostgreSQL

live

Persistent storage for calls, qualification evidence, bookings, jobs and costs.

Needs

  • DATABASE_URL (pooled connection string)
  1. Use the pooled connection string from the Neon console, not the management API key.
  2. Run npm run db:migrate before first start.

Endpoints to register

Public URLs only. Append the secret values yourself; they are not shown.

Live tool endpoint (Vaani custom tools)
https://aangan-studio-lyart.vercel.app/api/voice/tools/aangan-workflow-action VOICE_TOOL_SECRET set
Call-event webhook (Vaani Settings → Webhooks)
https://aangan-studio-lyart.vercel.app/api/voice/webhooks/vaani?token=… secret set
Job runner (cron)
https://aangan-studio-lyart.vercel.app/api/jobs/run CRON_SECRET set
Sessions
SESSION_SECRET set

Connection checks

Makes one harmless authenticated call per live integration. Simulated integrations are reported as not live - never as healthy.

Background jobs: 0 pending, 0 retrying, 0 dead. Emails in the last 24 hours: 0 sent, 0 failed.

Business knowledge loaded

Read from content/knowledge on the server. pricing.md is used only for the approved deflection sentence; its price tables are never loaded into prompts, APIs or this page.

  • services.mdloaded
  • qualified.mdloaded
  • pricing.mdloaded
  • Approved pricing response matches pricing.mdverified

Recent integration failures

No failures recorded.