help · integrations

Junocal + Klaviyo

Push every Junocal client into Klaviyo as a profile, ready for segments, flows, and SMS. Below: exactly what we sync, what we access, and how to disconnect.

What the integration does

When a studio owner connects their Klaviyo account to Junocal, every client in your Junocal client list flows into Klaviyo as a profile, tagged with junocal_source=junocal. New clients sync automatically; opt-outs from Junocal carry forward; profile data stays in sync as clients update their details.

From there you run your usual Klaviyo workflows — segments, flows, SMS, abandoned-checkout style sequences — using a clean, deduplicated client list as the source of truth.

We do NOT push Junocal events (bookings, payments, attendance) into Klaviyo automatically — only profile data. If you want event-driven Klaviyo flows, wire those up via webhooks separately.

What we ask Klaviyo for, and why

We request exactly the scopes needed to sync profiles in and out — nothing more:

• profiles:read — to look up existing profiles before creating duplicates

• profiles:write — to create or update profile records as clients sign up or change details in Junocal

• accounts:read — Klaviyo requires this on every OAuth app (it tells us which Klaviyo account we just connected to)

We do NOT request access to: campaign send/edit, list management, segment creation, event tracking, template editing, billing, or any other Klaviyo capability.

Connecting Klaviyo — step by step

1. Sign in to Junocal as the studio owner. (Front-desk and instructor roles can't connect Klaviyo — only Owner.)

2. Go to Settings → Integrations, find the Klaviyo card, click "Connect Klaviyo".

3. Junocal redirects you to Klaviyo's consent screen. Review the three scopes Klaviyo shows you. Click Allow.

4. Klaviyo redirects you back to Junocal. The Integrations page now shows "Connected as <your-klaviyo-account>".

5. Junocal kicks off an initial backfill: every existing client gets pushed into Klaviyo as a profile (or matched to an existing one by email). Takes a few minutes for large lists.

What syncs and when

Initial backfill (one time, right after connecting) — every existing client with an email and email_opt_in=true gets pushed to Klaviyo.

New client added in Junocal → pushed to Klaviyo within seconds.

Client updates their email / name / phone in Junocal → updated profile in Klaviyo within seconds.

Client opts out via Junocal's email footer → marked as suppressed in Klaviyo.

Klaviyo profile changes do NOT push back into Junocal automatically — Klaviyo is downstream, not bidirectional.

Disconnecting and revoking access

Two paths, both equally final:

From Junocal: Settings → Integrations → Klaviyo → Disconnect. Junocal tells Klaviyo to revoke the OAuth grant, then deletes your stored tokens. Profile sync stops immediately. Profiles already in Klaviyo stay there — they're yours.

From Klaviyo: open Klaviyo Settings → Integrations → find Junocal in the connected apps list → Uninstall. Klaviyo notifies Junocal via OAuth revocation; we delete your stored tokens. Same outcome as the Junocal-side disconnect.

Disconnecting does NOT delete client profiles from Klaviyo. Those belong to you and stay in your Klaviyo account exactly as they were.

What we store, and for how long

From the OAuth flow: your Klaviyo account label (for the "Connected as" line in Integrations) and the refresh token (encrypted at rest with AES-256-GCM using a key Junocal holds, not derived from your Klaviyo account).

From each sync: the Klaviyo profile_id we created for each client, stored on the client row so updates don't create duplicates. No Klaviyo data is mirrored into Junocal — we send data outbound, we don't read profiles back.

When you disconnect or uninstall: all of the above is deleted immediately. We don't archive or retain anything for analytics.

Security

Refresh tokens are encrypted at the application layer (AES-256-GCM) before they hit the database, on top of the database's own at-rest encryption. Access tokens live only in memory.

Klaviyo's OAuth implementation rotates the refresh token on every refresh — we re-encrypt and store the new value immediately, so the old token can never be replayed.

All communication with Klaviyo's API runs over TLS 1.2 or higher. Per-studio rate limits are yours, not Junocal's — Klaviyo throttles us against your account's quota.

Troubleshooting

"Reconnect required" banner on the Integrations page → Klaviyo revoked our grant (often because you uninstalled the app from Klaviyo's side, or your account had a security event). Click Reconnect and re-authorize.

Client added in Junocal but not appearing in Klaviyo → check that the client's email_opt_in is true. We don't push opted-out clients into Klaviyo (would conflict with Klaviyo's own consent state).

Duplicate profiles in Klaviyo for the same client → likely the client previously existed in Klaviyo under a different email casing. Klaviyo treats sharon@studio.com and Sharon@Studio.com as different profiles by default. Merge the duplicates in Klaviyo's profile-merge UI.

Need to use a different Klaviyo account → disconnect first, then connect again as the other account. Junocal stores one Klaviyo account per studio.

stuck or curious

Still have a Klaviyo question

For connection problems, sync issues, data-handling questions, or anything not covered above, email hello@junocal.com. We reply within 48 hours.