--- name: optimizely-experimentation description: Optimizely Experimentation Full Stack SDK patterns --- # Optimizely Experimentation SDK ## Overview This skill covers Optimizely Full Stack SDK patterns for feature flags, A/B testing, and event tracking. ## SDK Initialization ### Basic Setup ```typescript import { createInstance } from '@optimizely/optimizely-sdk'; const optimizelyClient = createInstance({ sdkKey: process.env.NEXT_PUBLIC_OPTIMIZELY_SDK_KEY, datafileOptions: { autoUpdate: true, updateInterval: 60000, // 1 minute }, eventBatchSize: 10, eventFlushInterval: 1000, }); export default optimizelyClient; ``` ### React Provider Setup ```tsx import { OptimizelyProvider, createInstance } from '@optimizely/react-sdk'; const optimizely = createInstance({ sdkKey: process.env.NEXT_PUBLIC_OPTIMIZELY_SDK_KEY, }); function App() { return ( ); } ``` ## Feature Flags ### Using useDecision Hook ```tsx import { useDecision } from '@optimizely/react-sdk'; function FeatureComponent() { const [decision, clientReady] = useDecision('feature_key'); if (!clientReady) { return ; } if (!decision.enabled) { return null; } return ; } ``` ### Typed Feature Variables ```typescript interface PricingVariables { discount: number; currency: string; showBadge: boolean; } function usePricingFeature() { const [decision, clientReady] = useDecision('pricing_feature'); return { isReady: clientReady, isEnabled: decision.enabled, discount: decision.variables.discount as number, currency: decision.variables.currency as string, showBadge: decision.variables.showBadge as boolean, }; } ``` ## A/B Testing ### Experiment with Variations ```tsx function CheckoutExperiment() { const [decision, clientReady] = useDecision('checkout_experiment'); if (!clientReady) { return ; } switch (decision.variationKey) { case 'single_page': return ; case 'express': return ; default: return ; } } ``` ### Server-Side Experiment ```typescript // pages/api/checkout.ts or app/api/checkout/route.ts export async function getServerSideProps({ req }) { const userId = getUserId(req); const decision = optimizelyClient.decide('checkout_experiment', userId); return { props: { variation: decision.variationKey, userId, }, }; } ``` ## Event Tracking ### Basic Event ```typescript const userContext = optimizelyClient.createUserContext(userId, { membershipTier: user.tier, country: user.country, }); userContext.trackEvent('purchase_completed', { revenue: 9900, // In cents currency: 'USD', itemCount: 3, }); ``` ### With React Hook ```tsx import { useTrackEvent } from '@optimizely/react-sdk'; function PurchaseButton({ amount }: { amount: number }) { const track = useTrackEvent(); const handlePurchase = async () => { const result = await processPayment(); if (result.success) { track('purchase_completed', { revenue: amount * 100, currency: 'USD', }); } }; return ; } ``` ## Best Practices 1. **Use timeout** in OptimizelyProvider for anti-flicker 2. **Check clientReady** before rendering variations 3. **Use typed variables** for type safety 4. **Track after success** not before actions 5. **Never include PII** in events or attributes 6. **Use environment variables** for SDK keys