Բոլոր դասերը
Էլեկտրոնային առևտուրԱռաջադեմ13 րոպե ընթերցումԻմ ստեկում

Ակցիաներ և լոյալություն

Զեղչերի կանոններ, stacking, լավագույն գնի հաշվարկ, cashback, մակարդակներ և referral-ներ՝ առանց գումար կորցնելու։

  • Discount rules
  • Stacking
  • Cashback
  • Tiers
  • Referrals
Քայլ 1/5
Զամբյուղ է գալիս՝ երեք շապիկ $20-ով և $5 առաքում։ Ընդհանուր՝ $65։ Promo engine-ը թևերը քշտում է։

30 վայրկյանում

Ակցիաները և լոյալության ծրագրերը այն միջոցն են, որով խանութը մարդկանց հետ է բերում՝ զեղչեր, անվճար առաքում, նվերներ, cashback, մակարդակներ և պարգևներ ընկերներին հրավիրելու համար։ Ներքուստ դրանք կանոնների շարժիչ (rule engine) են, որը որոշում է, թե որ առաջարկներն են կիրառվում զամբյուղի նկատմամբ, ինչպես են դրանք համակցվում և ինչ է վերջում վճարում հաճախորդը։ Բարդ մասերն են stacking-ի հստակ կանոնները, կանխատեսելի լավագույն գինը և պաշտպանությունը չարաշահումներից։

Ինչու եմ օգտագործում

  • Ես օգտագործում եմ կանոնների վրա հիմնված ակցիաների շարժիչներ, որովհետև դրանք կառուցել եմ մի քանի խանութի համար․ ռեստորանային պատվերներ, գեղեցկության ապրանքներ և գինու ակումբ՝ բոլորին պետք էին զեղչեր, որոնք մարքեթինգը կարող է կարգավորել առանց ծրագրավորողի։
  • Մարքեթինգի թիմերը առաջարկները փոխում են ամեն շաբաթ։ Եթե յուրաքանչյուր արշավ կոդի փոփոխություն է պահանջում, խանութը կամ լճանում է, կամ bug-եր է release անում։
  • Հաճախորդները զայրանում են, երբ երկու վավեր առաջարկ ավելի վատ գին են տալիս, քան մեկը։ Համակցությունները գնահատելը և լավագույն արդյունքն ընտրելը կանխում է դա։
  • Լոյալության գումարն իրական գումար է։ Wallet-ները, cashback-ը և referral-ները պահանջում են նույն ուշադրությունը, ինչ վճարումները՝ ledger-ներ, ժամկետի կանոններ և խարդախության ստուգումներ։

Ինչպես է աշխատում

01Ակցիայի կանոնի անատոմիան

Յուրաքանչյուր ակցիա ունի երեք մաս՝ պայմաններ, գործողություն և սահմանափակումներ։ Պայմանները որոշում են՝ արդյոք այն կիրառվում է․ զամբյուղի նվազագույն գումար, կոնկրետ ապրանքներ կամ կատեգորիաներ, հաճախորդի սեգմենտ կամ լոյալության մակարդակ, միայն առաջին պատվեր, ալիք (վեբ կամ հավելված), ամսաթվերի միջակայք, շաբաթվա օր։ Գործողությունն այն է, ինչ ակցիան տալիս է՝ տոկոսային զեղչ, ֆիքսված գումարի զեղչ, ֆիքսված գին, buy X get Y, նվեր ապրանք կամ անվճար առաքում։ Սահմանափակումները վերահսկողության տակ են պահում այն՝ ընդհանուր օգտագործումներ, օգտագործումներ մեկ հաճախորդի համար, առավելագույն զեղչ, բյուջե։ Ակցիաները կարող են լինել ավտոմատ (կիրառվում են, երբ պայմանները համընկնում են) կամ ձեռքով (ակտիվացվում են կոդով կամ կոճակով)։ Կանոնները որպես տվյալ պահելը՝ տիպավորված պայմաններով և գործողություններով տողեր, կոդի փոխարեն, հենց դա է թույլ տալիս մարքեթինգին աշխատել առանց ծրագրավորողների։

  • Տոկոսային՝ 10% զեղչ զամբյուղի կամ ընտրված տողերի վրա, ցանկության դեպքում՝ վերին սահմանով։
  • Ֆիքսված՝ 5.00 զեղչ 30.00-ից բարձր պատվերների համար։
  • Առաջին պատվեր, ծննդյան օր, լոյալության մակարդակ՝ պայմաններ հաճախորդի, ոչ թե զամբյուղի վրա։
  • Նվեր ապրանք կամ անվճար առաքում՝ գործողություններ, որոնք փոխում են տողերը կամ վճարները, ոչ միայն ընդհանուր գումարը։

02Stacking, առաջնահերթություն և բացառիկություն

