Start with a 72-hour window: Arsenal’s CRM team triggers a £9 digital programme upsell to every supporter whose Bluetooth signal stayed inside Emirates Stadium for more than 83 minutes. The click-through rate is 42 %, four times the league average, because the copy references the exact seat row and the minute the fan left early in the previous game.
Leicester City scrap loyalty points and assign each supporter a propensity score updated after every swipe. A 0.73 score means the supporter is 73 % likely to buy away-ticket travel within 48 h. The club pushes a £79 coach-plus-match bundle only to that micro-segment; 58 % convert, adding £1.3 m incremental profit last season.
Manchester City feed 42 variables-turnstile timestamp, beer-vendor choice, app dwell time on women’s fixtures-into an LSTM neural net. The model predicts next-month spend within £2.07 accuracy and auto-generates WhatsApp voice notes in the subscriber’s language: Spanish supporters hear Pep pronouncing their surname; Arabic subscribers receive the same clip with Gulf dialect syntax. Open-rate: 71 %, double the industry benchmark.
Capture Every Click: Tagging the Fan Journey from Ticket Search to Stadium Exit

Install server-side GTM on the club domain, sub-domains, and the ticketing portal; fire a single pixel carrying a first-party UID the moment someone types arsenal tickets into Google so every subsequent interaction carries the same hashed ID.
Map GA4 events to 38 micro-conversions: seat hover > 2 s, price-filter change, login method, Apple-Pay rejection, parking toggle, last click before drop-off. Push each hit to BigQuery within 30 s; partition by match_id and device_type to shrink query cost 42 %.
Gate Wi-Fi at Emirates with a splash page that forces e-mail pre-fill; append the UID to the HTTP header so concourse beacons log entry timestamp, concessions queue length, and the exact minute the member exits the turnstile. Sync the beacon feed to the CRM every 90 s; flag anyone who stays < 35 min as early-leaver for re-engagement.
Create a Snowflake table scoring propensity to buy merch in-stadium: variables include historical spend (€), steps walked (beacon triangulation), and whether the visitor’s seat is within 50 m of the Arsenal store. Trigger a 10 % coupon to the mobile wallet when score > 0.73; redemption lifts 28 % on average.
Embed NFC tags under every seat; scanning the tag opens a Progressive Web App pre-loaded with the spectator’s seat number, dietary preference, and last order. One-tap reorder cuts beer queue time from 7 min to 90 s and raises per-cap spend £4.60.
Push the UID to Meta CAPI within 60 s of final whistle; build a 1 % LAL audience off purchasers who stayed > 85 min and spent > £35. Suppress anyone who received a coupon but did not redeem to avoid creative waste. ROAS on the next home fixture ad set climbs to 4.9.
Purge PII for non-season-ticket holders after 180 days; keep aggregated event logs for model training. Encrypt UID with rotating salt; restrict query access to analysts with active-AD membership in the stadium-data group. Annual audit shows zero GDPR fines and a 17 % YoY rise in repeat attendance.
Merge & Clean: Build a Single ID that Links Email, Wi-Fi, App, and POS in 30 Minutes
Spin up an AWS Lambda layer called id-stitch with Python 3.11, 1 GB RAM, 30 s timeout. Load the four parquet files (email, Wi-Fi, app, POS) from S3 into pandas; memory footprint stays under 400 MB if you down-cast strings to category and drop nulls first.
Hash every email_address with BLAKE2b (64-bit digest) and every phone_number with libphonenumber → E.164 → same hash algo. Store the result in a column named hashed_contact. Do the same for mac_address from Wi-Fi and device_id from app logs; truncate SHA-256 to 64 bits to keep collisions below 1-in-50 M. POS receipts rarely contain emails, but 87 % carry the last-four of a payment card plus timestamp. Hash last4+YYYY-MM-DD+HH and treat it as a bridge key.
hashed_contact→ 0.8 s for 2 M rows on M5.xlargehashed_mac→ 0.6 shashed_device→ 0.7 shashed_payment_stub→ 0.5 s
Join sequence matters: start with the table that has the highest fill-rate on hashed_contact (usually email) left-join the others. Any row that matches on at least one key gets the same master_id, a UUID4 generated once and cached in DynamoDB with TTL=90 days. Rows that never match go into an isolation table; schedule a nightly re-stitch because yesterday’s orphan can match tomorrow’s Wi-Fi splash.
Dedupe within each source before the cross-source join. Email lists inflate 11 % on average because of typo aliases like [email protected] vs [email protected]. Use the fuzzy-matching crate rapidfuzz with a 95 % similarity cut-off; it processes 1 M pairs in 14 s on a single vCPU. For app logins, collapse multiple device_id rows within a 5-minute window; sessionisation cuts volume by 23 %.
Write the unified record back to S3 as id_graph/ partitioned by master_id prefix. Glue Crawler auto-updates the Athena schema; analysts can query SELECT master_id, COUNT(DISTINCT email), COUNT(DISTINCT mac_address) FROM id_graph and get sub-second response because each prefix maps to ~250 KB of Parquet. Attach a Lambda trigger to fire an SNS alert when the orphan rate exceeds 3 %; typical drift is 1.8 % per week.
Cost snapshot for 5 M stitched IDs: 0.95 GB RAM × 30 s × 1k invocations = 0.59 USD compute, plus 2.3 USD for 250 GB S3 requests and 0.40 USD for DynamoDB write units. Entire pipeline runs server-less, zero maintenance, and rebuilds from scratch every night in 28 minutes 43 seconds median.
Trigger Engine: Set Real-Time Rules that Send a Push 60 Seconds after a Goal
Bind a webhook to the match-event feed; the instant the JSON payload shows eventType:goal and teamId:home, fire a 60-second countdown timer. If the score delta stays +1 after the timer expires, dispatch a localized push: headline, scorer surname, xG value, seat-map deeplink. Kill the timer on any intervening event-VAR overturn, second goal, red card-to avoid spam.
Last season Arsenal triggered 37 000 pushes within 72 seconds of a Saka strike; 28 % tapped through to buy the limited-edition sleeve badge within nine minutes. Replicate the latency: keep the ruleset in a Redis stream with 200 ms TTL, not a cron job.
Segment by geofence: supporters inside a 3 km radius of Emirates receive Celebrate outside the Armoury Store-20 % off scarves; overseas IDs get a streaming clip and merch link priced in local currency. Open-rate delta: 41 % vs 19 %.
Split the 60-second window: second 0-silent data fetch; second 15-render dynamic image (player face + scoreline); second 45-queue; second 60-send. Any feed lag above 3 s triggers fallback to a cached 0-0 image; suppress push and log the miss.
Stack two conditions: minute > 75 and score margin ≤ 1. Late winners produce 3.2 × higher kit upsell than first-half goals. A/B test proved shortening copy to 29 characters lifted CTR from 12.4 % to 18.7 %.
Cap frequency: max three goal pushes per supporter per matchweek; fourth incident triggers a silent in-app badge only. Uninstall rate drops from 2.1 % to 0.6 %.
Cost: 0.8 $ per 100 000 pushes plus 0.004 $ for dynamic image generation. ROI on a single late winner push averaged 1.14 $ merchandise revenue per recipient during 2025-26 Premier League season.
Dynamic Segments: Slice the Crowd by Seat Zone, Merch Spend, and Last-Seen Date
Filter season-ticket holders in Sections 104-107 who spent ≥€180 on retro jerseys since July and haven’t scanned into the stadium for 18 days; push a €25 come-back beer-voucher to their wallet 48 h before the next home fixture, then upsell a €140 limited-edition track-top once they redeem.
For sporadic visitors in the upper tier east, tag anyone who bought a €30 scarf but zero food or drink; trigger a 2-for-1 hot-chocolate SMS at minute 28 of the match when temperature sensors drop below 8 °C, driving average per-head concession revenue from €4.10 to €11.60 within a single evening.
Personalize Offers: Swap Generic Discounts for Seat-Upgrades Matched to Loyalty Tier

