Skip to main content

Ensuring Fair Distribution

Fairness is critical for maintaining consumer trust during high-demand events. This guide covers strategies for equitable distribution and common pitfalls to avoid.

Why Fairness Matters

Unfair distribution can lead to:
  • Loss of trust: Consumers who feel cheated won’t return
  • Negative publicity: Social media amplifies unfair experiences
  • Reseller dominance: Bots and bad actors capture inventory
  • Brand damage: Long-term reputation harm

Distribution Type Selection

Choose the right distribution type based on your fairness goals.
TypeFairness ModelBest For
QueueFirst-come, first-servedRewarding early engagement
DrawRandom selectionEqual opportunity regardless of timing
Timed ReleaseSimultaneous accessHigh-volume, self-serve purchases
AuctionHighest valuePrice-based allocation

When to Use Queues

Queues work well when you want to reward:
  • Early awareness and preparation
  • Dedicated fans who show up first
  • Organic demand signals
// Queue configuration example
const queueConfig = {
  type: "queue",
  accessMode: "sequential",
  batchSize: 50, // How many users get access at once
  batchIntervalSeconds: 30, // Time between batches
};
Queues can disadvantage users in different time zones or with slower internet connections. Consider draws for global fairness.

When to Use Draws

Draws provide equal opportunity regardless of:
  • Geographic location
  • Device speed
  • Internet connection quality
  • Time zone
// Draw configuration example
const drawConfig = {
  type: "draw",
  selectionMethod: "random",
  winnersCount: 500,
  registrationPeriodMinutes: 60, // Give everyone time to register
};

Sequence-Based Access

Use sequences to provide different access levels while maintaining fairness within each tier.

VIP/Priority Access

Allow loyal customers priority access without excluding general audiences.
// Multiple sequences with staggered timing
const sequences = [
  {
    name: "VIP Members",
    audienceId: "aud_vip_members",
    startsAt: "2024-01-15T09:00:00Z", // 1 hour early
    maxParticipants: 200,
  },
  {
    name: "Email Subscribers",
    audienceId: "aud_email_list",
    startsAt: "2024-01-15T10:00:00Z", // 30 min early
    maxParticipants: 500,
  },
  {
    name: "General Access",
    startsAt: "2024-01-15T10:30:00Z",
    maxParticipants: 1000,
  },
];

Fair Allocation Across Sequences

Reserve inventory proportionally across access tiers.
Total Inventory: 1000 units

VIP Members (10%):     100 units
Email Subscribers:     200 units
General Access:        700 units

Purchase Limits

Implement limits to prevent stockpiling and ensure broader access.

Per-Consumer Limits

Restrict how much any single consumer can purchase.
// Configure per-consumer limits
const orderLimits = {
  maxQuantityPerOrder: 2,
  maxOrdersPerConsumer: 1,
  enforcementScope: "experience", // or "product", "organization"
};

Enforcement Strategies

StrategyDescriptionStrength
Account-basedLimit per authenticated userMedium
Device fingerprintLimit per deviceHigh
CombinedAccount + device + behaviorHighest

Device Verification

Device fingerprinting helps ensure one person doesn’t gain unfair advantage with multiple accounts.

How It Works

The SDK collects device characteristics to create a unique fingerprint:
// Fingerprint is automatically included in SDK requests
const client = new FanfareClient({
  publishableKey: "pk_live_...",
  // Fingerprinting is enabled by default
});

Privacy Considerations

  • Fingerprints are hashed and cannot identify individuals
  • No personal data is collected
  • Users can clear fingerprints by clearing browser data
  • Compliant with GDPR and privacy regulations

Access Codes for Fair Distribution

Use access codes to control who can participate.

Unique Codes

Generate unique codes for each entitled participant.
// Each code can only be used once
const codes = [
  { code: "VIP-ABCD-1234", maxUses: 1 },
  { code: "VIP-EFGH-5678", maxUses: 1 },
];

Shared Codes with Limits

Allow a code to be used by a limited number of people.
// Shared code with limit
const promotionCode = {
  code: "FLASH-SALE-2024",
  maxUses: 100, // First 100 users only
  expiresAt: "2024-01-15T12:00:00Z",
};

Timing Fairness

Synchronized Start Times

Ensure all users experience the same start time.
// Server-synchronized countdown
client.on("experience:countdown", ({ serverTime, startsAt }) => {
  const remaining = startsAt - serverTime;
  updateCountdown(remaining);
});

Grace Periods

Allow a window for late arrivals to still participate fairly.
const experienceConfig = {
  startsAt: "2024-01-15T10:00:00Z",
  lateEntryGracePeriodSeconds: 60, // Allow entry up to 1 min late
};

Monitoring Fairness

Key Metrics

Track these metrics to ensure fair distribution:
MetricTargetConcern Threshold
Unique participantsHigh< 80% unique devices
Geographic distributionBroadSingle region > 80%
Entry time spreadEven> 50% in first second
Purchase completionBalancedWide variance by segment

Detecting Anomalies

Watch for patterns that indicate unfair advantage:
  • Many accounts from same IP address
  • Identical device fingerprints across accounts
  • Unusually fast form completion
  • Automated request patterns

Common Pitfalls

Always give consumers advance notice of when an experience starts. Surprise launches benefit only those who happen to be watching.
For draws, allow enough time for all interested parties to register. Consider time zones and typical user schedules.
Without purchase limits, determined resellers can sweep inventory. Always set reasonable per-person limits.
Without fingerprinting, a single person can create multiple accounts to improve their chances unfairly.
If your audience is global, queue-based launches at a single time disadvantage some regions. Consider regional releases or draws.

Communicating Fairness

Be transparent about your distribution approach.

Pre-Launch Communication

## How This Launch Works

- **Registration opens**: January 14, 10:00 AM EST
- **Draw held**: January 15, 10:00 AM EST
- **Winners notified**: January 15, 10:15 AM EST

Everyone who registers has an equal chance of being selected.
Winners will have 30 minutes to complete their purchase.

**Limits**: 1 item per person

During the Experience

function FairnessNotice() {
  return (
    <div className="fairness-notice">
      <h4>Fair Access</h4>
      <p>This experience uses random selection to give everyone an equal chance, regardless of when you registered.</p>
    </div>
  );
}

Next Steps