Three composable primitives — global key-value, real-time pub/sub, and unified job queues — built for Next.js and Vercel. No config files. No clusters. Just an API key.
Works with Next.js 13+ · App Router · Edge Runtime · Node.js
// Three APIs. One import.
import createClient from 'saasignal'
import NextResponse from 'next/server'
const ss = createClient(process.env.SAASIGNAL_KEY)
export async function POST(req: Request)
const orgId, metric, value = await req.json()
// Cache at the edge — 1 token
await ss.kv.set(`metric:${orgId}`, value)
// Push to live dashboards — 2 tokens
await ss.channels.publish(`org:${orgId}`,
event: 'metric.updated',
data: metric, value
)
// Queue background work — 5 tokens
await ss.jobs.create(
trigger: type: 'immediate' ,
handler: 'https://acme.com/api/process',
payload: orgId, metric, value
)
return NextResponse.json( ok: true )
Queue, Task, and Cron are not different things — they're all "execute a handler, at some point, with retries." The only difference is the trigger.
Sub-millisecond reads from 300+ edge locations. Sessions, feature flags, rate limits, distributed locks — all from a single API.
import { createClient } from 'saasignal'
const ss = createClient(process.env.SAASIGNAL_KEY)
// Edge-fast sessions
await ss.kv.set('session:u_123', {
userId: 'u_123',
role: 'admin',
plan: 'pro',
}, { ttl: 86400 })
// Atomic counters
await ss.kv.increment('ratelimit:u_123')
// Batch operations
const { results } = await ss.kv.batch([
{ op: 'get', key: 'config:flags' },
{ op: 'get', key: 'config:limits' },
]) WebSocket and SSE subscriptions with presence, message history, and fan-out. Build live dashboards in minutes, not months.
// Publish from your API route
await ss.channels.publish('org:acme', {
event: 'metric.updated',
data: { mrr: 42840, delta: +1200 }
})
// Subscribe in the browser
const channel = ss.channels.subscribe('org:acme')
channel.on('metric.updated', ({ mrr, delta }) => {
setMRR(mrr)
})
// Presence — who's online right now
const { users } = await ss.channels.presence('org:acme')
console.log(users.length, 'users online') One primitive replaces three services. Immediate tasks, delayed execution, cron schedules, push queues, pull queues — all with retries and dead-letter.
// Send welcome email in background
await ss.jobs.create({
trigger: { type: 'immediate' },
handler: 'https://app.acme.com/api/on-signup',
payload: { userId: 'u_123' },
max_attempts: 3,
backoff: 'exponential',
})
// Nightly billing digest (cron)
await ss.jobs.create({
trigger: {
type: 'scheduled',
schedule: '0 9 * * *',
timezone: 'America/New_York',
},
handler: 'https://app.acme.com/api/digest',
}) Sign up, create an org, then a project. Takes 30 seconds.
Create a scoped key and add SAASIGNAL_KEY to your Vercel environment.
Run npm install saasignal and import with a single line.
Push to Vercel. KV, Channels, and Jobs are live on 300+ edge locations.
Tokens are shared across KV, Channels, and Jobs. No per-service billing, no overages surprises. Top up with token packs anytime.
Start free. Scale as you grow. No infrastructure costs, ever.
Need more? Contact us for enterprise pricing with SLAs.
Get KV, Channels, and Jobs in one API call. Free to start, no credit card required.