Supercharge Your Stripe Radar with ATO Risk Signals

Ready to get more out of your fraud solution? Track your login events in Sumatra and start sending powerful Account-Takeover risk signals to Stripe at purchase time.

To stop Account Takeover, you need the full picture.

Problem
Radar can't see logins

Stripe Radar is great at identifying payment risk, but it lacks the risk signals to identify account takeover, because it can't see login behavior.

Solution
Add signals from Sumatra

Send logins to Sumatra, compute powerful ATO signals, and pass those signals to Stripe to add risk at purchase time.

Result
Able to write better rules

Fraud team can start writing better rules in minutes, stopping attackers from getting their goods out the door.

Real-Time Risk Signals in 3 Simple Steps

Implementing this recipe with Sumatra is as easy as pasting a few lines of code into the Sumatra Editor and adding a couple of API calls to your back end.

1. Send Login Events to Sumatra

On every login attempt, call the Sumatra SDK from your back end (Node or Python) to pass attributes asynchronously to Sumatra:

# server.py
import sumatra
sumatra.api_key = "7c096c2f-4023-4696-814e-a4c371517e8e"
sumatra.track("login", { "user_id": "user@example.com", "ip": "205.12.234.7", "successful": True })

2. Copy-Paste Proven ATO Signals

The following feature code, written in Scowl, identifies risky login activity and makes those signals available at purchase time:

event login
failed_users_by_ip_15m := CountUnique(
    user_id
    by ip
    where not successful
    last 15 minutes)
event purchase -- brute-force attack signal failed_logins_by_user_5d := Count<login>( by user_id where not successful last 5 days) -- credential-stuffing attack signal failed_users_by_login_ip_5d := Max<login>( failed_users_by_ip_15m by user_id where successful -- attacker eventually succeeded last 5 days) to_stripe = {failed_logins_by_user_5d, failed_users_by_login_ip_5d}

When you paste this snippet into the Sumatra Editor and click "Apply", you deploy a scalable, serverless feature service with stateful risk signals, in just a few seconds.

3. Fetch and Pass Signals to Stripe

Call Sumatra's enrich function to fetch the features you configured and pass these signals along to Stripe as metadata:

# server.py
features = sumatra.enrich("purchase", {
    "user_id": "user@example.com"
})
stripe.Charge.create( amount=2000, currency="usd", source="tok_amex", # add Sumatra features to metadata metadata=dict(order_id="12345", **features["to_stripe"]), )

That's it!

With the integration complete, you can continue to add more and more Sumatra features without touching your backend code again.

As soon as the first purchase with new metadata is processed, you can start writing rules on the new signals!

To check out another recipe for reducing fraud and abuse with Sumatra, see: Prevent Fake Account Creation with Smart Rate Limiting.

Ready to start building these and many more fraud signals?