Stacking-ը նշանակում է մեկ պատվերի վրա մի քանի ակցիա համակցել։ Առանց կանոնների զեղչերը կուտակվում և վնասի են վերածվում։ Գործնական մոդել՝ յուրաքանչյուր ակցիա ունի առաջնահերթություն և stacking ռեժիմ՝ exclusive (ոչնչի հետ չի համակցվում), համակցելի ցանկացածի հետ կամ համակցելի միայն իր խմբի ներսում։ Որոշեք նաև կիրառման հերթականությունը․ տոկոսային զեղչերը սովորաբար կիրառվում են ֆիքսվածներից առաջ, իսկ տողի զեղչերը՝ զամբյուղի զեղչերից առաջ, որովհետև հերթականությունը փոխում է արդյունքը։ Որոշեք՝ զեղչը կիրառվում է այլ զեղչերից առաջ, թե հետո եղած գնի վրա, և երբեք թույլ մի տվեք, որ ընդհանուր գումարն իջնի զրոյից կամ կարգավորված մարժայից ցածր։ Այս կանոնները գրի առեք որպես կարճ աղյուսակ, որը մարքեթինգը հաստատում է․ հետո իրականացրեք հենց այդ աղյուսակը և թեստավորեք այն։

03Լավագույն գին հաճախորդի համար

Երբ մի քանի առաջարկ իրավունք ունի կիրառվելու, բայց բոլորը չեն կարող համակցվել, ո՞րն է հաղթում։ Ամենաբարեհամբույր պատասխանն է՝ այն համակցությունը, որը հաճախորդին ամենացածր ընդհանուր գումարն է տալիս։ Շարժիչը նախ ֆիլտրում է կիրառելի ակցիաները, ապա կառուցում stacking-ի կանոններով թույլատրված վավեր համակցությունները, յուրաքանչյուրը սիմուլյացիա անում զամբյուղի պատճենի վրա և ընտրում ամենաէժան արդյունքը՝ դետերմինիստիկ tie-breaker-ով, օրինակ՝ ավելի բարձր առաջնահերթություն, ապա ավելի հին ակցիա։ Համակցությունների քանակն արագ է աճում, ուստի պահեք այն սահմանափակ․ exclusive առաջարկները կազմում են մեկ տարրից բաղկացած սցենարներ, իսկ համակցելիները սովորաբար greedy կերպով stack են արվում իրենց խմբի ներսում։ Վերադարձրեք ոչ միայն ընդհանուր գումարը, այլև բացատրություն յուրաքանչյուր տողի համար («Ամառային զեղչ −10%»), որը երևում է կտրոնի վրա և հեշտացնում է support-ի հարցերը։

ts
type Cart = { lines: { id: string; price: number; qty: number }[] };
type Promo = { id: string; priority: number; exclusive: boolean; apply: (c: Cart) => number };
 
// Returns the discount combination with the lowest final total
export function bestScenario(cart: Cart, eligible: Promo[]) {
  const subtotal = cart.lines.reduce((s, l) => s + l.price * l.qty, 0);
  const stackable = eligible.filter((p) => !p.exclusive).sort((a, b) => b.priority - a.priority);
  const scenarios: Promo[][] = [stackable, ...eligible.filter((p) => p.exclusive).map((p) => [p])];
 
  let best = { promos: [] as Promo[], total: subtotal };
  for (const promos of scenarios) {
    const discount = promos.reduce((sum, p) => sum + p.apply(cart), 0);
    const total = Math.max(0, subtotal - discount);
    if (total < best.total) best = { promos, total };
  }
  return best; // ties keep the earlier, higher-priority scenario
}

04Wallet-ներ, cashback և լոյալության մակարդակներ

Cashback-ը պատվերի տոկոսը վերադարձնում է հաճախորդի wallet՝ որպես խանութի կրեդիտ։ Wallet-ին վերաբերվեք որպես ledger-ի․ երբեք մի պահեք միայն մնացորդը՝ պահեք յուրաքանչյուր մուտք և ելք՝ պատճառով և պատվերի reference-ով, և մնացորդը ստացեք կամ ստուգեք այդ տողերից։ Cashback-ը հաշվեք միայն այն բանից հետո, երբ պատվերն առաքված է կամ վերադարձի պատուհանը փակված է, այլապես մարդիկ գնում են, հավաքում cashback-ը և վերադարձնում ապրանքը։ Wallet-ից ծախսելը checkout-ում վճարման եղանակ է, որը կիրառվում է ակցիաներից հետո։ Լոյալության մակարդակները (օրինակ՝ Bronze, Silver, Gold) պարգևատրում են հաճախորդներին ըստ ծախսի կամ միավորների որոշակի ժամանակահատվածում։ Սահմանեք, թե ինչպես է հաճախորդը բարձրանում, երբ կարող է իջնել և արդյոք կա արտոնյալ ժամանակահատված (grace period)։ Միավորներն ու մնացորդները հաճախ սպառվում են անգործության դեպքում․ ուղարկեք հիշեցում մինչ այդ։

  • Ledger-ի տողեր՝ credit, debit, expire, manual adjustment, յուրաքանչյուրը՝ ով և ինչու։
  • Աշխատակիցների ձեռքով ճշգրտումները արժանի են audit log-ի, իսկ խոշորները՝ երկրորդ հաստատման։
  • Մակարդակները վերահաշվարկեք ժամանակացույցով և սինքրոնացրեք հաճախորդների սեգմենտների հետ։

