Klaviyo connector
Keep every customer's Klaviyo profile current with points, VIP tier, birthday, referral code and store credit, and send loyalty activity to Klaviyo as metrics for flows.
The Klaviyo connector links one Klaviyo account to an Orishare environment. Orishare keeps the loyalty properties of each customer's Klaviyo profile current and sends loyalty activity as Klaviyo events, so you can build segments and flows ("you are 50 points from Gold", "your birthday reward is waiting") in Klaviyo. The sync is outbound only: Orishare never reads your Klaviyo data and never sends a message itself.
1. Install the connector
Create a private API key in Klaviyo (Settings, API keys) with full access to Profiles and Events. The key is write-only: Orishare stores it encrypted and no response, list or audit record ever returns it.
curl -X POST "$ORISHARE_API/v1/connectors" -H "Authorization: Bearer $SECRET_KEY" \
-H "Idempotency-Key: klaviyo-connector" -H "Content-Type: application/json" \
-d '{"provider":"klaviyo","external_account":"AbC123",
"credentials":{"api_key":"pk_..."},
"config":{"klaviyo":{"email_attribute":"email","currencies":["points","credit"],
"tier_programs":["VIP Club"]}}}'external_accountis your Klaviyo public API key (the six character site id).config.klaviyo.email_attributenames the customer attribute that holds the email address (defaultemail). Profiles are identified by that email, and your Orishareexternal_idis sent as the Klaviyoexternal_id. Customers without a valid email are skipped and counted.config.klaviyo.currencieslimits which currencies (by code) are synced, andtier_programswhich tier programs (by id or name). Both default to all.- Klaviyo sends Orishare no webhooks, so no
webhook_secretis needed.
2. What appears in Klaviyo
Profile properties, per synced currency and tier program (the currency code and the program name are written in lower snake case):
| Property | Value |
|---|---|
orishare_points_<currency> | Points balance |
orishare_lifetime_points_<currency> | Points earned over the customer's lifetime |
orishare_store_credit_<currency> | Store credit balance, in the wallet's currency (for example 12.5) |
orishare_store_credit_<currency>_currency | The wallet's ISO currency, for example USD |
orishare_vip_tier_<program> | Current VIP tier name |
orishare_next_vip_tier_<program> | Next tier name (absent at the top tier) |
orishare_birthday_month, orishare_birthday_day | When a birthday is set |
orishare_referral_code | The customer's referral code, when they have one |
Events (Klaviyo metrics), each with a stable unique_id so a resend is never counted twice:
| Metric | Sent when | Properties |
|---|---|---|
| Orishare Points Earned | a rule awards points | currency, points, status, entry_id |
| Orishare Points Spent | a rule deducts points | currency, points, entry_id |
| Orishare VIP Tier Changed | a customer moves tier | program, tier, previous_tier, direction |
| Orishare Reward Issued | a reward is issued | reward, issuance_id |
| Orishare Store Credit Applied | store credit pays for an order | amount, currency, order_ref (and the event value) |
| Orishare Store Credit Refunded | applied credit is returned | amount, currency, order_ref (and the event value) |
Manual balance adjustments update the profile properties but are not sent as events.
3. How the sync runs
A scheduled pass runs every five minutes. It pushes only the customers whose loyalty state changed since their last push (bulk profile import, in batches of up to 500), and forwards the events recorded since the last pass. Events reach Klaviyo five to ten minutes after they happen. Nothing is sent before the connector is installed: the first pass pushes every customer's current state once.
- When Klaviyo asks Orishare to slow down (HTTP 429), the next attempt waits for the time Klaviyo names. When Klaviyo is unavailable (5xx), attempts back off from one minute up to one hour. Nothing is lost while waiting.
- When Klaviyo rejects the key (401 or 403), the connector is disabled and
GET /v1/connectors/{id}shows why indisabled_reason. Send a new key to reactivate it:
curl -X PATCH "$ORISHARE_API/v1/connectors/$CONNECTOR_ID" -H "Authorization: Bearer $SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{"status":"active","credentials":{"api_key":"pk_..."}}'4. Status and full resync
curl "$ORISHARE_API/v1/connectors/$CONNECTOR_ID/klaviyo/status" -H "Authorization: Bearer $SECRET_KEY"{
"synced": 1200,
"pending": 3,
"skipped_no_email": 40,
"failed": 0,
"resync_pending": false,
"last_run_at": "2026-10-04T12:05:00.000Z",
"last_success_at": "2026-10-04T12:05:00.000Z",
"next_attempt_at": null,
"last_error": null,
"disabled_reason": null
}To push every profile again (for example after deleting properties in Klaviyo), queue a full resync. Asking again while one is pending changes nothing.
curl -X POST "$ORISHARE_API/v1/connectors/$CONNECTOR_ID/klaviyo/resync" \
-H "Authorization: Bearer $SECRET_KEY" -H "Idempotency-Key: klaviyo-resync-1"5. Data sent to Klaviyo
Only what is listed above: the email address, your external id, the loyalty properties and the loyalty events. No other customer attribute leaves Orishare. Removing a birthday or a referral code in Orishare does not delete the property already in Klaviyo.
Shopify and Stripe connectors
Turn verified Shopify orders and Stripe billing events into trusted loyalty events, and let customers spend store credit at Shopify checkout.
Import from another loyalty program
Move customers, point balances, lifetime totals, VIP tiers and birthdays from Smile, LoyaltyLion, Yotpo or any CSV file, check the result before anything is written, and reconcile it against the ledger afterwards.