Halo Integration
How a AAA studio would implement DBZ's embedded payments platform
Player Journey Overview
Five touchpoints where DBZ integrates into the Halo experience
Connect DBZ
OAuth2 login from the Halo menu. Player links gamertag to DBZ identity.
Earn Rewards
Win matches, complete challenges. Real money credited to DBZ wallet.
Cash Out
Withdraw earnings to linked bank account. KYC triggered on first withdrawal.
Tournaments
Enter competitive events with buy-in. Prize pools distributed automatically.
Web Store
Purchase Battle Pass, cosmetics via direct checkout. Bypass platform fees.
Player Onboarding Flow
OAuth2 authentication and account creation in under 30 seconds
Tier 0 allows players to start earning immediately with zero friction. KYC is deferred until the first withdrawal, reducing onboarding drop-off by keeping the initial flow to a single OAuth redirect.
Earning Rewards Flow
Server-authoritative crediting via the ledger API
userId, amount: 25 ($0.25) Z->>H: 200 OK - balance: 25 H->>P: Toast notification: "+$0.25 earned" Note over P,Z: Player continues playing... P->>GS: Completes weekly challenge GS->>H: Challenge completed event H->>Z: POST /v1/ledger/credit
userId, amount: 200 ($2.00) Z->>H: 200 OK - balance: 1475 H->>P: Toast notification: "+$2.00 earned" H->>P: Balance widget updates: $14.75
Per match, up to 20/day
3 challenges per week
Tier 0 monthly cap
First Cash-Out Flow
PRIMARY WORKSTREAMEnd-to-end payout: KYC verification, bank linking, and ACH settlement
tier: 1 (email + phone) Z->>H: { verificationUrl } H->>P: Open webview with verificationUrl P->>Z: Enters email + phone number P->>Z: Verifies SMS code Z->>H: Webhook: user.kyc.approved (tier: 1) end rect rgba(0,177,89,0.08) Note over P,Z: Step 3 -- Link Bank Account H->>Z: POST /v1/users/{userId}/bank-accounts Z->>H: { linkUrl } (Plaid-hosted flow) H->>P: Open webview with linkUrl P->>B: Selects Chase, logs in via Plaid P->>Z: Confirms checking account ****6789 Z->>H: Webhook: bank_account.verified
bankAccountId, last4: "6789" end rect rgba(59,130,246,0.08) Note over P,Z: Step 4 -- Execute Payout H->>P: Confirm: $14.75 to Chase ****6789? P->>H: Confirms withdrawal H->>Z: POST /v1/payouts
userId, bankAccountId, amount: 1475 Z->>H: 201 Created - payout { status: "pending" } end rect rgba(0,177,89,0.08) Note over P,B: Step 5 -- Settlement Z->>Z: Status: pending -> processing Z->>B: ACH transfer initiated Z->>Z: Status: processing -> in_transit Z->>H: Webhook: payout.status_updated (in_transit) B->>B: Funds settle Z->>Z: Status: in_transit -> completed Z->>H: Webhook: payout.completed H->>P: Push notification: "Your $14.75 has arrived!" end
Payout Status Lifecycle
Tournament Flow
Skill-based competition with escrow, automated prize distribution
name: "Weekend Championship"
entryFee: 1000 ($10), prizePool: 50000 ($500) Z->>S: 201 Created - tournament object end H->>P: Tournament card: "Weekend Championship"
$10 entry -- $500 pool -- 50 players max rect rgba(0,177,89,0.08) Note over P,Z: Player Entry P->>H: Taps "Enter Tournament" H->>Z: POST /v1/tournaments/{id}/enter
userId Z->>Z: Deduct $10 from player wallet
(charge bank if insufficient balance) Z->>Z: Funds held in escrow Z->>H: 200 OK - entry confirmed H->>P: "You're in! Tournament starts Saturday 2PM" end Note over P,Z: Tournament plays out over the weekend... rect rgba(59,130,246,0.08) Note over S,Z: Results + Prize Distribution S->>Z: POST /v1/tournaments/{id}/results
rankings: [player1, player2, player3, ...] Z->>Z: Distribute prizes automatically Note right of Z: 1st: $250 (50%)
2nd: $150 (30%)
3rd: $75 (15%)
DBZ fee: $25 (5%) Z->>H: Webhook: tournament.completed
with prize breakdown H->>P: "Congratulations! You won $250!" end Note over P,Z: Winners can withdraw to bank immediately
Web Store Flow
Direct-to-consumer checkout bypassing platform fees
"Buy Battle Pass for $8 (save $2)" P->>W: Opens halo-store.com rect rgba(59,130,246,0.08) Note over W,Z: Create Checkout Session W->>Z: POST /v1/checkout/sessions
lineItems: [{ name: "Battle Pass",
amount: 800, quantity: 1 }] Z->>W: { sessionId, checkoutUrl } W->>P: Render checkout widget end rect rgba(0,177,89,0.08) Note over P,Z: Payment P->>Z: Pays via linked bank account
(or card via DBZ) Z->>H: Webhook: checkout.completed
sessionId, userId, amount: 800 H->>H: Activate Battle Pass for player end P->>P: Returns to game P->>P: Battle Pass is active Note over W,Z: 343 pays ~3% processing
vs 30% Xbox Store fee --
saving $2.70 per transaction
Fee Comparison: Web Store vs. Platform Store
Player saves $2.00. Studio earns $0.76 more per transaction. Both sides win.
In-Game Purchases
How players buy skins, bundles, and virtual currency through DBZ's direct checkout
The Economics: Why Direct Checkout Wins
Every purchase through the Xbox Store costs 343 Industries 30% in platform fees. DBZ's direct web checkout charges ~3%. On a $20 armor bundle, that's the difference between keeping $14 and keeping $19.40. At scale, this changes the entire business model.
| Item | Xbox Store Price | Xbox Fee (30%) | Studio Keeps | DBZ Web Price (20% off) | DBZ Fee (~3%) | Studio Keeps |
|---|---|---|---|---|---|---|
| Weapon Skin | $8.00 | -$2.40 | $5.60 | $6.40 | -$0.19 | $6.21 |
| Battle Pass | $10.00 | -$3.00 | $7.00 | $8.00 | -$0.24 | $7.76 |
| Armor Bundle | $20.00 | -$6.00 | $14.00 | $16.00 | -$0.48 | $15.52 |
| Premium Bundle | $40.00 | -$12.00 | $28.00 | $32.00 | -$0.96 | $31.04 |
| 1,000 Halo Credits | $9.99 | -$3.00 | $6.99 | $7.99 | -$0.24 | $7.75 |
At 1M monthly transactions averaging $15, the platform fee difference is $4.05M/month in additional revenue for the studio. The player also saves 20%. Both sides win.
In-Game Item Purchase Flow
Player browses the in-game store, selects an item, and is directed to the DBZ-powered web checkout. The entitlement is activated in real-time via webhook.
(Xbox price: $20)" rect rgba(59,130,246,0.08) Note over G,Z: Checkout Session G->>H: Player wants to buy item SKU_MJOLNIR H->>Z: POST /v1/checkout/sessions
lineItems: [{ name: "Mjolnir Armor Set",
sku: "SKU_MJOLNIR",
amount: 1600, quantity: 1 }]
userId: "usr_halo_5839"
metadata: { gameId: "halo-infinite" } Z-->>H: { sessionId, checkoutUrl, expiresAt } H-->>G: Open checkoutUrl end rect rgba(0,177,89,0.08) Note over P,Z: Player Pays G->>P: Opens DBZ checkout (webview) P->>Z: Selects payment method:
DBZ balance / linked bank / card P->>Z: Confirms purchase Z->>Z: Process payment Z->>H: Webhook: checkout.completed
{ sessionId, userId, amount: 1600,
lineItems: ["SKU_MJOLNIR"] } end rect rgba(139,92,246,0.08) Note over H,G: Entitlement Delivery H->>H: Grant SKU_MJOLNIR to player H->>G: Push: inventory updated G->>P: "Mjolnir Armor Set unlocked!" end Note over P,Z: Total time: under 30 seconds
Virtual Currency Purchase Flow
Players can also buy Halo Credits (the in-game virtual currency) through DBZ's checkout. Credits are managed by DBZ's virtual currency ledger, so the studio gets real-time balance tracking, conversion support, and audit trails.
lineItems: [{ name: "1,000 Halo Credits",
amount: 799, quantity: 1,
type: "virtual_currency",
creditAmount: 1000 }] Z-->>H: { sessionId, checkoutUrl } H-->>P: Open checkout P->>Z: Pays $7.99 end rect rgba(0,177,89,0.08) Note over H,Z: Credit + Confirm Z->>Z: Payment confirmed Z->>Z: POST /v1/ledger/credit (internal)
userId, currencyId: "halo_credits",
amount: 1000 Z->>H: Webhook: checkout.completed
+ ledger.credited
{ userId, credits: 1000, balance: 3450 } H->>P: "1,000 Halo Credits added!
Balance: 3,450" end Note over P,Z: Credits live on DBZ's ledger.
Player spends them in-game,
343 calls POST /v1/ledger/debit
for each purchase.
Spending Credits In-Game
Once a player has Halo Credits, they spend them on items within the game. The studio debits the ledger via API — no additional payment processing needed.
// Player buys a weapon skin with Halo Credits
const debit = await zbd.ledger.debit({
userId: 'usr_halo_5839',
currencyId: 'halo_credits',
amount: 500, // 500 Halo Credits
description: 'MA40 AR Desert Camo Skin',
metadata: {
sku: 'SKU_MA40_DESERT',
gameSession: 'gs_abc123'
}
}, {
idempotencyKey: 'purchase_usr5839_SKU_MA40_DESERT'
});
// debit.data.balance === 2950 (was 3450)
// Item granted in-game by 343's backend
Why Not Just Use Xbox Store?
Xbox Store (Status Quo)
- 30% revenue share to Microsoft
- No player identity across platforms
- Refund disputes handled by Xbox (studio has limited control)
- Virtual currency locked to Xbox ecosystem
- No visibility into player spending patterns
- Settlement in 30-60 days
DBZ Direct Checkout
- ~3% processing fee
- Cross-platform player identity (DBZ gamertag)
- Studio controls refund policy
- Virtual currency works across all platforms
- Full analytics on spending behavior
- Settlement in 1-2 business days
Industry Precedent: Fortnite Web Store
Epic Games launched a direct web store offering a permanent 20% discount on V-Bucks and cosmetics. Despite the lower price, Epic earns more per transaction because they avoid the 30% platform fee. This model is now proven at scale — DBZ's Checkout API gives any studio the same capability without building their own payment infrastructure.
Platform Rules: What's Allowed?
Web store for game items is legal — but platforms have rules about how you direct players there:
- iOS (post-Epic v. Apple): Apps can link to external purchase options. Apple may charge a reduced commission (currently under appeal as of Dec 2025).
- EU (DMA): Apple must allow sideloading and alternative payment methods. Epic launched the Epic Games Store on iOS in the EU.
- Xbox/PlayStation: No restriction on web stores for cosmetics and virtual currency. Players routinely buy from publisher websites.
- Steam: Developers can sell cosmetics outside Steam. Cannot bypass Steam for Steam-delivered DLC content.
Studio Dashboard View
What 343 Industries sees in their DBZ developer console
Current balance: $48,600. Estimated runway: 12 days at current payout velocity. Top up recommended.
Recent Activity
| Event | Reference | Amount | Detail | Time |
|---|---|---|---|---|
| payout.completed | usr_halo_5839 | $0.25 | Ranked win reward | 2 min ago |
| tournament.completed | Weekend Championship | $500.00 | 50 players, prizes distributed | 1 hour ago |
| checkout.completed | usr_halo_2941 | $8.00 | Battle Pass purchase | 3 hours ago |
| payout.failed | usr_halo_7721 | $15.00 | bank_account_closed | 5 hours ago |
| user.kyc.approved | usr_halo_1102 | -- | Tier 1 verified | 6 hours ago |
What the Studio NEVER Sees
DBZ keeps studios completely out of PII and PCI scope
Studio Sees (Safe Tokens)
DBZ Handles (Never Exposed)
Regulatory Considerations
Legal framework for a studio paying players real money
Why This Is Not Gambling
US gambling law requires three elements: Prize + Chance + Consideration. In the Halo rewards model, 343 Industries pays players from its own marketing budget — there is no buy-in from the player. No consideration means no gambling, period.
The model is legally classified as a promotional reward — the same category as airline miles or credit card cashback. Not a sweepstakes (rewards are deterministic), not employment (though the IRS still taxes it).
Risk Matrix for Halo Integration
| Area | Risk | Impact on Halo | DBZ Handles It |
|---|---|---|---|
| COPPA (minors) | HIGH | Halo has players under 13. Paying them requires PII collection, triggering COPPA ($53K/violation). | DBZ age-gates rewards to 18+ in the hosted KYC flow. 343 never touches age data. |
| Tax reporting | MED | 1099-MISC required at $2,000/year (2026+ OBBBA threshold). At $0.25/match = 8,000 wins to trigger. | DBZ collects W-9s during KYC Tier 2. Auto-generates 1099s. 343 never handles tax data. |
| State restrictions | MED | ~9 states restrict real-money skill gaming (AZ, AR, CT, DE, LA, MT, SC, SD, TN). | DBZ's is-supported-region API auto-disables rewards in restricted states. |
| FTC dark patterns | MED | "Earn real money playing Halo" could be deceptive if average earnings are $3/month. | DBZ provides earnings disclosure templates. Dashboard shows average player earnings for transparency. |
| Gambling | LOW | No player buy-in = no consideration = not gambling. | API design separates reward endpoints (no buy-in) from tournament endpoints (separate compliance). |
| App Store ToS | LOW | Mistplay, DBZ games, Swagbucks all approved on iOS and Android. | Structured as promotional rewards, not gambling. DBZ has existing App Store precedent. |
Tournaments Are Different
When the Weekend Championship has a $10 buy-in, consideration IS present. The gambling test then hinges on skill vs. chance. Halo multiplayer is predominantly skill-based, so it qualifies as skill-based gaming — legal in ~41 states.
DBZ's tournament API requires a skillCertification attestation and automatically geo-fences buy-in tournaments out of the ~9 restricted states. 343 doesn't need to track state laws — DBZ's API rejects entries from restricted jurisdictions.
Why this matters for the business case: Compliance is the hardest part of paying players. 343 Industries doesn't want to manage 1099s, COPPA audits, state-by-state geo-fencing, and age verification. DBZ handles all of it behind the API. The studio calls
POST /v1/payoutsand DBZ manages the rest. That's the moat — not the payment rails, but the regulatory infrastructure that makes paying players legal and safe.
Integration Complexity
Total engineering effort: ~280 lines of code across ~2 weeks
| Component | Lines of Code | Time to Implement | Owner |
|---|---|---|---|
| OAuth2 login | ~50 lines | 1 day | Game client team |
| Reward crediting | ~30 lines per event | 2-3 days | Game server team |
| Payout triggering | ~20 lines | 1 day | Backend team |
| Webhook handler | ~80 lines | 1 day | Backend team |
| Tournament creation | ~40 lines | 2 days | Backend team |
| Web store integration | ~60 lines | 2 days | Web team |
| KYC / bank linking UI | 0 lines (DBZ hosted) | 0 days | DBZ |
| Compliance / AML | 0 lines | 0 days | DBZ |
| Total | ~280 lines | ~2 weeks | Split across teams |
The heaviest lift is the webhook handler at ~80 lines -- everything else is straightforward REST calls. KYC, bank linking, and compliance are entirely DBZ-hosted, meaning the studio writes zero code for the most complex parts of the integration.