05Referral-ներ, վաուչերներ և խարդախության ստուգումներ

Referral ծրագիրը պարգևատրում է հաճախորդին ընկերներին հրավիրելու համար․ յուրաքանչյուր օգտատեր ստանում է կոդ կամ հղում, ընկերը գրանցվում է դրանով, և երկուսն էլ պարգև են ստանում ընկերոջ առաջին որակավորող պատվերից հետո։ Հետևեք click-երին և գրանցումներին, իսկ մոբայլ հավելվածների համար օգտագործեք deferred deep link-եր, որպեսզի կոդը պահպանվի հավելվածի տեղադրումից հետո։ Պարգևները հաշվարկեք ուշացված batch job-ով, ոչ թե ակնթարթորեն, որպեսզի կարողանաք չեղարկել վերադարձված պատվերների պարգևները։ Referral-ներն ու վաուչերները չարաշահումներ են գրավում՝ ինքնահրավեր երկրորդ հաշվով, շատ հաշիվներ մեկ հեռախոսի կամ քարտի վրա, կոդեր, որոնք կիսվում են կուպոնների կայքերում։ Պարզ ստուգումները բռնում են դրա մեծ մասը՝ նույն սարքը, հեռախոսը, քարտի fingerprint-ը կամ հասցեն, ինչ հրավիրողինը, վերադարձված պատվեր, կարճ ժամանակում մեկ կոդով չափազանց շատ գրանցումներ։ Վաուչերները պետք է լինեն պատահական, բավական երկար՝ գուշակելուն դիմանալու համար, rate-limited և մեկանգամյա, երբ արժեք են կրում։

Օգտագործեք, երբ

  • Մարքեթինգը հաճախակի արշավներ է անցկացնում և պետք է դրանք կարգավորի առանց ծրագրավորողների։
  • Բիզնեսը հենվում է կրկնվող հաճախորդների վրա՝ սննդի պատվերներ, գեղեցկություն, կենդանիների ապրանքներ, սուրճ, գինու ակումբներ։
  • Ձեզ պետք են պարգևների մի քանի տեսակներ՝ զեղչեր, նվերներ, cashback, մակարդակներ, referral-ներ, որոնք պետք է կանխատեսելիորեն փոխազդեն։

Մի՛ օգտագործեք, երբ

  • Խանութ մեկ-երկու պարզ կուպոնային կոդով․ պլատֆորմի ներկառուցված կուպոնները բավարար են։
  • Երբ մարժաները նեղ են, և թիմը չի կարող չափել ակցիայի էֆեկտը․ առանց analytics-ի զեղչերը պարզապես գումար են նվիրում։
  • Մի կառուցեք միավորների «արժույթ», եթե պարզ տոկոսային զեղչը նույն նպատակին է հասնում։

Այլընտրանքներ

  • Պլատֆորմի զեղչեր (Shopify, WooCommerce)

    Լավ են ստանդարտ կուպոնների և ավտոմատ զեղչերի համար․ սահմանափակ են, երբ stacking-ը կամ custom պայմանները բարդանում են։

  • Talon.One / Voucherify

    Hosted ակցիաների և լոյալության շարժիչներ՝ rule builder-ներով և API-ներով․ արագ են ներդրվում, պարբերական վճար՝ ըստ ծավալի։

  • Լոյալության SaaS (Smile.io, Yotpo)

    Պատրաստի միավորների և referral-ի widget-ներ․ ավելի քիչ վերահսկողություն կանոնների և տվյալների վրա։

Լավագույն պրակտիկաներ

  1. Ակցիաները պահեք որպես տվյալ՝ տիպավորված պայմաններով, գործողություններով և սահմանափակումներով։
  2. Գրեք stacking-ի և առաջնահերթության բացահայտ կանոններ և ստացեք բիզնեսի հաստատումը։
  3. Գնահատեք համակցությունները և դետերմինիստիկ կերպով ընտրեք հաճախորդի համար լավագույն ընդհանուր գումարը։
  4. Ցույց տվեք յուրաքանչյուր կիրառված զեղչի բացատրությունը՝ ըստ տողի։
  5. Wallet-ները և միավորները պահեք որպես ledger-ներ․ երբեք միայն մնացորդի սյունակ։
  6. Cashback-ը և referral-ի պարգևները հետաձգեք, մինչև պատվերներն այլևս հնարավոր չլինի վերադարձնել։
  7. Log արեք և վերանայեք ձեռքով ճշգրտումները․ խոշորների համար պահանջեք երկրորդ հաստատում։

