Stripe Radar Rules That Work
The prevention layer — what to actually deploy in Radar before disputes post.
Read →Build rules in the live generator, then sharpen on six fraud detective challenges and the attribute flashcard deck. Real Stripe syntax — straight from the supported-attributes spec.
Stripe Radar can stop fraud before it costs you — the hard part is building the rules. Card testing is happening right now: every hour, automated scripts hammer your checkout with stolen cards, looking for one that still works. On one client engagement, the chargeback rate had climbed past thirteen percent.
Building Radar rules is hard. You have to know the attribute names. You have to know the time windows. You have to pick a sensible threshold. And you have to deploy in Review first — without breaking real customers.
So we built it: a live rule generator with twenty real fraud patterns, every attribute name verified against Stripe's spec, and copy-ready output.
Step one — pick the fraud pattern you're targeting: card testing, stolen-card velocity, sign-up abuse, geo anomalies, or customer behavior. Step two — tune the parameters; the generator already knows the sensible defaults, so you start safe, then push from there. Step three — real Stripe syntax: copy the rule and paste it straight into Radar Rules.
There are twenty patterns covering five categories: card testing, stolen cards, sign-up abuse, geo and IP, and customer-amount behavior. Every one ships with field-tested defaults. Take rapid card retry — same card, multiple attempts inside an hour, almost always a script. Three attempts is the sane ceiling.
Every attribute name is pulled straight from Stripe's supported-attributes documentation. No invented identifiers. No fake names that won't compile.
On that same engagement, this is the rule set we deployed — phase one of the rescue. From thirteen percent chargebacks to under one, in ninety days.
Built by Georges Rayess. The generator captures the patterns that actually moved the dispute ratio — not generic defaults. There's a whole academy around it: story mode, speed-drill flashcards, and the risk calculator, all free and linked from the generator page. Open the generator, pick a pattern, and build a rule in under a minute. If you're approaching VAMP or ECM, book the full Radar rebuild.
Pick a fraud pattern, tune the parameters, copy the rule. Every move earns XP and unlocks badges as you go.
Review for at least 7 days against real traffic. Inspect the matched charges in Stripe Dashboard → Radar → Reviews queue. Only promote to Block when 80%+ of matches are clearly fraud. See the full backtest workflow.
Hand-picked combinations that work out of the box for most subscription apps. Use these as templates and tune via the generator above.
Block if :total_transactions_per_payment_instrument_fingerprint_hourly: > 3
Block if :card_count_for_ip_address_hourly: > 5 and :card_funding: in ("debit", "prepaid")
Block if :risk_score: > 65 and :card_country: != :ip_country:
Block if :dispute_count_on_card_number_yearly: > 0
Block if :efw_count_on_card_all_time: > 0
Request 3D Secure if :is_anonymous_ip: = true
Request 3D Secure if :is_disposable_email: = true
Block if :cvc_check: = "fail" and :risk_score: > 50
Request 3D Secure if :is_recurring: = true and :risk_score: > 60
Block if :email_count_for_ip_hourly: > 5
Review if :amount_in_usd: > 100 and :is_recurring: = false and :risk_score: > 40
Review if :seconds_since_customer_was_created: < 300 and :amount_in_usd: > 50
Block if :card_count_for_customer_weekly: > 3
Request 3D Secure if :digital_wallet: != "none" and :hours_since_customer_was_created: < 1
Every attribute below is supported by Stripe Radar's rules engine, sourced from the official supported-attributes spec. Use these directly in custom rules — the generator above wires the most common ones, but the full list is available for power users.
:risk_level:normal / elevated / highest / not_assessed:risk_score:0-100 ML risk score:billing_address_country:two-letter country code:billing_address_state:state:billing_address_city:city:billing_address_postal_code:ZIP / postal:shipping_address_country:two-letter country code:shipping_address_state:state:distance_between_billing_and_shipping_address:km:distance_between_ip_and_billing_address:km:distance_between_ip_and_shipping_address:km:card_bin:first 6 digits of card:card_brand:visa / mc / amex / dscvr / diners / jcb / cup:card_country:two-letter country code of issuer:card_funding:credit / debit / prepaid / unknown:card_fingerprint:unique card identifier:card_3d_secure_support:required / recommended / optional / not_supported:is_new_card_on_customer:boolean:cvc_check:pass / fail / unavailable / unchecked / not_provided:address_zip_check:pass / fail / unavailable / unchecked / not_provided:address_line1_check:pass / fail / unavailable / unchecked / not_provided:is_3d_secure:boolean:is_3d_secure_authenticated:boolean:has_liability_shift:boolean:email:full email address:email_domain:domain only:is_disposable_email:boolean:email_count_for_ip_hourly:0-25:email_count_for_ip_daily:0-25:email_count_for_billing_address_daily:0-25:email_count_for_card_weekly:0-25:ip_address:raw IP:ip_country:two-letter country code:ip_state:state:ip_address_connection_type:cable/dsl / cellular / corporate / dialup:is_anonymous_ip:boolean (proxy or Tor):isp:ISP name:is_my_login_ip:boolean:total_transactions_per_payment_instrument_fingerprint_hourly::total_transactions_per_payment_instrument_fingerprint_daily::authorized_transactions_per_payment_instrument_fingerprint_hourly::declined_transactions_per_payment_instrument_fingerprint_hourly::blocked_transactions_per_payment_instrument_fingerprint_daily::card_count_for_ip_address_hourly:0-25:card_count_for_ip_address_daily:0-25:card_count_for_customer_weekly:0-25:card_count_for_billing_address_weekly:0-25:name_count_for_card_weekly:0-25:dispute_count_on_card_number_yearly:0-25:dispute_count_on_card_number_all_time:0-25:dispute_count_on_ip_weekly:0-25:efw_count_on_card_all_time:0-25:efw_count_on_card_weekly:0-25:efw_count_on_ip_weekly:0-25:customer:Customer object ID:total_customers_for_email_yearly:0-25:total_customers_with_prior_fraud_activity_for_email_yearly:0-25:total_customers_with_prior_fraud_activity_for_card_yearly:0-25:amount_in_usd:numeric:amount_in_eur:numeric:amount_in_gbp:numeric:average_usd_amount_attempted_on_customer_all_time::total_usd_amount_successful_on_card_all_time::seconds_since_customer_was_created::minutes_since_customer_was_created::hours_since_customer_was_created::hours_since_card_first_seen::hours_since_email_first_seen::hours_since_first_successful_auth_on_card::payment_method_type:card / sepa_debit / us_bank_account:digital_wallet:apple_pay / android_pay / samsung_pay / amazon_pay / revolut_pay / meta_pay / amex_express_checkout / masterpass / visa_checkout / none:has_cryptogram:boolean:is_checkout:boolean:is_off_session:boolean:is_recurring:boolean:is_setup_intent:boolean:currency:3-letter codeFull reference (200+ attributes including cross-payment-method, ACH, and Connect platform attributes) at docs.stripe.com/radar/rules/supported-attributes.
Phase 1 of the 90-day rescue program rebuilds your entire Radar configuration calibrated to your actual fraud patterns — not generic defaults.
The prevention layer — what to actually deploy in Radar before disputes post.
Read →Five-chapter fraud detective campaign with boss challenges.
Read →Plug in your fraud and chargeback counts to model your live VAMP and ECM ratios.
Read →