Click “Copy Page” to copy this use case as markdown.
Problem
Banking and fintech apps struggle to drive repeat engagement beyond core financial tasks. Users open the app to check their balance or make a transfer, then leave. There is little reason to come back between transactions, and little-to-no connection between the app and a user’s actual purchasing behavior.
Solution
Build a gamified price-guessing feature that surfaces a product from the user’s real purchase history and challenges them to guess how much they paid. The game uses SKU-level transaction data from Knot’s Sync Transactions endpoint, including product names, images, and unit prices, to create a personalized, entertaining experience that drives engagement and reinforces card usage awareness.
This gives users a reason to come back to your app regularly, while reinforcing awareness of their spending on your card.
Flow
Implementation
Sync transaction data
When a user switches their card at a merchant or they simply link their merchant account w/o switching their card, Knot begins collecting transaction data for that account. Listen for the NEW_TRANSACTIONS_AVAILABLE webhook event, then call Sync Transactions to sync SKU-level transactions on a daily basis. Each transaction includes an array of products with names, images, and prices.Key fields| Field | Purpose |
|---|
products[].name | Product display name shown to the user in the game. |
products[].image_url | Product photo for the game card. |
products[].price.unit_price | The actual price, which is the answer the user is trying to guess. |
merchant.name | Merchant label for context (e.g., “Walmart”). |
datetime | Purchase timestamp for “You bought this on…” context. |
external_user_id | Identifies the user in your system. |
order_status | Filter to completed transactions only. |
Only include transactions with order_status of COMPLETED, DELIVERED, PICKED_UP, SHIPPED, BILLED, or ORDERED. Filter out CANCELLED, REFUNDED, and FAILED. Build the product pool
Store synced products and filter them into a pool of eligible game candidates. Not every product makes a good game round, so apply filtering rules to keep it fun and fair.FOR each product in new_transaction.products:
IF product.price.unit_price >= MIN_PRICE
AND product.price.unit_price <= MAX_PRICE
AND product.image_url is not null
AND transaction.order_status in [COMPLETED, DELIVERED, PICKED_UP, SHIPPED, BILLED, ORDERED]
THEN
add to product_pool for external_user_id
Configuration decisions for your team:| Parameter | Suggested Default | Considerations |
|---|
MIN_PRICE | $1.00 | Filters out free samples and near-zero items that aren’t interesting to guess. |
MAX_PRICE | $500.00 | Filters out outlier purchases where guessing feels arbitrary. |
| Recency window | 30-90 days | Products from the last 30-90 days work best. Users are more likely to remember recent purchases, and more likely to be surprised when they don’t. |
Select and present a product
When the user opens the game or receives a daily prompt, pick a product from their pool. Track which products have already been shown to avoid repeats.eligible = query product_pool WHERE
external_user_id == user.external_user_id
AND already_shown == false
IF difficulty_tier is set:
eligible = filter eligible by tier
product = random selection from eligible
mark product as shown
Present the product as an in-app game card: Score the guess and reveal the result
Compare the user’s guess to products[].price.unit_price and score based on accuracy.difference = abs(guess - product.price.unit_price)
pct_off = difference / product.price.unit_price
IF difference <= 0.10: points = 25, label = "Nailed it!"
ELSE IF pct_off <= 0.10: points = 15, label = "So close!"
ELSE IF pct_off <= 0.25: points = 10, label = "Not bad!"
ELSE IF pct_off <= 0.50: points = 5, label = "Keep trying!"
ELSE: points = 1, label = "Way off!"
update user streak (reset if pct_off > 0.25, increment otherwise)
add points to user total
Configuration decisions for your team:| Parameter | Suggested Default | Considerations |
|---|
| Streak reset threshold | 25% off | Resets the streak if the guess is more than 25% off. Adjust to make streaks easier or harder to maintain. |
| Streak bonus | 2x points at 3+ streak | Rewards consistency and drives repeat play. |
Expansion Path
- “Which merchant is cheaper?”: The same product often appears across multiple merchants at different prices. Surface a product the user bought and ask them to guess which merchant had the best price. This builds shopping intuition and adds a new game mode without requiring additional data.
- Post-purchase trigger: After a new purchase syncs, queue that product for a future round with a 3-7 day delay. The game stays fresh and tied to recent activity.
- Spending insights from gameplay: Aggregate guess accuracy data to surface insights like “You tend to underestimate how much you spend on food delivery,” turning the game into a lightweight financial awareness tool.