Տարածված սխալներ

  • Արշավները hard-code անել, այնպես որ յուրաքանչյուր ակցիա դառնում է deployment։
  • Թույլ տալ, որ զեղչերը կուտակվեն պատվերի արժեքից ավելի կամ ինքնարժեքից ցածր։
  • Զամբյուղի էջում և checkout-ում տարբեր արդյունքներ, որովհետև շարժիչն աշխատում է երկու տեղում։
  • Cashback-ը հաշվել վճարման պահին, հետո վերադարձների վրա գումար կորցնել։
  • Referral ծրագրեր առանց խարդախության ստուգումների, որոնք կեղծ հաշիվների ֆերմաներ են գրավում։

Խորը վերլուծություն

06Engine-ի ճարտարապետություն. մաքուր pricing pipeline

Ամենահուսալի promotion engine-ները pure function-ներ են. տրված զամբյուղի, հաճախորդի context-ի, ժամանակի և ակտիվ ակցիաների ցուցակի դեպքում դրանք վերադարձնում են գնահատված զամբյուղ և բացատրություն՝ առանց database-ում որևէ բան գրելու։ Դա հեշտացնում է դրանց թեստավորումը ճշգրիտ գումարներով, դարձնում է անվտանգ դրանց գործարկումը զամբյուղի յուրաքանչյուր փոփոխության ժամանակ և ապահովում նույն արդյունքը զամբյուղի էջում, checkout-ում և admin preview-ներում։ Pipeline-ը կառուցեք փուլերով. բեռնեք թեկնածու ակցիաները (նախապես ֆիլտրված ըստ ամսաթվի, ալիքի և կարգավիճակի՝ index-ով), գնահատեք պայմանները, կառուցեք scenario-ներ, կիրառեք action-ները զամբյուղի պատճենի վրա, ընտրեք լավագույնը և ստացեք տողի մակարդակի adjustment-ներ։ Side effect-ները՝ օգտագործման հաշվարկը, voucher-ի դեբետը, cashback-ի կրեդիտը, տեղի են ունենում ավելի ուշ, միայն երբ պատվերը ստեղծվում կամ ավարտվում է, պատվերի transaction-ի ներսում։

ts
type Ctx = { now: Date; customerId?: string; segment: string[]; channel: "web" | "app" };
type Adjustment = { lineId?: string; promoId: string; amount: number; label: string };
 
// Pure: same input → same output, no I/O
export function priceCart(cart: Cart, ctx: Ctx, promos: Promo[]) {
  const eligible = promos.filter((p) => p.isActive(ctx.now) && p.matches(cart, ctx));
  const best = bestScenario(cart, eligible);
  const adjustments: Adjustment[] = best.promos.flatMap((p) => p.adjustments(cart));
  return { total: best.total, adjustments };
}

07Օգտագործման սահմանափակումներ concurrency-ի պայմաններում

«Առաջին 500 հաճախորդները» և «մեկ օգտագործում յուրաքանչյուր հաճախորդի համար» պարզ են հնչում, մինչև 2,000 մարդ նույն րոպեին checkout չանի։ Օգտագործումները SELECT COUNT-ով հաշվելը և հետո insert անելը race condition է. բոլորը տեսնում են 499։ Սահմանափակումները կիրառեք database-ի միջոցով։ Գլոբալ սահմանի համար պահեք counter տող և ավելացրեք այն պայմանականորեն (UPDATE promotions SET used = used + 1 WHERE id = :id AND used < max_uses) պատվերի transaction-ում։ Յուրաքանչյուր հաճախորդի սահմանի համար insert արեք redemption տող՝ (promotion_id, customer_id)-ի վրա unique constraint-ով։ Ազատեք օգտագործումը, եթե պատվերը չեղարկվում է մինչև վճարումը։ Բյուջեի սահմաններն աշխատում են նույն կերպ՝ քանակների փոխարեն գումարներով։ Նորից վալիդացրեք checkout-ում և ընդունեք, որ զամբյուղի էջը կարող է ցույց տալ ակցիա, որը մեկ վայրկյան անց արդեն չկա. հստակ տեղեկացրեք հաճախորդին։

08Ինչպես չափել՝ արդյոք ակցիան աշխատում է

Ակցիան ծախս է, և հարցն այն է, թե ինչ է այն գնել։ Յուրաքանչյուր ակցիայի համար հետևեք. պատվերներ, տրված զեղչ, եկամուտ, մարժա զեղչից հետո, նոր և վերադարձող հաճախորդներ, redemption rate։ Հում թվերը մոլորեցնում են, որովհետև շատ հաճախորդներ ամեն դեպքում կգնեին։ Ազնիվ չափանիշը incrementality-ն է. համեմատեք պատահականորեն ընտրված խումբը, որը ստանում է առաջարկը, holdout խմբի հետ, որը չի ստանում, և նայեք պատվերների ու մարժայի տարբերությանը։ Նույնիսկ newsletter-ի կուպոնի պարզ 90/10 բաժանումը ավելի լավ պատասխաններ է տալիս, քան ցանկացած dashboard։ Loyalty ծրագրերի դեպքում հետևեք կրկնակի գնումների հաճախականությանը և պատվերների միջև ընկած ժամանակին՝ ըստ tier-ի, ինչպես նաև չօգտագործված միավորների կամ wallet-ի բալանսների պարտավորությանը, որը ֆինանսական բաժինը կարող է ստիպված լինել դիտարկել որպես հետաձգված ծախս։

  • Հաշվետվությունների համար պատվերի տողերի վրա պահեք կիրառված ակցիաների ID-ները և գումարները։
  • Զեղչի ծախսը ներկայացրեք որպես եկամտի տոկոս՝ ըստ յուրաքանչյուր արշավի։
  • Ավտոմատ առաջարկների համար, ինչպիսիք են win-back կուպոնները, պահեք holdout խումբ։

