Connect data
Open Connections in the app. Each source takes only what it needs; secrets live in Google Secret Manager — the database stores a reference, never the value.
RevenueCat
Enter your Secret API key and a Webhook Authorization header(any random secret). Paste the same header value into RevenueCat → Integrations → Webhooks, using the webhook URL shown after you connect.
Apple App Store
Enter your Issuer ID, Key ID, the .p8 private key(PEM), your Bundle ID and your Vendor Number (App Store Connect → Payments and Financial Reports). This alone brings revenue via dailySales & Trends reports (24–48h delay).
For real-time subscription events, set the Server Notifications URL (shown after connect) in App Store Connect → your app → App Information, Version 2. Apple allows only one notifications URL per app — so if your own backend already consumes it, don’t replace it. Instead, forward a copy of each raw notification body to the Pulse URL from your backend; Pulse verifies Apple’s signature itself, so a forwarded copy is accepted. Server Notifications are optional — skip them and revenue still flows via Sales & Trends.
Forwarding from your backend (best-effort — don’t block your ack to Apple):
// Apple → your backend → Pulse. Forward the raw { signedPayload } body.
app.post('/your/app-store/notifications', (req, res) => {
res.sendStatus(200); // ack Apple first
fetch('https://hooks.pulse.pulsecircle.studio/hooks/app-store/YOUR_CONNECTION_ID', {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify(req.body), // the { signedPayload } Apple sent
}).catch(() => {}); // Pulse re-verifies Apple's signature
});Do the same from your sandbox handler (same Pulse URL). Copy YOUR_CONNECTION_ID from the Server Notifications URL shown on the App Store card in Connections.
Google Play
Paste a service-account JSON key (with client_email andprivate_key) and your package name.
Meta Ads & Google Ads
One click — sign in and approve. No keys to paste; Pulse stores a long-lived token and picks upall ad accounts that login can access in a single connection. Re-authorizing the same login later just refreshes the token on the existing connection (and reactivates it if it was disconnected) — you won't get a duplicate.
Have a second, separate ad login (a different business or Facebook user)? Connect it too — it becomes its own connection alongside the first, with its own accounts.
Ad spend attribution (several apps or accounts)
Revenue and events are naturally per-app: RevenueCat, the App Store, Google Play and SDK events each carry their own project / bundle / package / SDK key, so you connect and receive them per app. Ad spend is different — one ad account often runs campaigns for several apps, so Pulse lets you route it.
Connect an ad platform once (on any app). Under Connections → Ad spend attribution you'll see each ad account and its campaigns, with a dropdown per row:
- Default app — the account's spend lands on the app it was connected under.
- A specific app — send this account (or a single campaign) to another app. Campaigns inherit their account unless you override them individually.
- Ignore — drop this account or campaign everywhere (use it for a dead account).
Resolution order is campaign → account → connection default. Changing a mapping moves the already-synced spend to the right app and recomputes the affected apps' metrics automatically — no reconnect or re-backfill needed. Only campaigns that have spend in the last 90 days appear (there's nothing to attribute otherwise). Attribution for a connection is managed from the Connections page of the app you connected it under.
Backfill historical data
New ad connections pull the last 3 days and then keep a rolling window fresh. To load history, the workspace owner can run a Backfill (3–24 months) from the Meta / Google Ads card. It runs in the background in 30-day chunks and is safe to re-run (idempotent).
Verify it’s working
Each connection shows its status and last successful sync. Ask “verify my data sources” in chat (the agent runs pulse_verify) to see events, connector health and the latest metrics day at a glance. A failing connection is isolated — it retries and auto-recovers without affecting others.