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-web3. 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
.p8auth key + Key ID + Team ID + bundle ID. Generate the key atdeveloper.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 forpushManager.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 seedispatchError(e.g.BadDeviceToken,Unregistered).suppressed— blocked by quiet hours or frequency cap.suppressedReasontells 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.