09Միավորների և wallet-ի հաշվառման եզրային դեպքեր

Ledger-ի վրա հիմնված wallet-ները առաջացնում են եզրային դեպքեր, որոնք արժե նախապես որոշել։ Ժամկետի ավարտ. first-in-first-out ծախսման դեպքում դեբետները նախ սպառում են ամենահին կրեդիտները, ուստի expiry job-ը ճշգրիտ գիտի, թե յուրաքանչյուր կրեդիտից որքան է մնացել. դա էժան դարձնելու համար պահեք մնացորդային գումարները յուրաքանչյուր credit lot-ի համար։ Մասնակի refund-ներ. եթե մասամբ wallet-ի կրեդիտով վճարված պատվերը մասամբ refund է արվում, որոշեք՝ նախ կրեդի՞տը, թե՞ քարտին է վերադարձվում գումարը, և cashback-ը չեղարկեք համամասնորեն։ Concurrency. դեբետները պետք է lock անեն հաճախորդի wallet-ի տողը կամ օգտագործեն պայմանական update, որպեսզի երկու զուգահեռ checkout չկարողանան ծախսել նույն բալանսը։ Արժույթ. wallet-ը պետք է պահի մեկ արժույթ։ Իրավական տեսանկյունից որոշ երկրներում store credit-ը կամ միավորները կարող են համարվել stored value կամ e-money՝ սպառողական և հաշվապահական կանոններով, ուստի ստուգեք, նախքան հաճախորդներին թույլ կտաք իրական գումարով լիցքավորել բալանսը։

Իրական իրավիճակներ

01

Կուպոնը արտահոսում է deal site

Խնդիր

Փոքր լսարանի համար նախատեսված 30%-անոց influencer կոդը հայտնվում է կուպոնների aggregator-ում։ Մի քանի ժամում այն օգտագործվում է հազարավոր անգամներ, և օրվա մարժան դառնում է բացասական։

Ինչպես լուծել

Անմիջապես դադարեցրեք ակցիան admin-ից. յուրաքանչյուր ակցիայի պետք է ակտիվության switch, որն ուժի մեջ է մտնում առանց deploy-ի։ Արդեն կատարված պատվերները սովորաբար կատարվում են՝ վստահությունը պահպանելու համար, եթե պայմանները չեղարկում չեն թույլատրում։ Ապա ուղղեք դիզայնը. influencer արշավներին տվեք օգտագործման ընդհանուր սահման և բյուջեի սահման, կիրառեք դրանք ատոմար կերպով և ավելացրեք յուրաքանչյուր հաճախորդի սահման՝ redemption-ի unique constraint-ով։ Թիրախային առաջարկների համար մեկ ընդհանուր կոդի փոխարեն օգտագործեք յուրաքանչյուր ստացողի համար գեներացված եզակի, միանվագ կոդեր։ Ավելացրեք alert redemption-ի արագության վրա, օրինակ՝ սպասվող ժամային օգտագործումներից երեք անգամ ավելի, որպեսզի հաջորդ արտահոսքը բռնվի րոպեների ընթացքում։

02

Marketing-ը ուզում է «գնիր երկու, ամենաէժանը՝ անվճար»

Խնդիր

Ընթացիկ engine-ը աջակցում է միայն տոկոսային և ֆիքսված գումարով զեղչեր ամբողջ զամբյուղի համար։ Նոր առաջարկը պետք է աշխատի մի ամբողջ կատեգորիայում՝ խառը գներով և քանակներով։

Ինչպես լուծել

Հատուկ դեպքի փոխարեն ավելացրեք նոր action type։ Համապատասխան տողերը բացեք միավորների (3 քանակով տողը դառնում է երեք միավոր), դասավորեք դրանք ըստ գնի և պահանջվող չափի յուրաքանչյուր խմբի համար ամենաէժան միավորը նշեք 100% զեղչված։ Վերադարձրեք adjustment-ներ ըստ տողերի, այնպես որ երկու միավորով տողը կարող է ստանալ մեկ անվճար միավոր։ Որոշեք և փաստաթղթավորեք կանոնները. արդյոք առավելությունը ստանում է ամենաէժան, թե ամենաթանկ խումբը, արդյոք այլ զեղչեր կիրառվում են անվճար միավորի վրա և ինչպես է աշխատում մասնակի վերադարձը։ Ավելացրեք թեստեր խառը գների, կենտ քանակների և refund-ների համար և անդորրագրի տողում ցույց տվեք «1 անվճար»։

03

