Skip to content
Sendora Cloud
Create account
Get started

Send your first event in five minutes.

This walks through creating a project, installing an SDK, and sending an event you'll see in the dashboard.

1. Create a project

Sign up at app.sendoracloud.com. In Settings → API Keys, you'll find a public key for client code and a secret key for server calls.

2. Install the SDK

Pure SPA (Vite, CRA, vanilla browser): install @sendoracloud/sdk-web. Framework apps with a server runtime (Next.js App Router, Remix, SvelteKit, SolidStart): pair it with @sendoracloud/sdk-web-ssr to get HttpOnly-cookie sessions + edge middleware + RSC clients.

npm install @sendoracloud/sdk-web

3. Identify the user

Identify calls create or update a profile. Traits upsert.

import { SendoraCloud } from "@sendoracloud/sdk-web";

const s = new SendoraCloud({
  apiKey: "pk_prod_...",
});

s.identify("u_123", {
  email: "sam@acme.co",
  plan: "startup"
});

4. Track an event

s.track("order.placed", {
  order_id: "ord_81",
  amount: 4200,
  currency: "USD"
});

5. See it in the dashboard

Head to Dashboard → Events. Your event shows up within a second and is now visible to every other module.

6. (Optional) Send your first push notification

Push needs four pieces: provider creds (APNs / FCM / VAPID), a registered device token, an identify() call binding that token to a user, and a send call. Three-step flow:

6a. Configure providers in the dashboard

Dashboard → Push → Settings → Providers.

  • iOS: paste .p8 auth key + Key ID + Team ID + bundle ID. Generate the key at developer.apple.com → Keys → APNs.
  • Android: paste FCM v1 service-account JSON. Download from console.firebase.google.com → Project Settings → Service Accounts → Generate new private key.
  • Web Push: keypair lazy-generated on first call to GET /orgs/:orgId/push/vapid. Public half is what the SDK uses for pushManager.subscribe().

Credentials encrypted AES-256-GCM at rest.

6b. Register a device token from your app

// In application(_:didRegisterForRemoteNotificationsWithDeviceToken:)
let token = deviceTokenData.map { String(format: "%02x", $0) }.joined()
SendoraCloud.push?.registerToken(token, platform: .ios) { _ in }

6c. Send

Two routes — Direct send vs workflow covers when to pick which.

curl -X POST https://api.sendoracloud.com/api/v1/push/send \
  -H "x-api-key: sk_prod_..." \
  -d '{
    "userIds": ["u_123"],
    "title": "Order shipped",
    "body": "Your package is on the way",
    "data": { "orderId": "ord_42", "url": "/orders/42" }
  }'

6d. Verify delivery

Dashboard → Push → Sends. Filter by status:

  • queued / scheduled — accepted, not yet dispatched.
  • sent — dispatched to APNs / FCM / Web Push.
  • failed — provider rejected. Click the row to see dispatchError (e.g. BadDeviceToken, Unregistered).
  • suppressed — blocked by quiet hours or frequency cap. suppressedReason tells you which.

Common first-time failures: wrong APNs environment (sandbox vs production), missing bundle ID match between provider config and client app, or registering Expo-managed ExponentPushToken[...] as platform=ios (Sendora dispatches via APNs natively — see React Native — Expo managed workflow).

Next steps

  • Set up a journey in Automation.
  • Wire a webhook to receive outbound events.
  • Add consent — see the Consent & Privacy module.
  • Configure quiet hours + frequency cap in Dashboard → Push → Settings.