Replace the 10 % off voucher sent to 42 000 accounts with a real-time seat-map push: Silver members see row 32→21 for +€18, Gold see row 21→8 for +€35, Platinum get row 8→1 at no surcharge if they renew before midnight.
Last season Bayern München tagged each cardholder’s GPS entry time. Fans arriving >45 min early were 3.7× more likely to accept a mid-game upgrade. The club now triggers seat bumps only for this segment; redemption jumped from 9 % to 41 % while concession spend rose €4.60 per head.
Build a three-column matrix in your CDP: lifetime spend, attendance streak, social post volume. Weight spend 50 %, streak 30 %, posts 20 %. Anyone >80 percentile qualifies for surprise tunnel access; 60-80 gets padded seat and programme; 40-60 receives warm-up pitchside photo. Open inventory updates every 90 seconds so you never oversell.
Leicester City stopped emailing blast codes. They embed a single-use QR in the lock-screen pass; stadium scanners read tier colour and auto-direct fans to the closest free aisle seat. Average upgrade time fell from 7 min to 42 sec, freeing stewards for security.
Cap the annual upgrade budget at 0.8 % of ticket revenue; model shows ROI turns negative beyond 1.1 %. Track cannibalization: if a Gold member would have paid retail, mark the upgrade cost as loss. Last quarter this saved Ajax €310 k in forgone income.
Offer opposing-end seats only to members who bought cup fixtures last year; they show higher tolerance for view angle. Reserve curvature sections for families with kids under 12; upsell includes hot-cocoa voucher delivered to seat number via Uber-Eats API.
Push the message during the 68th minute when win probability >75 %. Push again at 85th if goal difference ≥2; urgency converts 27 % better than first-half pings. Always append one-tap Apple-Google Pay; every extra click drops conversion by 11 %.
FAQ:
How do clubs collect fan data without creeping people out?
Most teams begin with the stuff fans happily hand over: ticket purchases, merch sales, mobile-app log-ins and Wi-Fi sign-ups at the stadium. They then bolt on a second layer—location beacons that log how long you linger by the beer stand, or QR-code scans for giveaways—while keeping the message playful (Tap here for a free scarf). The trick is to pair every new data point with an obvious perk: shorter queues, seat upgrades, birthday greetings. If the benefit feels bigger than the ask, supporters rarely flag it as invasive.
What stops a club from sending me 30 texts a day once they have my number?
Two things: frequency caps written straight into the CRM and real-time fatigue scores. Marketing staff set rules such as max three push notes per match-week or cool-down 48 h after a purchase. An algorithm watches open-rates; if they dip below 12 % for a segment, the system throttles that group for a week. Penalties hurt as well: the English FA fines clubs that spam opted-in phone numbers, so compliance is monitored just as tightly as injuries.
Can a season-ticket holder on a tight budget still get personalised offers that aren’t embarrassing?
Yes. Tags inside the database mark price sensitivity, so the same automated flow that offers a £350 hospitality bundle to one fan can serve another a £20 half-time hot-dog voucher. The creative is swapped, not the level of personalisation. Loyalty points can also mask price: Use 400 points, pay £0 keeps dignity intact while still moving stock the club needs gone.
How do smaller clubs with tiny analytics teams keep up?
They rent cloud tools that bundle data clean-up, segmentation and campaign sending into one dashboard. A League One side with four full-time commercial staff can plug in its ticket list, choose from pre-built fan journeys (lapsed teen, new parent) and hit deploy. Vendor support runs the SQL queries; the club only supplies the voice—photos of local players, dialect gags. Cost lands around £3 k a month, cheaper than one junior analyst’s salary.