Cashback-ի բալանսները աճում են սպասվածից արագ

Խնդիր

Ֆինանսական բաժինը նկատում է, որ wallet-ի չօգտագործված բալանսները վեց ամսում եռապատկվել են, և որոշ հաճախորդներ մեծ բալանսներ ունեն այն պատվերներից, որոնք հետագայում վերադարձվել են։

Ինչպես լուծել

Նախ audit. նորից կառուցեք բալանսները ledger-ից և գտեք կրեդիտները, որոնց աղբյուր պատվերները refund են արվել առանց համապատասխան հակադարձ գրառման։ Ուղղեք flow-ը, որպեսզի cashback-ը կրեդիտավորվի միայն վերադարձի պատուհանի փակվելուց հետո, իսկ refund-ը ավտոմատ կերպով գրի ledger-ի հակադարձ գրառում։ Ներմուծեք ժամկետի ավարտ ոչ ակտիվ բալանսների համար՝ հիշեցումով, ասենք, 14 օր առաջ, և ժամկետի ավարտը գրանցեք որպես ledger-ի գրառման առանձին տեսակ։ Ամեն ամիս չօգտագործված բալանսը ներկայացրեք որպես պարտավորություն, որպեսզի ֆինանսական բաժինը կարողանա պլանավորել։ Եթե բալանսները պետք է հետ վերցվեն այն հաճախորդներից, ովքեր արդեն ծախսել են դրանք, թույլ տվեք բացասական բալանսներ, որոնք կհաշվանցվեն ապագա կրեդիտների հետ՝ հաճախորդներից գումար գանձելու փոխարեն։

Արագ ուղեցույց

Օգտագործման գլոբալ սահման՝ ատոմար
UPDATE promotions SET used = used + 1 WHERE id = :id AND used < max_uses;
Մեկ օգտագործում յուրաքանչյուր հաճախորդի համար
CREATE UNIQUE INDEX redemptions_uq ON promotion_redemptions (promotion_id, customer_id);
Wallet-ի բալանսը ledger-ից
SELECT COALESCE(SUM(amount), 0) FROM wallet_entries WHERE customer_id = :id;
Wallet-ի lock դեբետից առաջ
SELECT id FROM wallets WHERE customer_id = :id FOR UPDATE;
Պատահական voucher կոդ (Node)
crypto.randomBytes(8).toString("base64url").toUpperCase() // ~64 bits of entropy
Voucher-ի փորձերի rate limit (Laravel)
Route::post('/cart/voucher', ApplyVoucher::class)->middleware('throttle:10,1');
Ակտիվ ակցիաների index
CREATE INDEX promotions_active_idx ON promotions (status, starts_at, ends_at);
Referral պարգևների settlement ամեն ժամ
Schedule::job(new SettleReferralRewards)->hourly()->withoutOverlapping();

Իմ իրական նախագծերում

  • Ռեստորանային ցանցի պլատֆորմում ես կառուցեցի մոտ 1,335 տողանոց ակցիաների շարժիչ՝ սովորական, առաջին պատվերի, լոյալության մակարդակի և cashback ակցիաներ, ձեռքով և ավտոմատ, նվեր ապրանքներ, stacking-ի կանոններով և համակցությունների սիմուլյացիայով՝ լավագույն ընդհանուր գումարն ընտրելու համար․ ինչպես նաև cashback wallet՝ մակարդակային տոկոսներով և վաուչերների կանխիկացմամբ։
  • Գեղեցկության e-commerce խանութում մոտ 1,294 տողանոց նմանատիպ շարժիչը մշակում է սովորական, առաջին պատվերի, լոյալության մակարդակի, cashback և անվճար նվերի ակցիաներ՝ լավագույն սցենարի ընտրությամբ և պլանավորված ժամկետանցով, կապված store-credit wallet-ի հետ։
  • Կենդանիների ապրանքների պլատֆորմում կառուցեցի referral ծրագիր՝ հրավերի կոդերով, click-երի և share-երի հետևմամբ, deferred deep link-երով հավելվածի տեղադրումների համար, խարդախության ստուգումներով և ժամային պարգևների հաշվարկով․ իսկ գինու ակումբն աշխատում է շշերի գրանցման կոդերով, միավորներով և լոյալության հինգ մակարդակով։

Հարցեր և պատասխաններ

Q1Ինչպե՞ս եք որոշում, թե որ ակցիան է կիրառվում, երբ մի քանիսը կիրառելի են։

Նախ ֆիլտրում եմ այն ակցիաները, որոնց պայմանները համընկնում են զամբյուղի և հաճախորդի հետ։ Հետո կառուցում եմ միայն stacking-ի կանոններով թույլատրված համակցությունները՝ exclusive ակցիաները առանձին, համակցելիները միասին՝ առաջնահերթության կարգով։ Յուրաքանչյուր սցենար սիմուլյացիա եմ անում զամբյուղի պատճենի վրա և ընտրում ամենացածր վերջնական գումարը՝ դետերմինիստիկ tie-breaker-ով, օրինակ՝ առաջնահերթությամբ։ Նույն շարժիչն աշխատում է զամբյուղի էջի և checkout-ի համար, այնպես որ հաճախորդը վճարման պահին երբեք այլ գին չի տեսնում։ Արդյունքը ներառում է բացատրություն ըստ տողի՝ կտրոնների և support-ի համար։

