SCSeawolves Cart Win-BackFan offer engine · front office

Rule parameters

marketer-tunable

Money rules first, then the conditions that decide who qualifies. Every offer stores the settings it was produced under, so a change never rewrites history.

Money rules

What a deal can cost

hard cap 15%
Maximum discount

The hard ceiling for any offer, any fan, any strategy.

%
maxDiscountPct
First visit

The price incentive for a fan with no ticket history in soft inventory.

%
distressedDiscountPct
Group bundle

Only in soft or medium inventory. Hot sections get a perk instead.

%
groupDiscountPct
Up to 15% off any offer. A first visit can get 15% in a section under 50% sold. A group can get 10%. Nothing is discounted at or above 85% sold. One outreach per fan every 14 days. Auto-approve is off.
Automation

Auto-approve eligible offers

Off by default. With a ceiling of 0, only no-discount offers (reminders, group perks, concierge) are sent automatically; a discount offer still waits for a person. Every auto-approval re-checks consent, the global cap, the high-demand guard, the copy validator, and the frequency cap. The send is marked auto in the queue and the audit log.

ceiling %
Auto-approval runs only when the marketer clicks Run engine. A demo reset stages the queue without sending. The pass also covers offers already waiting in the queue.

Inventory pressure

High-demand line

At or above this sell-through, no price discount is allowed.

default undefined
highDemandSoldPct
Medium-demand line

Between this and high demand, inventory is neither scarce nor distressed.

default undefined
mediumDemandSoldPct
First-visit ceiling

Above this sell-through, a first-time fan no longer qualifies for the discount.

default undefined
distressedMaxSoldPct
High-demand protection

Zeroes any discount on hot inventory even if a strategy asks for one.

default undefined
protectHighDemandDiscounts

Who qualifies

Group minimum seats

At or above this party size, a group bundle can be proposed.

default undefined
groupSeatsMin
Concierge: lifetime tickets

At or above this, the fan gets the loyalty treatment.

default undefined
vipLifetimeTicketsMin
Concierge: shop spend

At or above this 12-month shop spend, the fan gets the loyalty treatment.

default undefined
vipShopSpendMin
Create provisional fans

When a guest email matches no profile, create one with the checkout's consent.

default undefined
allowProvisionalGuests

Timing & frequency

Dedupe window (hours)

Same fan and same match inside this window is one intent.

default undefined
dedupeWindowHours
Frequency cap (days)

A fan who received an offer is not eligible again inside this window.

default undefined
frequencyCapDays
Staleness floor (minutes)

Younger carts are deferred, not treated as abandoned.

default undefined
minAbandonedMinutes

Measurement & copy

AI marketer note

Off uses the curated, human-written templates only. On asks the provider for a short rationale for the marketer; the fan copy stays human-written.

default undefined
aiEnabled
Projected conversion rate

Planning assumption for the projected win-back KPI only. It never decides an offer.

default undefined
assumedConversionRate

AI rationale provider

The model writes only the marketer's rationale. Fan copy is always the curated template. The offer, discount, channel, and audience are decided in code.

No provider configured
The AI note is off. Curated templates are used and no provider is called.
Development defaults to AI_PROVIDER=mock: the curated copy is returned through the same schema and validator, with no network call. To use Gemini in development, set AI_PROVIDER=google in .env.local and restart. The key stays out of the repository.

Promo redemption seam

single-use check

The ticketing system is the real authority on redemption. This endpoint exercises the ledger this service keeps: a code is bound to one sent offer and a second redemption is rejected. Try it twice with the same code.

Stored as one JSON row in app_settings under the key engine, merged over the code defaults and validated with a strict schema. Each offer keeps a snapshot of the effective values.