Skip to main content

Types Reference

All TypeScript types are exported from the SDK:
import type { SdkConfigResponse, SdkBranding, ProductReview } from 'react-native-stackfront-sdk';

SDK Config

interface SdkConfigResponse {
  storefrontToken: string;
  shopDomain: string;
  branding: SdkBranding;
  homeLayout: SdkHomeLayout;
  banners: SdkBanner[];
  activePopups: SdkPopup[];
  activeAnnouncements: SdkAnnouncement[];
  featureFlags: SdkFeatureFlags;
  oneSignalAppId: string;
  integrations: Record<string, SdkIntegrationSource>;
  billing: SdkBillingInfo;
}

Branding

interface SdkBranding {
  primaryColor: string;
  secondaryColor: string;
  accentColor: string;
  backgroundColor: string;
  textColor: string;
  logoUrl: string | null;
  splashUrl: string | null;
  fontFamily: string;
  darkModeEnabled: boolean;
}

Home Layout

interface SdkHomeLayoutSection {
  id: string;
  type: string;
  enabled: boolean;
  order: number;
  config: Record<string, unknown> | null;
}

interface SdkHomeLayout {
  sections: SdkHomeLayoutSection[];
}

UI Elements

interface SdkBanner {
  id: string;
  title: string | null;
  subtitle: string | null;
  imageUrl: string;
  mobileImageUrl: string | null;
  actionPayload: Record<string, unknown> | null;
  order: number;
}

interface SdkPopup {
  id: string;
  type: string;
  title: string;
  body: string;
  imageUrl: string | null;
  ctaLabel: string | null;
  ctaActionPayload: Record<string, unknown> | null;
  dismissLabel: string;
  discountCode: string | null;
  triggerType: string;
  triggerDelaySeconds: number;
  showFrequency: string;
}

interface SdkAnnouncement {
  id: string;
  message: string;
  backgroundColor: string | null;
  textColor: string | null;
  actionPayload: Record<string, unknown> | null;
  order: number;
}

Feature Flags

interface SdkFeatureFlags {
  storiesEnabled: boolean;
  loyaltyEnabled: boolean;
  reviewsEnabled: boolean;
  wishlistEnabled: boolean;
  announcementsEnabled: boolean;
  popupsEnabled: boolean;
  abandonedCartEnabled: boolean;
  liveVisitorCountEnabled: boolean;
  recentPurchasePopupEnabled: boolean;
  subscriptionsEnabled: boolean;
}

Billing

interface SdkBillingInfo {
  planName: string;
  subscriptionStatus: string;
  upgradeUrl?: string;
}

Push Notifications

interface RegisterDeviceRequest {
  oneSignalPlayerId: string;
  platform: 'iOS' | 'Android';
  customerId?: string;
  customerEmail?: string;
  appVersion?: string;
  deviceModel?: string;
  osVersion?: string;
}

interface UnsubscribeDeviceRequest {
  oneSignalPlayerId: string;
}

interface LinkCustomerRequest {
  oneSignalPlayerId: string;
  customerId: string;
}

interface NotificationPreference {
  id: string;
  merchantId: string;
  customerId: string;
  marketingEnabled: boolean;
  transactionalEnabled: boolean;
  abandonedCartEnabled: boolean;
  orderUpdatesEnabled: boolean;
  promotionsEnabled: boolean;
  updatedAt: string;
}

interface UpdatePreferencesRequest {
  marketingEnabled: boolean;
  transactionalEnabled: boolean;
  abandonedCartEnabled: boolean;
  orderUpdatesEnabled: boolean;
  promotionsEnabled: boolean;
}

Events

interface SdkEvent {
  eventType: string;
  customerId?: string;
  oneSignalPlayerId?: string;
  platform: 'iOS' | 'Android';
  appVersion?: string;
  sessionId?: string;
  properties?: Record<string, unknown>;
  occurredAt: string;
}

interface SdkEventsBatchRequest {
  events: SdkEvent[];
}

interface SdkEventsBatchResponse {
  acceptedCount: number;
}

Products

// Product types correspond to Shopify Storefront API Product type.
// See graphql/index.ts for the exact query shapes.

Reviews