Q2Ինչո՞ւ wallet-ը մոդելավորել որպես ledger, այլ ոչ մնացորդի սյունակ։

Մնացորդի սյունակը ասում է, թե ինչ ունի մարդը, բայց ոչ՝ ինչու։ Ledger-ի դեպքում յուրաքանչյուր մուտք, ելք, ժամկետանց և ձեռքով ճշգրտում տող է՝ գումարով, պատճառով, reference-ով և հեղինակով։ Կարող եք բացատրել ցանկացած մնացորդ, հետ շրջել կոնկրետ գործարք, սպառել հին կրեդիտները ըստ տարիքի և audit անել աշխատակիցների գործողությունները։ Concurrency-ն էլ ավելի անվտանգ է՝ տողեր եք ավելացնում թիվը վերագրելու փոխարեն։ Cache-ավորված մնացորդի սյունակն արագության համար նորմալ է, բայց այն պետք է հնարավոր լինի ստանալ ledger-ից և պարբերաբար ստուգել։

Q3Ինչպե՞ս եք կանխում referral-ի խարդախությունը։

Պարգևները վճարվում են ուշացված settlement job-ով, միայն այն բանից հետո, երբ ընկերոջ առաջին պատվերն ավարտված է և վերադարձի պատուհանն անցել է։ Վճարելուց առաջ ստուգումները համեմատում են նոր հաշիվը հրավիրողի հետ՝ նույն սարք, հեռախոսահամար, վճարային քարտի fingerprint, առաքման հասցե կամ IP pattern։ Velocity limit-ները նշում են այն կոդերը, որոնք կարճ ժամանակում չափազանց շատ գրանցումներ ունեն։ Կասկածելի դեպքերը պահվում են վերանայման համար՝ ավտոմատ մերժվելու փոխարեն։ Կոդերը կարելի է չեղարկել, իսկ վերադարձված պատվերները ledger-ի միջոցով հետ են շրջում պարգևները։

Q4Նախ տոկո՞ս, թե՞ ֆիքսված գումար։

Դա փոխում է արդյունքը, ուստի պետք է գիտակցված կանոն լինի։ 100.00 զամբյուղի վրա 10% զեղչը, ապա 5.00 զեղչը տալիս է 85.00, իսկ 5.00 զեղչը, ապա 10%-ը՝ 85.50, այսինքն՝ տոկոսը նախ կիրառելը հաճախորդի համար ավելի էժան է։ Շատ խանութներ նախ կիրառում են տողի մակարդակի զեղչերը, հետո զամբյուղի մակարդակի, ապա տոկոսայինը՝ ֆիքսվածից առաջ։ Ամենակարևորը հետևողականությունն է՝ նույն հերթականությունն ամենուր, փաստաթղթավորված և ծածկված թեստերով՝ ճշգրիտ գումարներով։

Q5Ինչպե՞ս կնախագծեիք լոյալության մակարդակները։

Սահմանեք չափանիշը (ծախս կամ միավորներ) և պատուհանը (շարժվող 12 ամիս կամ օրացուցային տարի), շեմերը և յուրաքանչյուր մակարդակի առավելությունները, օրինակ՝ ավելի բարձր cashback տոկոս։ Հետո սահմանեք անհարմար մասերը՝ երբ է հաճախորդն իջեցվում, կա՞ արտոնյալ ժամանակահատված կամ նվազագույն մակարդակ, և ինչ է լինում վերադարձների դեպքում։ Պլանավորված job-ը վերահաշվարկում է մակարդակները և գրանցում փոփոխությունները, իսկ մակարդակին պատկանելը սնում է հաճախորդների սեգմենտները արշավների համար։ Հաճախորդները միշտ պետք է տեսնեն իրենց առաջընթացը դեպի հաջորդ մակարդակ։

Սենիոր մակարդակի հարցեր

S1Լավագույն գնի ամբողջական որոնում, թե՞ greedy կիրառում. ինչպե՞ս եք ընտրում։

Բոլոր համակցությունների ամբողջական որոնումը տալիս է իսկապես լավագույն գինը, բայց աճում է էքսպոնենցիալ. քսան համակցելի ակցիա նշանակում է մոտ մեկ միլիոն ենթաբազմություն։ Առաջնահերթության կարգով greedy կիրառումը արագ է և կանխատեսելի, բայց կարող է բաց թողնել ավելի լավ համակցություն։ Գործնականում ես համատեղում եմ երկուսը. stacking խմբերը և exclusivity-ն տարածությունը կրճատում են մի քանի scenario-ի, յուրաքանչյուր scenario-ի ներսում կիրառումը greedy է, իսկ engine-ը համեմատում է scenario-ների գումարները։ Ես սահմանափակում եմ գնահատվող scenario-ների քանակը և log եմ անում, երբ սահմանը հասնում է։ Engine-ը պետք է նաև deterministic լինի՝ կայուն tie-breaker-ներով, որովհետև գինը, որը փոխվում է երկու նույնական հարցումների միջև, ոչնչացնում է վստահությունը։ Marketing-ը սովորաբար կանխատեսելիությունն ու բացատրելիությունը ավելի բարձր է գնահատում, քան մաթեմատիկորեն օպտիմալ զեղչը քամելը։

