Skip to main content
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.
In-app card showing a product image of toothpaste with the prompt: How much did you pay? The user enters a guess and submits it.
This gives users a reason to come back to your app regularly, while reinforcing awareness of their spending on your card.

Flow

Implementation

1

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
FieldPurpose
products[].nameProduct display name shown to the user in the game.
products[].image_urlProduct photo for the game card.
products[].price.unit_priceThe actual price, which is the answer the user is trying to guess.
merchant.nameMerchant label for context (e.g., “Walmart”).
datetimePurchase timestamp for “You bought this on…” context.
external_user_idIdentifies the user in your system.
order_statusFilter 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.
2

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:
ParameterSuggested DefaultConsiderations
MIN_PRICE$1.00Filters out free samples and near-zero items that aren’t interesting to guess.
MAX_PRICE$500.00Filters out outlier purchases where guessing feels arbitrary.
Recency window30-90 daysProducts 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.
3

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:
In-app Price Is Right game card showing a product with multiple-choice price options
4

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:
ParameterSuggested DefaultConsiderations
Streak reset threshold25% offResets the streak if the guess is more than 25% off. Adjust to make streaks easier or harder to maintain.
Streak bonus2x points at 3+ streakRewards 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.