Thanks for the detailed writeup. This may come down to which flow performed the redemption.
First, check the source field on that REDEEM_REWARD event. Per LoyaltyEventRedeemReward, reward_id “is returned only if the event source is LOYALTY_API.” A redemption done natively in Square POS has source: SQUARE and no reward_id, whereas one made through CreateLoyaltyReward/RedeemLoyaltyReward does carry it. If that’s the difference between this merchant and your others, it’s about which flow was used rather than a merchant-level fault. Could you share the source value from a working and a non-working case?
This is also related to your earlier thread, Search Loyalty Rewards API returns an empty response, where the team confirmed rewards originating outside the Loyalty API aren’t returned by SearchLoyaltyRewards and recommended SearchLoyaltyEvents. I don’t have a timeline to share on that, so I’d build against SearchLoyaltyEvents.
Second, the missing CREATE_REWARD might be a filter artifact. REDEEM_REWARD has no points field; the debit sits on CREATE_REWARD, which has no order_id field — so an order_filter query can’t return it. The two events you posted are exactly the types that do carry order_id. Worth re-querying SearchLoyaltyEvents by loyalty_account_filter plus a date_time_filter around checkout. Also watch for DELETE_REWARD, since POS lets staff add and remove rewards before tender. In the examples I’ve seen, create_reward.points is negative and delete_reward.points positive, so confirm the signs in your own data before summing.
If you were already querying by account and time window and there’s still no CREATE_REWARD, that would be a genuine gap — send the loyalty_account_id and order_id and I will dig in further.
On deriving used points: check Order.rewards[] on the order each entry has a reward_tier_id that maps to reward_tiers[].points from RetrieveLoyaltyProgram. Failing that, loyalty events can be correlated on loyalty_account_id, created_at and location_id, though there’s no true join key, so multiple redemptions in a short window may be ambiguous.