PCI DSS for SaaS Companies
SaaS companies face unique PCI DSS considerations. You're likely not a traditional merchant accepting payments in a store, and you're probably not a payment processor. But if your product has any payment functionality, you have PCI DSS obligations.
The good news: modern payment integrations make PCI DSS achievable for most SaaS companies with minimal scope. This guide explains how PCI DSS applies specifically to SaaS, common architectures, and strategies to minimize compliance burden.
Key Takeaways
| Point | Summary |
|---|---|
| Using Stripe/Adyen | Typically qualifies for SAQ A (~27 questions in v4.0) with proper integration |
| Key strategy | Never let card data touch your servers |
| Tokenization | Store tokens instead of card numbers to reduce scope |
| Service provider status | If you handle payments on behalf of customers, different rules apply |
| Enterprise customers | Often require both PCI compliance and SOC 2 |
Do You Need PCI DSS Compliance?
Yes, If You:
- Accept credit card payments for your SaaS subscription
- Enable your customers to accept payments through your platform
- Store any cardholder data (even encrypted)
- Transmit cardholder data through your systems
- Provide services that interact with payment processing
Common SaaS Scenarios
| Scenario | PCI Requirement | Typical SAQ |
|---|---|---|
| Subscription billing with Stripe | Yes | SAQ A |
| Marketplace with payments | Yes (Service Provider likely) | SAQ D |
| E-commerce platform for customers | Yes (Service Provider) | SAQ D |
| CRM that stores last 4 digits | Possibly (truncated PANs reduce scope) | Consult QSA |
| Analytics only (no payment data) | No | None |
| Integration with payment data | Yes | Depends on data handled |
Understanding Your Role: Merchant vs Service Provider
This distinction dramatically affects your compliance requirements:
Merchant
You're a merchant if: You accept payments for your own products/services.
Example: A SaaS company charging customers $99/month for their software subscription.
Compliance implications:
- Validation level based on your transaction volume
- Can typically use simplified SAQ types
- Responsible only for your own compliance
Service Provider
You're a service provider if: You handle cardholder data on behalf of other businesses.
Examples:
- Payment platform enabling merchants to accept payments
- E-commerce platform processing customer orders
- Invoicing software that facilitates payments
- Marketplace handling payments between buyers and sellers
Compliance implications:
- Higher compliance standards (Level 1 or Level 2 only)
- Must use SAQ D or undergo QSA assessment
- Listed on card brand service provider registries
- Customers will require your AOC
Dual role: Many SaaS companies are both merchants (for their own subscriptions) and service providers (for payment features). You need to address both.
The Ideal SaaS Payment Architecture
The goal: minimize PCI scope by keeping card data off your servers entirely.
Architecture 1: Redirect to Hosted Payment Page (Recommended)
Customer → Your App → Redirect → Stripe Checkout → Token → Your App
How it works:
- Customer clicks "Pay" in your app
- Redirect to Stripe Checkout or Stripe Payment Links
- Customer enters card on Stripe's domain
- Stripe returns token to your app
- You store the token (not card data)
SAQ impact: SAQ A (simplest)
Pros:
- Minimal PCI scope
- Stripe handles PCI compliance for payment pages
- Easy to implement
Cons:
- Less control over checkout UX
- Customer leaves your domain temporarily
Architecture 2: Embedded Payment Form (iframe)
Customer → Your App (with Stripe Elements iframe) → Token → Your App
How it works:
- Customer is on your checkout page
- Card fields are Stripe Elements (iframes)
- Card data goes directly from iframe to Stripe
- Stripe returns token to your app
- Your servers never see card data
SAQ impact: SAQ A (with proper implementation)
Pros:
- Seamless UX on your domain
- Minimal PCI scope
- Customizable styling
Cons:
- More implementation complexity
- Must ensure proper iframe isolation
Architecture 3: Custom Form with Client-Side Tokenization
Customer → Your App → Stripe.js → Stripe API → Token → Your App
How it works:
- Customer enters card on your payment page
- Stripe.js encrypts and sends directly to Stripe
- Stripe returns token
- Your backend receives only the token
SAQ impact: SAQ A-EP (~191 questions in v4.0)
Why SAQ A-EP: Your server serves the payment page, making you responsible for web server security.
Pros:
- Full control over UX
- Card data doesn't hit your server
Cons:
- Larger compliance scope than SAQ A
- More controls to implement and maintain
Architecture 4: Server-Side Card Handling (Avoid If Possible)
Customer → Your App → Your Server → Payment API → Response
How it works:
- Card data submitted to your server
- Your server sends to payment processor
- You may store card data for later use
SAQ impact: SAQ D (330+ questions in v4.0)
Why SAQ D: Card data touches your systems, expanding scope dramatically.
When this is necessary:
- Legacy systems requiring migration
- Complex payment orchestration
- PCI Level 1 service providers
Recommendation: Avoid this architecture unless absolutely necessary. The compliance burden is significant.
Common SaaS Payment Patterns
Pattern 1: Subscription Billing
Use case: Monthly/annual SaaS subscriptions
Recommended approach:
- Use Stripe Billing or similar
- Checkout via Stripe Checkout or Elements
- Store customer tokens for recurring charges
- Let Stripe handle card updates (via Account Updater)
SAQ type: SAQ A
Pattern 2: Usage-Based Billing
Use case: Pay-per-use, metered billing
Recommended approach:
- Same as subscription billing
- Track usage in your system
- Bill against stored payment method tokens
- Use Stripe Usage Records or similar
SAQ type: SAQ A
Pattern 3: Marketplace / Platform Payments
Use case: Multi-sided marketplace, SaaS enabling customer payments
Recommended approach:
- Use Stripe Connect, Adyen for Platforms, or similar
- Let the platform handle onboarding and compliance
- Your merchants may need their own PCI compliance
SAQ type: SAQ D (as service provider)
Important: As a platform, you're likely a service provider. Plan for more comprehensive compliance.
Pattern 4: Invoicing with Payment Links
Use case: B2B SaaS with invoice-based payments
Recommended approach:
- Generate payment links (Stripe Payment Links, Adyen Pay by Link)
- Customer pays on hosted payment page
- Reconcile against invoice in your system
SAQ type: SAQ A
Integrating with Enterprise Customers
Enterprise SaaS deals often require both PCI DSS compliance and additional security validations:
What Enterprises Ask For
| Request | How to Satisfy |
|---|---|
| PCI DSS compliance | SAQ A or AOC from assessment |
| SOC 2 Type 2 | Annual CPA attestation |
| Penetration test | Annual third-party test |
| Security questionnaire | Complete their questionnaire |
| Vendor assessment | Participate in their vendor security program |
Documentation to Prepare
- Attestation of Compliance (AOC): Summary document from your SAQ or QSA assessment
- Evidence of SAQ completion: Signed and dated SAQ
- Service provider list: PCI-compliant vendors you rely on (Stripe, AWS, etc.)
- Architecture diagram: Showing card data flows
- Stripe/Adyen AOC: Request from your payment provider to share with customers
Multi-Tenant Considerations
SaaS applications are typically multi-tenant, which introduces specific considerations:
Data Isolation
- Ensure cardholder data (tokens) are properly isolated between tenants
- Access controls prevent cross-tenant data access
- Logging captures tenant context for audit trails
Configuration Management
- Tenant-specific payment provider configurations
- Secure handling of API keys per tenant
- Proper testing environments (don't use production payment data in dev)
Compliance Inheritance
If you're a service provider:
- Your compliance helps your customers' compliance
- Document what controls your customers inherit
- Provide compliance attestation for their assessments
Common Mistakes for SaaS Companies
Mistake 1: Logging Card Numbers
Problem: Accidentally logging full PANs in application logs.
Solution:
- Audit all logging for cardholder data
- Use tokenization before any logging occurs
- Mask or exclude card data from error reports
Mistake 2: Storing CVV
Problem: Storing CVV/CVC even temporarily.
Solution: CVV should never be stored, even encrypted, after authorization. If your system stores CVV, fix this immediately.
Mistake 3: Insecure Token Storage
Problem: Treating tokens as non-sensitive because they're not full PANs.
Solution: While tokens reduce scope, protect them appropriately:
- Access controls on token data
- Encryption at rest (best practice)
- Audit logging for token access
Mistake 4: Development with Production Cards
Problem: Using real card data in development or testing.
Solution:
- Use Stripe/Adyen test mode and test cards
- Never use production credentials in non-production
- Clear test data before production deployment
Mistake 5: Ignoring Service Provider Status
Problem: Platform handling payments for customers without proper service provider compliance.
Solution:
- Assess whether you're a service provider
- Plan for SAQ D or QSA assessment
- Register with card brands if required
Checklist: PCI DSS for SaaS
Architecture:
- Card data never touches your servers (tokenization at edge)
- Using hosted payment forms or iframes
- Tokens stored instead of card numbers
- Test environments use test cards only
Documentation:
- Payment data flow documented
- SAQ type identified
- Service provider relationships documented
- Policies cover payment data handling
Implementation:
- TLS 1.2+ for all payment-related traffic
- No cardholder data in logs
- Access controls on payment functions
- Secure API key management
Validation:
- Appropriate SAQ completed
- Quarterly ASV scans (if required)
- Annual penetration test (recommended)
- AOC available for customers
Frequently Asked Questions
Does using Stripe mean I'm automatically PCI compliant?
No. Stripe handles their PCI compliance, but you still have obligations for how you integrate with Stripe. You need to complete an SAQ (typically SAQ A) to attest that your integration is properly implemented.
Can I see credit card numbers with Stripe Elements?
No. With proper Elements implementation, card numbers go directly from the iframe to Stripe. Your JavaScript cannot access the card data inside the iframe. This is what enables SAQ A eligibility.
My customers' customers enter card data. Who is responsible for PCI?
Typically, your customers are responsible for their PCI compliance as merchants. You may be a service provider supporting their compliance. Document the responsibility split clearly.
Do I need to display a PCI compliance badge?
There's no official PCI compliance badge. Don't display third-party "PCI certified" badges as they may be misleading. You can state "PCI DSS compliant" in your documentation if accurate.
Need help determining your PCI scope or implementing compliant payment integration? Talk to our team
Sources
- PCI SSC Guidance for Tokenization - Tokenization guidance
- Stripe PCI Compliance Guide - Stripe-specific guidance
- PCI DSS E-commerce Guidelines - E-commerce supplement
