If you already live in Vercel, here's how to point a Marketplace Postgres at NightOwl. Six steps, ~15 minutes, no card.
QUICK ANSWER
Can I run NightOwl on a free Vercel Postgres?
Yes — Vercel Postgres (Marketplace, powered by Neon) gives you ~0.5 GB free storage and a real Postgres instance. Provision from Vercel's Marketplace, copy the DATABASE_URL_UNPOOLED string (not the pooled one — NightOwl's drain uses COPY which needs session-level semantics), paste into NightOwl. Setup is ~15 minutes. The free tier inherits all of Neon's free-tier characteristics: cold starts after 5 minutes idle, small compute, 0.5 GB storage cap. Use Vercel Postgres if you want everything in one dashboard; otherwise go to Neon directly — same backend, simpler billing.
Updated · 2026-04-27
[ HEADS UP ]
Vercel Postgres is Neon under the hood. If you don't specifically need everything inside Vercel's dashboard, the direct Neon guide is a slightly better path — same backend, fewer middlemen. This guide covers what's specifically different about the Vercel UX.
What you'll have at the end
A working NightOwl dashboard showing live telemetry from your Laravel app — requests, queries, jobs, exceptions, scheduled tasks — with all data stored in a Vercel Marketplace Postgres database under your control. Total monthly cost: from $5 for NightOwl Hobby, $0 for the database.
END STATE
[ SCREENSHOT PENDING ]
NightOwl dashboard overview showing real Laravel telemetry sourced from a Vercel-provisioned Postgres database, alongside the Vercel dashboard's Storage tab confirming the active database.
What you're aiming for: live telemetry flowing into a Postgres you manage from Vercel.
Why Vercel Postgres makes sense (and when it doesn't)
Two reasons to pick Vercel over going to Neon directly:
One billing surface — if your Vercel bill is already a line item, this avoids a second vendor relationship.
Familiar UI — the Vercel dashboard is what you already know; you don't context-switch to a Neon dashboard for occasional checks.
Three catches worth knowing up front:
It's Neon, with the same free-tier limits. 0.5 GB storage, autosuspend after 5 minutes idle, small autoscaling compute. This is Neon's free tier, not NightOwl — slow dashboard loads after idle periods are wake-up cost. See the Neon guide for the deep version.
The default DATABASE_URL is pooled (transaction mode). NightOwl's drain uses Postgres COPY which doesn't work under transaction-mode pooling. You must use DATABASE_URL_UNPOOLED instead.
Vercel adds an abstraction layer. If Neon ships a feature, Vercel may take days or weeks to surface it. Power users hit this faster.
Step 1 — Provision Postgres from Vercel Marketplace
Open your Vercel dashboard at vercel.com/dashboard. Click Storage → Create Database. From the Marketplace, pick Neon Postgres (the Vercel-branded option labelled "Postgres" is also Neon — they're the same).
Pick a region close to your Laravel app's server. Same-region keeps drain latency under 10 ms. Click create — provisioning takes about a minute.
STEP 01
[ SCREENSHOT PENDING ]
Vercel dashboard Storage tab with the 'Create Database' modal open, showing the Neon Postgres tile selected and a region picker visible.
You don't have to attach the database to a project. Standalone is the cleaner path for NightOwl since your Laravel app isn't on Vercel.
Step 2 — Copy the unpooled connection string
Once the database is provisioned, open it from the Storage tab. Click .env.local or Show secret. You'll see several environment variables:
DATABASE_URL — pooled (transaction mode). Do not use this.
DATABASE_URL_UNPOOLED — direct connection, session-level. Use this for NightOwl.
POSTGRES_URL, POSTGRES_PRISMA_URL, etc. — Vercel-flavored aliases for the same pooled URL. Skip.
Copy DATABASE_URL_UNPOOLED as-is. The format is postgresql://[user]:[password]@ep-xxx.region.aws.neon.tech/[db]?sslmode=require.
STEP 02
[ SCREENSHOT PENDING ]
Vercel Postgres database detail page with the env-vars panel open, DATABASE_URL_UNPOOLED highlighted with a copy button, and DATABASE_URL marked as 'do not use'.
If you accidentally use DATABASE_URL, NightOwl's connection test fails with a transaction-pooler error in step 3 — easy to fix, just re-copy the unpooled variant.
Step 3 — Register the app in NightOwl
Sign in to the NightOwl dashboard. Click New application and name it. The form has five separate database fields — parse DATABASE_URL_UNPOOLED by hand into them:
db_host — hostname (e.g. ep-xxx-xxx.region.aws.neon.tech, no -pooler suffix)
db_port — 5432
db_database — neondb (or whatever name appears in the URI's path)
db_username — the user from the URI
db_password — the password embedded in the URI
Click Test connection. NightOwl runs SELECT 1; on success the form unlocks. Save, and NightOwl issues an agent token. Copy it.
STEP 03
[ SCREENSHOT PENDING ]
NightOwl 'New application' dialog with five database fields filled in (db_host, db_port, db_database, db_username, db_password) parsed from DATABASE_URL_UNPOOLED, and a 'Test connection' button below.
If the test fails with a transaction-pooler error, the host has -pooler in it — you used DATABASE_URL by mistake. Go back to Step 2 and use the unpooled hostname.
Step 4 — Install the NightOwl agent
In your Laravel project root:
bash
composer require nightowl/agent
Add the same five DB connection values plus the agent token to your Laravel .env:
nightowl:install publishes config/nightowl.php and runs the schema migrations against your Vercel Postgres database.
STEP 04
[ SCREENSHOT PENDING ]
Terminal output of 'php artisan nightowl:install' showing 'Published config/nightowl.php' and 'Ran migrations' against the nightowl connection.
If migrations error, double-check the NIGHTOWL_DB_* env vars match what you typed into the dashboard form.
Step 5 — Start the agent and verify telemetry
Run the agent:
bash
php artisan nightowl:agent
Hit any route in your Laravel app. Within a few seconds it should appear in NightOwl's Requests tab. If Vercel Postgres was suspended (autosuspends after 5 minutes idle), the very first request takes a beat extra while compute wakes up — that's Neon's wake-up cost, not a NightOwl issue.
STEP 05
[ SCREENSHOT PENDING ]
NightOwl Requests tab showing the just-fired request with route, status code, p95 timing, and a 'received 3 seconds ago' badge.
If you don't see anything within ~10 seconds: check the agent's health endpoint at localhost:2409/health, then re-verify the connection string is the unpooled one.
Step 6 — Tune retention for the 0.5 GB free tier
Drop retention to 2 days. In your Laravel .env:
bash
NIGHTOWL_RETENTION_DAYS=2
Schedule the prune in routes/console.php:
php
use Illuminate\Support\Facades\Schedule;
Schedule::command('nightowl:prune')->daily();
nightowl:prune deletes rows older than the retention window across all 11 telemetry tables. It's a single retention value — no per-table tuning at the moment.
STEP 06
[ SCREENSHOT PENDING ]
Terminal output of 'php artisan nightowl:prune' showing per-table delete counts after pruning.
Same retention strategy as direct Neon — the underlying compute and storage limits are identical.
When to upgrade
Three signals it's time to leave the free tier:
Cold starts on the dashboard frustrate you — Vercel Pro ($20/mo) or moving to Neon Launch directly ($19/mo) gets you always-on compute.
Storage hits 80% of 0.5 GB even with 2-day retention — same upgrade path; 10 GB unlocked on the next tier.
You want point-in-time recovery — paid Neon (and equivalently Vercel Pro Postgres) adds 7-day PITR.
If you're going to upgrade anyway, it's worth re-evaluating direct-Neon vs Vercel-Postgres pricing — the underlying compute is the same, so the only difference is which dashboard you bill from.
Compare: Vercel Postgres vs Neon vs Supabase vs Aiven
Vercel Postgres — Neon-powered, lives inside Vercel. Best when you're already on Vercel.
Neon — same backend, direct relationship. Better if you're not on Vercel.
Supabase — always-on free compute (no cold starts), 500 MB. Better if cold starts annoy you.
Aiven — multi-cloud managed Postgres, 1 GB free, always-on. Better for ops/DevOps audiences who pick the cloud region precisely.
THE QUICK PATH
Already have an unpooled URL? Skip to install.
Two commands plus the agent token. Same flow as direct Neon — only the dashboard you provision from is different.
From $5/month flat for NightOwl. 14-day free trial. Database stays $0 on Vercel Hobby tier.
Frequently asked questions
Is Vercel Postgres actually a real Postgres?
Yes — it's Neon under the hood. Vercel Marketplace provisions a Neon project on your behalf and surfaces the connection details inside the Vercel dashboard. Everything that works on raw Neon (libpq, COPY, JSONB, partial indexes) works on Vercel Postgres. The only thing different is the dashboard UI and the env-var naming.
Should I use Vercel Postgres or go directly to Neon?
Use Vercel Postgres if you're already on Vercel and want everything in one dashboard — billing, env vars, and database management in the same place. Use Neon directly if you want full access to Neon-specific features (branching workflows, point-in-time recovery on paid tiers, custom region pinning), or if your Laravel app isn't on Vercel — there's no reason to add a third party.
Why does the NightOwl dashboard feel slow on Vercel Postgres free?
Same reason as direct Neon free — it inherits Neon's free-tier compute model. Cold starts after 5 minutes idle (500 ms - 2 s wake), small autoscaling compute (~0.25 vCPU), and aggregations over a few days of telemetry can take 1-3 seconds. *This is the underlying Neon free tier, not NightOwl* — verify in Vercel's Postgres dashboard query runner where the same queries are just as slow. The fix is upgrading: Vercel Pro ($20/mo) or moving the database to Neon Launch directly.
Which connection string do I use — DATABASE_URL or DATABASE_URL_UNPOOLED?
Use DATABASE_URL_UNPOOLED. NightOwl's drain uses Postgres COPY for batch ingestion, which doesn't work cleanly under transaction-mode pooling (Vercel's default DATABASE_URL goes through the pooler). The unpooled variant gives session-level semantics — exactly what COPY needs.
Do I need a Vercel project to provision Postgres?
No. Vercel Marketplace lets you provision a standalone Neon database without attaching it to any project. This is the right path for NightOwl — your Laravel app doesn't run on Vercel, so attaching the DB to a Vercel project just adds noise. Provision standalone, copy the connection string, point NightOwl at it.
How much telemetry fits in the Vercel Postgres free allowance?
Vercel's hobby tier passes through to Neon's free quota — about 0.5 GB of storage and limited compute hours per month. For NightOwl's continuous drain pattern, the storage cap matters more than compute. Set retention to 2 days for requests/queries/jobs and you'll fit a low-traffic Laravel app comfortably for weeks. Heavy traffic blows through the storage limit fast — see the Aiven or paid Neon guides if that's you.
Does the agent burn through compute hours when the database is idle?
Only when it's actively writing. NightOwl's agent buffers locally in SQLite and drains in batches every few seconds — between drains, the database can autosuspend. In practice, business-hours traffic keeps Vercel Postgres warm; nights/weekends it suspends. The compute-hours allowance is rarely the bottleneck on the free tier; the storage cap is.
PRICING
Flat pricing. No event caps. No per-seat fees.
14-day free trial, no credit card. Your PostgreSQL, your data.
HOBBY
$5/month
1 app · 14 days lookback · all Laravel events
TEAM
$15/month
Up to 3 connected apps · unlimited environments · all Laravel events
AGENCY
$69/month
Unlimited apps · unlimited agent instances · same flat rate at any traffic