Stripe Payment Analytics: Understanding Card Brands, Fees, and How to Optimize
By MCP Analytics Team | Published , updated
If you search "Mastercard vs Stripe," you'll find comparison pages that don't make sense. Stripe is a payment processor, the technology that lets your website accept payments. Mastercard is a card network, the infrastructure that routes money between banks. They're not competitors. They work together on every Mastercard transaction you process through Stripe.
But the search exists because business owners have a real question underneath the wrong framing: "How do different card brands affect my Stripe costs, and can I do anything about it?" That question is worth answering properly.
This guide covers how to analyze your Stripe payment data by card brand, why the effective fee rate can differ between brands, where declined payments cost you revenue, and how to look for savings. All from data you already have in your Stripe account.
Worked Example: Fee Rate by Card Brand (Made-Up Data)
Question: In a small made-up example, how do fees compare for Visa and Amex?
Inputs: Simulated data, seed 17. The script makes 24 charges, 12 Visa and 12 Amex, with amounts in cents. It applies one fee rule to every charge: 2.9% of the charge plus 30 cents. This is an assumed fee rule, not a current price from any company. Visa charges are drawn from 2,500 to 12,000 cents and Amex charges from 5,000 to 20,000 cents.
Method: For each brand, add the charge amounts and the fees. Then divide the fee total by the charge total.
import random
from collections import defaultdict
SEED = 17
random.seed(SEED)
brands = ("Visa", "Amex")
rows = []
for i in range(24):
brand = brands[i % len(brands)]
# Simulated charge amounts in cents; Amex draws from a higher range.
low, high = (2500, 12000) if brand == "Visa" else (5000, 20000)
amount = random.randint(low, high)
fee = round(amount * 0.029 + 30)
rows.append((brand, amount, fee))
summary = defaultdict(lambda: [0, 0, 0])
for brand, amount, fee in rows:
summary[brand][0] += 1
summary[brand][1] += amount
summary[brand][2] += fee
print(f"Simulated data, seed {SEED}")
print("Assumed fee rule: 2.9% of each charge plus 30 cents")
print("Brand | charges | charge total | fee total | fee / charge total")
for brand in brands:
count, amount, fee = summary[brand]
print(f"{brand} | {count} | ${amount / 100:.2f} | ${fee / 100:.2f} "
f"| {fee / amount:.4%}")
Output:
Simulated data, seed 17
Assumed fee rule: 2.9% of each charge plus 30 cents
Brand | charges | charge total | fee total | fee / charge total
Visa | 12 | $1043.13 | $33.85 | 3.2450%
Amex | 12 | $1367.57 | $43.25 | 3.1625%
Result: With this rule, the Visa fee rate is 3.2450% and the Amex fee rate is 3.1625%. There is no brand difference in the script: both brands pay the identical built-in rule. The Amex rate is lower only because larger charges dilute the flat 30 cents. The script builds that in by drawing Amex charges from a higher range. Each rate is above 2.9% because every charge also carries the flat 30 cents.
Limit: This uses made-up data and one assumed fee rule. It does not show what real buyers do, what any card brand costs, or any firm's current terms. With only 12 charges per brand, another seed would give different totals.
How the Payment Ecosystem Actually Works
Before diving into analytics, a short primer on why card brands matter to your bottom line. Every card transaction involves four parties:
- Your customer (cardholder) holds a Visa, Mastercard, Amex, or Discover card
- The card network (Visa, Mastercard, etc.) routes the transaction and sets network rules
- The issuing bank issued the card to your customer
- Your payment processor (Stripe) handles the technical integration and settles funds to you
When a customer pays, the processor charges you a fee for the payment. Part of what goes into that fee is paid on to the card network and the issuing bank, and the processor keeps the rest. How the fee is built depends on your agreement and on the card used, so read your own agreement and statements for current terms.
Why Your Card Brand Mix Matters
Your customers' choice of card can change your costs. Two effects are easy to look for in your own export.
Fee Differences by Charge Size and Card Type
A flat amount per charge weighs more on small charges than on large ones, which is the effect in the worked example above. Depending on your agreement, the fee may also vary with the card type, brand or country. Check the Fee column in your export rather than assuming a rate, and compare brands only after you look at charge size, because a brand with larger charges can show a lower effective rate with no difference in the underlying rule.
Acceptance Rate Differences
Card brands and card countries can also differ in how often payments are declined. Measure this in your own data by grouping the Status column by brand and by country. Every declined payment is a payment you did not collect, so the decline rate matters as much as the fee rate.
How to Analyze Your Payment Data
Here's how to get actionable insights from the payment data already sitting in your Stripe account.
Step 1: Export Your Data
Go to your Stripe Dashboard, open the payments list, choose a long date range, and export as CSV. The key columns you need are:
Amount: transaction value (in cents for USD)Fee: what Stripe charged youCard Brand: Visa, Mastercard, Amex, Discover, etc.Card Funding: credit, debit, or prepaidCard Country: domestic vs. internationalStatus: succeeded, failed, refundedCreated (UTC): transaction timestampFailure Code: reason for declines
Step 2: Calculate Your Card Brand Distribution
Group transactions by card brand and calculate both count share and amount share. These can differ when one brand has larger charges, as the Amex charges do in the worked example.
Step 3: Calculate Effective Fee Rate by Card Brand
Divide total fees by total charge amount for each card brand, as the worked example does.
Effective Fee Rate = Total Fees for Brand / Total Charge Amount for Brand
If the rates differ, check the average charge size for each brand before you conclude that the brand matters. A flat per-charge amount alone can produce a gap.
Step 4: Analyze Decline Rates by Card Brand
Filter for failed transactions and group by card brand and failure code. Common decline reasons and their fixes:
| Failure Code | Meaning | Fix |
|---|---|---|
insufficient_funds |
Card doesn't have enough balance | Retry later (for subscriptions) |
expired_card |
Card has expired | Pre-dunning emails + Stripe card updater |
card_declined |
Generic decline from issuing bank | Retry with updated card details |
incorrect_cvc |
Wrong security code entered | UX improvement at checkout |
fraudulent |
Issuer suspects fraud | Tune Stripe Radar rules |
do_not_honor |
Bank refuses (no specific reason) | Customer contacts their bank |
Overly aggressive fraud screening causes "false declines": legitimate transactions rejected as possible fraud. If your fraudulent declines look high, review your Stripe Radar rules and compare the blocked payments with the fraud you actually confirmed. Count both sides before you change the rules.
Fee Optimization Strategies
Once you understand your card mix and decline patterns, here are ways to look for a lower effective processing cost.
1. Ask About Other Pricing Structures
Ask your processor which pricing structures are available at your volume, and compare each one against your own export. Use your own mix of card types to estimate the effect. A general figure from another business will not tell you what your mix costs.
2. Encourage Lower-Cost Payment Methods
For B2B invoices and high-value transactions, a bank transfer option may cost less than a card payment. Compare the current terms of each method against your typical invoice size, because a flat per-charge amount and a percentage weigh differently on large and small payments.
You can nudge customers by listing bank transfer as the first payment option on invoices, or simply making the option visible. Many customers prefer bank transfers for large amounts but won't use them if the option isn't obvious.
3. Check Local Payment Methods
If you sell in several countries, compare your fees and decline rates by card country in your export. Then look at whether local payment methods, or pricing in local currencies, fit your largest markets.
4. Recover Failed Payments
Failed recurring payments (involuntary churn) are a fixable source of revenue leakage. A recovery strategy can include:
- Smart Retries: Enable Stripe's retry system, which chooses retry timing for you
- Pre-dunning emails: Email customers before their card expires with a link to update payment details
- Card updater: Enable Stripe's automatic card update feature, which refreshes expired card details with the issuing bank
- Graceful dunning: After a failed payment, send a short series of emails before canceling the subscription. Each email should include a one-click payment update link
Measure your own recovery rate before and after you change anything, so you know which step helped.
International Payment Optimization
If you sell to customers outside your home country, group your declines by card country to see whether payments from cards issued elsewhere decline more or less often than domestic ones in your data.
What to Do About It
If specific countries show high decline rates, investigate whether local payment methods would perform better. Examples of local methods, by region, are SEPA Direct Debit (eurozone), iDEAL (Netherlands), Bancontact (Belgium), Alipay and WeChat Pay (China), OXXO (Mexico) and Boleto (Brazil). Check which ones your processor supports before you plan around them.
You don't need to support every method in every market. Start with your largest markets by revenue, check the decline rates there, and consider the dominant local payment method in any market where declines look high.
What Your Payment Analytics Report Should Include
Whether you build this analysis yourself or use a tool, here's the complete picture you need from your Stripe payment data:
- Card brand distribution: Transaction count and amount share by Visa, Mastercard, Amex, Discover, and other networks. Track monthly to spot shifts in customer payment preferences.
- Effective fee rate by segment: Your actual cost of processing broken down by card brand, card type (credit/debit), and geography (domestic/international), shown with the average charge size for each segment.
- Decline analysis: Overall authorization rate, decline rate by card brand, and top decline reasons with volume. This quantifies how much revenue you're leaving on the table.
- Fee summary: Total fees paid and the fee total by segment, so you can see where your processing dollars go.
- Recovery metrics: For subscription businesses, failed payment recovery rate, average recovery time, and the MRR impact of unrecovered payments.
- Geographic distribution: Transaction volume and authorization rates by customer country. Identifies markets where local payment methods could improve conversion.
Your turn
Bring your own data and the question you actually need answered.
MCP AnalyticsData science by email Send us your data and your question, and we will reply. ds@mcpanalytics.ai
Frequently Asked Questions
Stripe and Mastercard serve completely different roles in the payment ecosystem. Stripe is a payment processor, the technology layer that lets your website accept payments. Mastercard is a card network, the infrastructure that routes transactions between your customer's bank and your bank. When a customer pays you via Stripe using a Mastercard, both are involved: Stripe handles the technical processing and Mastercard handles the network routing. They are not competitors and cannot be substituted for each other.
A fee rule with a flat amount per charge weighs more on small charges, so the effective rate depends on charge size. In the made-up example on this page, one assumed rule is applied to both brands, and the Amex rate is lower only because its charges are larger. Real fees depend on your agreement and on the card type, so read your own export and your processor's current terms.
Export your payment data from Stripe as a CSV and look at the "Card Brand" column. This shows the network for each transaction, such as Visa, Mastercard, American Express or Discover. Group by card brand to see your own distribution, by count and by amount.
Start by analyzing decline reasons in your Stripe data. Common ones are insufficient funds, expired cards, and incorrect card details. For failed recurring charges, use a retry schedule and send emails before cards expire. A card updater feature can refresh expired card details. For checkout declines, review your fraud rules, since overly aggressive rules can cause false declines.
It depends on your customer base and geography. Cards are enough for many customers, but a bank transfer option may suit large invoices, and local payment methods may suit some markets. Check your own decline rates and fees by market first, then compare them with each method's current terms.