interface ProductReview {
  id: string;
  productId: string;
  productHandle: string;
  customerId: string | null;
  customerName: string;
  rating: number;
  title: string | null;
  body: string | null;
  mediaItems: ReviewMediaItem[];
  status: string;
  isVerifiedPurchase: boolean;
  helpfulCount: number;
  replyText: string | null;
  repliedAt: string | null;
  createdAt: string;
  updatedAt: string;
}

interface ReviewMediaItem {
  r2Key: string;
  type: string;
  url: string | null;
}

interface CreateProductReviewRequest {
  productId: string;
  productHandle: string;
  customerId?: string;
  customerEmail?: string;
  customerName: string;
  rating: number;
  title?: string;
  body?: string;
}

interface ProductReviewsSdkResponse {
  reviews: ProductReview[];
  averageRating: number;
  totalReviews: number;
  ratingDistribution: Record<string, number>;
}

interface ReviewHelpfulRequest {
  oneSignalPlayerId?: string;
}

Loyalty & Referrals

interface LoyaltyAccountSdkResponse {
  pointsBalance: number;
  lifetimePointsEarned: number;
  tier: LoyaltyTierSdkResponse | null;
  nextTier: NextTierSdkResponse | null;
  referralCode: string;
  programName: string;
}

interface LoyaltyTierSdkResponse {
  name: string;
  badgeColor: string;
  multiplier: number;
}

interface NextTierSdkResponse {
  name: string;
  pointsRequired: number;
  pointsRemaining: number;
}

interface LoyaltyTransactionResponse {
  id: string;
  type: string;
  points: number;
  balanceAfter: number;
  description: string;
  orderId: string | null;
  expiresAt: string | null;
  createdAt: string;
}

interface RedeemPointsRequest {
  customerId: string;
  pointsToRedeem: number;
  orderTotal: number;
}

interface RedeemPointsResponse {
  discountCode: string;
  discountValue: number;
  pointsRedeemed: number;
  remainingBalance: number;
}

interface ReferralSdkResponse {
  referralCode: string;
  totalClicks: number;
  totalConversions: number;
  pointsEarnedFromReferrals: number;
}

interface TrackReferralRequest {
  referralCode: string;
  refereeCustomerId?: string;
  refereeEmail?: string;
}

Stories

interface SdkStoryDto {
  id: string;
  type: string;
  mediaUrl: string;
  description: string | null;
  productHandle: string | null;
  durationSeconds: number;
  order: number;
  backgroundColor: string | null;
  elements: StoryElement[];
  actionPayload: Record<string, unknown> | null;
}

interface SdkStoryGroupDto {
  id: string;
  title: string;
  coverImageUrl: string | null;
  order: number;
  stories: SdkStoryDto[];
}

interface SdkStoriesResponse {
  storyGroups: SdkStoryGroupDto[];
}

interface StoryElement {
  id: string;
  type: string;
  positionX: number;
  positionY: number;
  config: Record<string, unknown>;
  actionPayload?: Record<string, unknown> | null;
}

interface StoryViewedRequest {
  storyId: string;
  storyGroupId: string;
  watchedFullDuration: boolean;
  customerId?: string;
  oneSignalPlayerId?: string;
}

interface StoryTappedRequest {
  storyId: string;
  elementId: string;
  actionTaken: boolean;
  customerId?: string;
  oneSignalPlayerId?: string;
}

interface StoryPollVoteRequest {
  storyId: string;
  elementId: string;
  optionId: string;
  customerId?: string;
  oneSignalPlayerId?: string;
}

interface PollOptionResult {
  optionId: string;
  label: string;
  voteCount: number;
  percentage: number;
}

interface StoryPollVoteResponse {
  elementId: string;
  options: PollOptionResult[];
}

Social Proof

interface ProductViewEventRequest {
  productId: string;
  oneSignalPlayerId?: string;
}

interface SocialProofSignalsResponse {
  liveViewerCount: number | null;
  recentPurchase: RecentPurchaseSignal | null;
  lowStockBadge: LowStockSignal | null;
}

interface RecentPurchaseSignal {
  customerName: string;
  customerLocation: string;
  productTitle: string;
  timeAgo: string;
}

interface LowStockSignal {
  show: boolean;
  label: string;
}

Integrations

interface IntegrationDataResponse {
  integrationSlug: string;
  dataType: string;
  entityId: string;
  data: string;
  syncedAt: string;
}

interface SdkIntegrationSource {
  source: string;
  connected: boolean;
}