v1.0 Dashboard Public Profile GitHub
Common Issues

Troubleshooting

Solutions to the most common issues encountered during setup, development, and deployment of KaiVox AI.

Dashboard Shows Negative Trial Days

Fixed. This was caused by a null trial_ends_at in the subscriptions table. The dashboard now guards against null values before computing the difference.

If you encounter this again, check the subscriptions table for the affected tenant and ensure trial_ends_at is set correctly (14 days from the subscription created_at).

Dashboard Checklist Items Showing False

The onboarding checklist on the dashboard checks for: at least one service, at least one staff member, a phone number, and a working AI connection. If any item shows false:

  • Services: Go to Services → Add at least one service
  • Staff: Go to Staff → Add at least one staff member
  • Phone number: Go to Phone Numbers → Purchase or manually add a number
  • AI connected: Ensure OPENAI_API_KEY is set in .env

AI Not Responding on Calls

SymptomCauseFix
Call answered but AI is silentOPENAI_API_KEY missing or invalidCheck .env; test key at platform.openai.com
AI answers but gives generic errorFailover triggered — OpenAI returned errorCheck ai_action_logs table for event_type = failover_activated
AI gives wrong business infoKnowledge Brain emptyAdd FAQ and business info at Knowledge → Add Item
AI uses wrong greetingAI Persona not configuredSettings → AI Persona → set greeting message
AI doesn't book appointmentsNo services or staff configuredAdd at least one service and one staff member with working hours

Webhook Not Firing (Vobiz / Twilio)

SymptomCauseFix
Call goes through but no AI answerAnswer URL not set in provider dashboardCheck Vobiz or Twilio Console — set Answer URL to the correct tenant slug URL
Answer URL set but unreachableUsing localhost URL — not publicly accessibleUse ngrok tunnel or test on staging server; local .test domain is not reachable from the internet
Wrong slug in URLTenant slug mismatchFind your slug on the Dashboard page under "Your Webhook URLs". Copy it exactly.
SSL error on webhookSelf-signed cert or HTTP URLVobiz and Twilio require HTTPS with a valid SSL certificate. Use staging domain which has a real cert.
Webhook 500 errorServer error in KaiVoxCheck storage/logs/laravel.log on the server for the stack trace

SMS Not Sending

SymptomCauseFix
SMS not sent after bookingTwilio credentials missingSet TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_FROM_NUMBER in .env
SMS delivered but from wrong numberTWILIO_FROM_NUMBER wrong formatMust be E.164 format: +12025551234 — include country code with +
SMS to Indian numbers failingTwilio number not SMS-enabled for IndiaUse Vobiz for India SMS, or enable India delivery in Twilio Console
SMS job queued but not processingQueue worker not runningRun php artisan queue:work locally; on server check if the queue daemon is running
WhatsApp not deliveredSandbox not joined by recipientFor Twilio sandbox, recipient must have joined the sandbox first. Not needed for production WhatsApp.

Google Calendar Not Connecting

Known limitation: Google Calendar OAuth cannot be tested on localhost (http://kaivox-ai.test). Google rejects it as an invalid redirect URI. Must be tested on staging or production.
SymptomCauseFix
"Invalid redirect" error from GoogleUsing localhost or .test domainTest on staging (kaivox-test.omajestic.com) only
Connect button does nothingGOOGLE_CLIENT_ID not setSettings shows "coming soon" message when creds are missing — expected behaviour
OAuth returns error after consentGOOGLE_REDIRECT_URI mismatchURI in .env must exactly match what is registered in Google Cloud Console
Events not appearing in Google CalendarToken expired and refresh failedDisconnect and reconnect Google Calendar to get a fresh token

Emails Not Sending

Local limitation: SMTP ports 587 and 465 are blocked by local ISP/Windows Firewall. Emails will not send from local development. This is intentional and documented.
  • Local dev fix: Set MAIL_MAILER=log to see emails in storage/logs/laravel.log, or install Mailpit to catch emails at localhost:8025
  • On staging/production: Hostinger SMTP works fine. Set MAIL_MAILER=smtp and fill all MAIL_* variables in .env
  • Queue not running: Email jobs are queued. Run php artisan queue:work or check the queue daemon is running on the server

Stripe / Razorpay Payment Not Credited

SymptomFix
Stripe checkout completes but wallet not updatedCheck Laravel logs for errors in BillingController::stripeSuccess(). Ensure STRIPE_SECRET is set correctly.
Razorpay signature verification failsCheck RAZORPAY_SECRET matches exactly what is in Razorpay Dashboard → Settings → API Keys
Test payment rejectedEnsure you are using test keys (pk_test_, rzp_test_) — live keys reject test card numbers

Migrations Failing

ErrorFix
SQLSTATE: 1071 Specified key was too longAdd Schema::defaultStringLength(191); in AppServiceProvider::boot()
Class not found during seedingRun composer dump-autoload first
Migration rolls back unexpectedlyCheck storage/logs/laravel.log for the specific error. Common cause: duplicate column or missing foreign key table.
php artisan migrate uses wrong PHP versionUse full path: D:\xampp\php82\php.exe artisan migrate

Kiosk / Public Profile Not Loading

SymptomFix
/kiosk/{slug} shows 404Tenant slug must match exactly — check tenants.slug in DB
/p/{slug} shows 404Same — verify tenant slug. The route is GET /p/{slug} registered in web.php
Profile shows "hidden" badgeTenant has set profile visibility to "hidden" — Settings → Public Profile → make it Public
Cover photo not showingRun php artisan storage:link to create the symlink from public/storage to storage/app/public

Queue Jobs Stuck / Not Processing

  • Run php artisan queue:work in a terminal — it must keep running
  • Check jobs table in database for stuck jobs
  • Run php artisan queue:flush to clear failed jobs if needed
  • On production (Hostinger), set up a supervisor or cron to restart the queue worker if it dies

Getting More Debug Info

  • Set APP_DEBUG=true temporarily (never on production) to see full error stack traces
  • Check storage/logs/laravel.log — this is the first place to look for any error
  • Check ai_action_logs table for AI-related errors
  • Check webhook_deliveries table for outbound webhook delivery failures
  • Check failed_jobs table for queue job failures