/** * Abandoned Cart Recovery — TypeScript Types * * @package Swift_Commerce * @since 1.4.0 */ export interface EmailSequenceItem { enabled: boolean delay: number delayUnit: 'minutes' | 'hours' | 'days' subject: string // Pro fields includeCoupon?: boolean couponType?: 'percent' | 'fixed' couponAmount?: number couponExpiry?: number } export interface AbandonedCartSettings { enabled: boolean abandonmentThreshold: number cartExpirationDays: number trackGuestCarts: boolean deleteOnRecovery: boolean emails: EmailSequenceItem[] // Email template (used by Email Customizer) emailHeading: string emailBodyText: string emailShowImage: boolean emailShowTitle: boolean emailShowPrice: boolean emailButtonText: string // Unpaid Order Recovery recoverUnpaidOrders: boolean unpaidOrderThreshold: number unpaidOrderStatuses: string[] unpaidOrderEmails: EmailSequenceItem[] unpaidEmailHeading: string unpaidEmailBodyText: string unpaidEmailButtonText: string // Admin Notification on Recovery (Pro) adminNotifyOnRecovery: boolean adminNotifyEmail: string // Coupon Configuration (Pro) couponPrefix?: string couponIndividualUse?: boolean couponMinimumSpend?: number couponFreeShipping?: boolean couponExcludeSaleItems?: boolean // Coupon Display Styling (Pro) couponBoxBgColor?: string couponBoxBorderColor?: string couponBoxTextColor?: string couponCodeBgColor?: string couponMessageText?: string // Pro fields (added via filter) minCartValue?: number excludeRoles?: string[] webhookUrl?: string } export interface AbandonedCartRecord { id: number user_id: number email: string cart_total: string currency: string status: 'active' | 'abandoned' | 'recovered' | 'unsubscribed' emails_sent: number recovered_at: string | null order_id: number | null created_at: string updated_at: string item_count: number customer_name: string } export interface CartsResponse { success: boolean carts: AbandonedCartRecord[] total: number page: number pages: number } export interface CartProduct { id: number name: string price: string quantity: number image: string permalink: string in_stock: boolean } export interface CartEmailHistory { email_number: number subject: string sent_at: string opened_at: string | null clicked_at: string | null } export interface CartDetailsResponse { success: boolean products: CartProduct[] cart_total: string currency: string customer: { name: string email: string type: 'guest' | 'registered' } status: string coupon_code: string emails_sent: number email_history: CartEmailHistory[] recovered_at: string | null order_id: number | null created_at: string updated_at: string } export interface RecentEmail { id: number cart_id: number email_number: number subject: string sent_at: string opened_at: string | null clicked_at: string | null customer_email: string cart_status: string } export interface PopularProduct { id: number name: string image: string price: string count: number } export interface AnalyticsData { totalAbandoned: number totalRecovered: number recoveryRate: number revenueRecovered: number emailsSent: number emailsOpened: number emailsClicked: number openRate: number clickRate: number currency: string dailyStats: DailyStat[] // Enhanced analytics (Pro) guestAbandoned: number loggedinAbandoned: number guestRecovered: number loggedinRecovered: number totalCoupons: number couponsUsed: number couponRevenue: number popularProducts: PopularProduct[] recentEmails: RecentEmail[] totalUnsubscribed: number } export interface DailyStat { date: string abandoned: number recovered: number revenue: number } export interface CouponRecord { code: string cart_id: number customer_email: string cart_total: string currency: string cart_status: string created_at: string discount_type: string amount: number usage_count: number date_expires: string | null coupon_status: 'active' | 'used' | 'expired' | 'unknown' } export interface CouponsResponse { success: boolean coupons: CouponRecord[] total: number page: number pages: number }