You build the experience. Apointoo keeps the proof.
Next.js, Vue, WordPress, custom landing pages, your own form, or a booking flow, Apointoo runs as the attribution layer behind it. Handler-first, fully typed, tree-shakeable. Works on Node.js, Deno, Cloudflare Workers, and any edge runtime with the Fetch API.
npm install git+https://github.com/vizuh/apointoo-sdk.gitnpmQuick start
Capture events via API or SDK, preserve GCLID, UTMs, and session data, then send leads, bookings, and outcome updates through your /api/* route in Next.js, Hono, or Express.
import { createBookingHandler } from '@vizuh/apointoo-sdk/server'
import { brevoRestAdapter } from '@vizuh/apointoo-sdk/adapters/notification/brevo-rest'
import { directConfirmAdapter } from '@vizuh/apointoo-sdk/adapters/booking/direct-confirm'
export const app = createBookingHandler({
config: {
projectKey: 'your-clinic',
locale: 'en-US',
timezone: 'America/New_York',
},
booking: directConfirmAdapter(),
notification: brevoRestAdapter({ apiKey: env.BREVO_API_KEY }),
})Adapters
Each integration is a tree-shakeable adapter for the systems where conversions actually happen. Import only what you use.
| Adapter | Type | Status | Import |
|---|---|---|---|
| BLVD | booking | production | @vizuh/apointoo-sdk/adapters/booking/blvd |
| OpenDental | booking | beta | @vizuh/apointoo-sdk/adapters/booking/open-dental |
| direct-confirm | booking | production | @vizuh/apointoo-sdk/adapters/booking/direct-confirm |
| Brevo REST | notification | production | @vizuh/apointoo-sdk/adapters/notification/brevo-rest |
| Twilio WhatsApp | notification | beta | @vizuh/apointoo-sdk/adapters/notification/twilio-whatsapp |
| Sheets | persistence | production | @vizuh/apointoo-sdk/adapters/persistence/sheets |
| Upstash | dedup | production | @vizuh/apointoo-sdk/adapters/dedup/upstash |
Architecture
One handler is the entry point. It runs the pipeline that holds attribution at every step and sends the confirmed conversion back to Google Ads through the configured adapters.
Environment variables
Configuration is environment variables. No SDK-specific config files. Drop the keys in, deploy, ship.
| Variable | Required | Description |
|---|---|---|
| NEXT_PUBLIC_GTM_ID | No | Google Tag Manager container ID. Leave empty to disable GTM. |
| HEADLESS_WP_URL | No | WordPress GraphQL endpoint for /docs and /blog content. |
| BREVO_API_KEY | No | Brevo (Sendinblue) REST API key for the Brevo notification adapter. |
| BLVD_API_KEY | No | BLVD API key for the BLVD booking adapter. |
| UPSTASH_REDIS_URL | No | Upstash Redis REST URL for the dedup adapter. |
| UPSTASH_REDIS_TOKEN | No | Upstash Redis REST token. |
| GOOGLE_SHEETS_SPREADSHEET_ID | No | Google Sheets spreadsheet ID for the persistence adapter. |