S2Promotion engine-ը պետք է կառուցել ներսում, թե՞ գնել։

Գնեք, երբ կարիքները ստանդարտ են, և արագությունը կարևոր է. hosted engine-ները տրամադրում են rule builder-ներ, բյուջեներ, կոդեր, analytics և A/B testing, և թիմը խուսափում է բարդ ենթահամակարգ սպասարկելուց։ Գինը ծավալային գնագոյացումն է, pricing path-ում լրացուցիչ network call, ուստի պետք է fallback, երբ այն դանդաղ է, և սահմանափակումներ, երբ կանոնները կախված են ձեր սեփական տվյալներից, օրինակ՝ առաքման միջակայքերից կամ մասնաճյուղերի մենյուներից։ Կառուցեք, երբ ակցիաները հիմնական տարբերակիչ առավելություն են, երբ կանոնները խորապես կախված են domain-ի տվյալներից, կամ երբ գինը պետք է հաշվարկվի offline կամ միլիվայրկյաններում։ Եթե կառուցում եք, պահեք այն որպես մաքուր, լավ թեստավորված մոդուլ՝ ակցիաները որպես տվյալներ, որպեսզի որոշումը հետագայում շրջելի մնա։

S3Ինչպե՞ս թույլ չտալ, որ loyalty ծրագիրը դառնա ֆինանսական պարտավորություն, որը ոչ ոք չի հասկանում։

Առաջին իսկ օրվանից միավորներն ու wallet-ները դիտարկեք որպես գումար։ Յուրաքանչյուր բալանս կրեդիտների և դեբետների ledger է, ուստի ֆինանսական բաժինը կարող է տեսնել տրված, օգտագործված, ժամկետանց և չօգտագործված գումարները՝ ըստ ամիսների։ Սահմանեք մեկ միավորի արժեքը և ժամկետի ավարտի քաղաքականությունը, և պարբերաբար ներկայացրեք չօգտագործված պարտավորությունը. ընդունված հաշվապահական ստանդարտների համաձայն՝ վաճառքի հետ տրված loyalty պարգևները կարող են հետաձգել այդ վաճառքի եկամտի մի մասը, ուստի հաշվապահին վաղ ներգրավեք։ Սահմանափակեք պարգևների կուտակումը զեղչված կամ refund արված պատվերների վրա։ Tier-ի կանոնները դարձրեք հստակ, ներառյալ իջեցումները, որպեսզի առավելությունները անվերջ չաճեն։ Եվ վերջապես, ժամանակ առ ժամանակ ծրագիրը համեմատեք control խմբի հետ. եթե անդամները չեն գնում ավելի շատ, քան նմանատիպ ոչ անդամները, ծրագիրը պարզապես զեղչ է՝ լրացուցիչ քայլերով։

Բառարան

Stacking
Մեկից ավելի ակցիայի կիրառում նույն պատվերի կամ տողի վրա։
Exclusive ակցիա
Առաջարկ, որը չի կարող համակցվել որևէ այլ ակցիայի հետ։
Scenario
Ակցիաների մեկ թույլատրելի համակցություն, որը սիմուլյացվում է զամբյուղի պատճենի վրա՝ գումարները համեմատելու համար։
Adjustment
Կոնկրետ տողին կամ պատվերին կցված զեղչի գումար՝ այն առաջացրած ակցիայի նշումով։
Cashback
Պատվերի տոկոսը, որը հաճախորդին վերադարձվում է որպես store credit, սովորաբար առաքումից հետո։
Credit lot
Wallet-ի մեկ կրեդիտ՝ իր մնացորդային գումարով, որպեսզի ժամկետի ավարտը և FIFO ծախսումը ճշգրիտ լինեն։
Incrementality
Լրացուցիչ վաճառքը, որն իրականում առաջացնում է ակցիան՝ չափված այն չստացած խմբի համեմատ։
Holdout խումբ
Հաճախորդներ, որոնք դիտմամբ դուրս են թողնված առաջարկից՝ դրա իրական ազդեցությունը չափելու համար։
Deferred deep link
Հղում, որի տվյալները պահպանվում են app-ի տեղադրումից հետո, այնպես որ առաջին գործարկումից հետո app-ը բացվում է referral կոդով։

Պրոդուկտի գաղափար ունե՞ք։Եկեք ստեղծենք այն։

Պատմեք ձեր գաղափարի, պրոդուկտի կամ թիմի մասին։ Սովորաբար պատասխանում եմ մեկ աշխատանքային օրվա ընթացքում։