@cloudstreamsoftware/claude-tools 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +152 -37
- package/agents/INDEX.md +183 -0
- package/agents/architect.md +247 -0
- package/agents/build-error-resolver.md +555 -0
- package/agents/catalyst-deployer.md +132 -0
- package/agents/code-reviewer.md +121 -0
- package/agents/compliance-auditor.md +148 -0
- package/agents/creator-architect.md +395 -0
- package/agents/deluge-reviewer.md +98 -0
- package/agents/doc-updater.md +471 -0
- package/agents/e2e-runner.md +711 -0
- package/agents/planner.md +122 -0
- package/agents/refactor-cleaner.md +309 -0
- package/agents/security-reviewer.md +582 -0
- package/agents/tdd-guide.md +302 -0
- package/config/versions.json +63 -0
- package/dist/hooks/hooks.json +209 -0
- package/dist/index.js +47 -0
- package/dist/lib/asset-value.js +609 -0
- package/dist/lib/client-manager.js +300 -0
- package/dist/lib/command-matcher.js +242 -0
- package/dist/lib/cross-session-patterns.js +754 -0
- package/dist/lib/intent-classifier.js +1075 -0
- package/dist/lib/package-manager.js +374 -0
- package/dist/lib/recommendation-engine.js +597 -0
- package/dist/lib/session-memory.js +489 -0
- package/dist/lib/skill-effectiveness.js +486 -0
- package/dist/lib/skill-matcher.js +595 -0
- package/dist/lib/tutorial-metrics.js +242 -0
- package/dist/lib/tutorial-progress.js +209 -0
- package/dist/lib/tutorial-renderer.js +431 -0
- package/dist/lib/utils.js +380 -0
- package/dist/lib/verify-formatter.js +143 -0
- package/dist/lib/workflow-state.js +249 -0
- package/hooks/hooks.json +209 -0
- package/package.json +5 -1
- package/scripts/aggregate-sessions.js +290 -0
- package/scripts/branch-name-validator.js +291 -0
- package/scripts/build.js +101 -0
- package/scripts/commands/client-switch.js +231 -0
- package/scripts/deprecate-skill.js +610 -0
- package/scripts/diagnose.js +324 -0
- package/scripts/doc-freshness.js +168 -0
- package/scripts/generate-weekly-digest.js +393 -0
- package/scripts/health-check.js +270 -0
- package/scripts/hooks/credential-check.js +101 -0
- package/scripts/hooks/evaluate-session.js +81 -0
- package/scripts/hooks/pre-compact.js +66 -0
- package/scripts/hooks/prompt-analyzer.js +276 -0
- package/scripts/hooks/prompt-router.js +422 -0
- package/scripts/hooks/quality-gate-enforcer.js +371 -0
- package/scripts/hooks/session-end.js +156 -0
- package/scripts/hooks/session-start.js +195 -0
- package/scripts/hooks/skill-injector.js +333 -0
- package/scripts/hooks/suggest-compact.js +58 -0
- package/scripts/lib/asset-value.js +609 -0
- package/scripts/lib/client-manager.js +300 -0
- package/scripts/lib/command-matcher.js +242 -0
- package/scripts/lib/cross-session-patterns.js +754 -0
- package/scripts/lib/intent-classifier.js +1075 -0
- package/scripts/lib/package-manager.js +374 -0
- package/scripts/lib/recommendation-engine.js +597 -0
- package/scripts/lib/session-memory.js +489 -0
- package/scripts/lib/skill-effectiveness.js +486 -0
- package/scripts/lib/skill-matcher.js +595 -0
- package/scripts/lib/tutorial-metrics.js +242 -0
- package/scripts/lib/tutorial-progress.js +209 -0
- package/scripts/lib/tutorial-renderer.js +431 -0
- package/scripts/lib/utils.js +380 -0
- package/scripts/lib/verify-formatter.js +143 -0
- package/scripts/lib/workflow-state.js +249 -0
- package/scripts/onboard.js +363 -0
- package/scripts/quarterly-report.js +692 -0
- package/scripts/setup-package-manager.js +204 -0
- package/scripts/sync-upstream.js +391 -0
- package/scripts/test.js +108 -0
- package/scripts/tutorial-runner.js +351 -0
- package/scripts/validate-all.js +201 -0
- package/scripts/verifiers/agents.js +245 -0
- package/scripts/verifiers/config.js +186 -0
- package/scripts/verifiers/environment.js +123 -0
- package/scripts/verifiers/hooks.js +188 -0
- package/scripts/verifiers/index.js +38 -0
- package/scripts/verifiers/persistence.js +140 -0
- package/scripts/verifiers/plugin.js +215 -0
- package/scripts/verifiers/skills.js +209 -0
- package/scripts/verify-setup.js +164 -0
- package/skills/INDEX.md +157 -0
- package/skills/backend-patterns/SKILL.md +586 -0
- package/skills/backend-patterns/catalyst-patterns.md +128 -0
- package/skills/bigquery-patterns/SKILL.md +27 -0
- package/skills/bigquery-patterns/performance-optimization.md +518 -0
- package/skills/bigquery-patterns/query-patterns.md +372 -0
- package/skills/bigquery-patterns/schema-design.md +78 -0
- package/skills/cloudstream-project-template/SKILL.md +20 -0
- package/skills/cloudstream-project-template/structure.md +65 -0
- package/skills/coding-standards/SKILL.md +524 -0
- package/skills/coding-standards/deluge-standards.md +83 -0
- package/skills/compliance-patterns/SKILL.md +28 -0
- package/skills/compliance-patterns/hipaa/audit-requirements.md +251 -0
- package/skills/compliance-patterns/hipaa/baa-process.md +298 -0
- package/skills/compliance-patterns/hipaa/data-archival-strategy.md +387 -0
- package/skills/compliance-patterns/hipaa/phi-handling.md +52 -0
- package/skills/compliance-patterns/pci-dss/saq-a-requirements.md +307 -0
- package/skills/compliance-patterns/pci-dss/tokenization-patterns.md +382 -0
- package/skills/compliance-patterns/pci-dss/zoho-checkout-patterns.md +56 -0
- package/skills/compliance-patterns/soc2/access-controls.md +344 -0
- package/skills/compliance-patterns/soc2/audit-logging.md +458 -0
- package/skills/compliance-patterns/soc2/change-management.md +403 -0
- package/skills/compliance-patterns/soc2/deluge-execution-logging.md +407 -0
- package/skills/consultancy-workflows/SKILL.md +19 -0
- package/skills/consultancy-workflows/client-isolation.md +21 -0
- package/skills/consultancy-workflows/documentation-automation.md +454 -0
- package/skills/consultancy-workflows/handoff-procedures.md +257 -0
- package/skills/consultancy-workflows/knowledge-capture.md +513 -0
- package/skills/consultancy-workflows/time-tracking.md +26 -0
- package/skills/continuous-learning/SKILL.md +84 -0
- package/skills/continuous-learning/config.json +18 -0
- package/skills/continuous-learning/evaluate-session.sh +60 -0
- package/skills/continuous-learning-v2/SKILL.md +126 -0
- package/skills/continuous-learning-v2/config.json +61 -0
- package/skills/frontend-patterns/SKILL.md +635 -0
- package/skills/frontend-patterns/zoho-widget-patterns.md +103 -0
- package/skills/gcp-data-engineering/SKILL.md +36 -0
- package/skills/gcp-data-engineering/bigquery/performance-optimization.md +337 -0
- package/skills/gcp-data-engineering/dataflow/error-handling.md +496 -0
- package/skills/gcp-data-engineering/dataflow/pipeline-patterns.md +444 -0
- package/skills/gcp-data-engineering/dbt/model-organization.md +63 -0
- package/skills/gcp-data-engineering/dbt/testing-patterns.md +503 -0
- package/skills/gcp-data-engineering/medallion-architecture/bronze-layer.md +60 -0
- package/skills/gcp-data-engineering/medallion-architecture/gold-layer.md +311 -0
- package/skills/gcp-data-engineering/medallion-architecture/layer-transitions.md +517 -0
- package/skills/gcp-data-engineering/medallion-architecture/silver-layer.md +305 -0
- package/skills/gcp-data-engineering/zoho-to-gcp/data-extraction.md +543 -0
- package/skills/gcp-data-engineering/zoho-to-gcp/real-time-vs-batch.md +337 -0
- package/skills/security-review/SKILL.md +498 -0
- package/skills/security-review/compliance-checklist.md +53 -0
- package/skills/strategic-compact/SKILL.md +67 -0
- package/skills/tdd-workflow/SKILL.md +413 -0
- package/skills/tdd-workflow/zoho-testing.md +124 -0
- package/skills/tutorial/SKILL.md +249 -0
- package/skills/tutorial/docs/ACCESSIBILITY.md +169 -0
- package/skills/tutorial/lessons/00-philosophy-and-workflow.md +198 -0
- package/skills/tutorial/lessons/01-basics.md +81 -0
- package/skills/tutorial/lessons/02-training.md +86 -0
- package/skills/tutorial/lessons/03-commands.md +109 -0
- package/skills/tutorial/lessons/04-workflows.md +115 -0
- package/skills/tutorial/lessons/05-compliance.md +116 -0
- package/skills/tutorial/lessons/06-zoho.md +121 -0
- package/skills/tutorial/lessons/07-hooks-system.md +277 -0
- package/skills/tutorial/lessons/08-mcp-servers.md +316 -0
- package/skills/tutorial/lessons/09-client-management.md +215 -0
- package/skills/tutorial/lessons/10-testing-e2e.md +260 -0
- package/skills/tutorial/lessons/11-skills-deep-dive.md +272 -0
- package/skills/tutorial/lessons/12-rules-system.md +326 -0
- package/skills/tutorial/lessons/13-golden-standard-graduation.md +213 -0
- package/skills/tutorial/lessons/14-fork-setup-and-sync.md +312 -0
- package/skills/tutorial/lessons/15-living-examples-system.md +221 -0
- package/skills/tutorial/tracks/accelerated/README.md +134 -0
- package/skills/tutorial/tracks/accelerated/assessment/checkpoint-1.md +161 -0
- package/skills/tutorial/tracks/accelerated/assessment/checkpoint-2.md +175 -0
- package/skills/tutorial/tracks/accelerated/day-1-core-concepts.md +234 -0
- package/skills/tutorial/tracks/accelerated/day-2-essential-commands.md +270 -0
- package/skills/tutorial/tracks/accelerated/day-3-workflow-mastery.md +305 -0
- package/skills/tutorial/tracks/accelerated/day-4-compliance-zoho.md +304 -0
- package/skills/tutorial/tracks/accelerated/day-5-hooks-skills.md +344 -0
- package/skills/tutorial/tracks/accelerated/day-6-client-testing.md +386 -0
- package/skills/tutorial/tracks/accelerated/day-7-graduation.md +369 -0
- package/skills/zoho-patterns/CHANGELOG.md +108 -0
- package/skills/zoho-patterns/SKILL.md +446 -0
- package/skills/zoho-patterns/analytics/dashboard-patterns.md +352 -0
- package/skills/zoho-patterns/analytics/zoho-to-bigquery-pipeline.md +427 -0
- package/skills/zoho-patterns/catalyst/appsail-deployment.md +349 -0
- package/skills/zoho-patterns/catalyst/context-close-patterns.md +354 -0
- package/skills/zoho-patterns/catalyst/cron-batch-processing.md +374 -0
- package/skills/zoho-patterns/catalyst/function-patterns.md +439 -0
- package/skills/zoho-patterns/creator/form-design.md +304 -0
- package/skills/zoho-patterns/creator/publish-api-patterns.md +313 -0
- package/skills/zoho-patterns/creator/widget-integration.md +306 -0
- package/skills/zoho-patterns/creator/workflow-automation.md +253 -0
- package/skills/zoho-patterns/deluge/api-patterns.md +468 -0
- package/skills/zoho-patterns/deluge/batch-processing.md +403 -0
- package/skills/zoho-patterns/deluge/cross-app-integration.md +356 -0
- package/skills/zoho-patterns/deluge/error-handling.md +423 -0
- package/skills/zoho-patterns/deluge/syntax-reference.md +65 -0
- package/skills/zoho-patterns/integration/cors-proxy-architecture.md +426 -0
- package/skills/zoho-patterns/integration/crm-books-native-sync.md +277 -0
- package/skills/zoho-patterns/integration/oauth-token-management.md +461 -0
- package/skills/zoho-patterns/integration/zoho-flow-patterns.md +334 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
# PCI-DSS SAQ-A Requirements
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Self-Assessment Questionnaire A (SAQ-A) is the simplest PCI-DSS compliance path, applicable when **all payment processing is fully outsourced** to a PCI-certified third party (like Zoho Payments or Stripe) and the merchant never handles, processes, or stores cardholder data on their own systems.
|
|
6
|
+
|
|
7
|
+
This is the ONLY PCI compliance path CloudStream should implement for clients. Any deviation from SAQ-A eligibility means the client needs a Qualified Security Assessor (QSA) -- refer them to a PCI specialist.
|
|
8
|
+
|
|
9
|
+
> **WARNING**: SAQ-A eligibility is LOST if your application touches raw card data at any point -- even in transit, even in an error log, even in a URL parameter. Hosted payment pages are mandatory.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## SAQ-A Eligibility Criteria
|
|
14
|
+
|
|
15
|
+
### All of the following MUST be true:
|
|
16
|
+
|
|
17
|
+
| # | Criterion | How We Ensure It |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| 1 | All payment processing outsourced to PCI-validated provider | Zoho Payments / Stripe hosted pages only |
|
|
20
|
+
| 2 | No electronic storage of cardholder data | No card fields in Creator forms |
|
|
21
|
+
| 3 | No processing of cardholder data on merchant systems | Redirect to hosted page, receive only tokens |
|
|
22
|
+
| 4 | No transmission of cardholder data through merchant network | iFrame/redirect approach, no server-side card handling |
|
|
23
|
+
| 5 | Merchant does not serve payment page (all hosted) | Zoho Checkout / Stripe Checkout pages |
|
|
24
|
+
| 6 | Merchant confirms provider is PCI-DSS compliant | Verify Zoho/Stripe Attestation of Compliance (AoC) |
|
|
25
|
+
|
|
26
|
+
### Eligibility Disqualifiers
|
|
27
|
+
|
|
28
|
+
If ANY of these are true, SAQ-A does NOT apply:
|
|
29
|
+
|
|
30
|
+
- Client's website serves the payment form (even with JavaScript tokenization) --> SAQ-A-EP
|
|
31
|
+
- Card data passes through client's server for any reason --> SAQ-D
|
|
32
|
+
- Client stores any cardholder data (even encrypted) --> SAQ-D
|
|
33
|
+
- Client uses a virtual terminal for manual card entry --> SAQ-C-VT
|
|
34
|
+
- Client has a physical POS terminal --> SAQ-B or SAQ-C
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Annual Self-Assessment Process
|
|
39
|
+
|
|
40
|
+
### Timeline
|
|
41
|
+
|
|
42
|
+
| Month | Activity |
|
|
43
|
+
|---|---|
|
|
44
|
+
| January | Begin annual SAQ-A review |
|
|
45
|
+
| January | Request updated AoC from payment providers |
|
|
46
|
+
| February | Complete SAQ-A questionnaire |
|
|
47
|
+
| February | Conduct internal vulnerability review |
|
|
48
|
+
| March | Submit SAQ-A attestation |
|
|
49
|
+
| March | File with acquiring bank/payment processor |
|
|
50
|
+
| Quarterly | Review for changes that affect eligibility |
|
|
51
|
+
| Ongoing | Monitor for security incidents |
|
|
52
|
+
|
|
53
|
+
### SAQ-A Questionnaire Sections
|
|
54
|
+
|
|
55
|
+
The SAQ-A contains requirements from the following PCI-DSS sections:
|
|
56
|
+
|
|
57
|
+
1. Requirement 2 - Default passwords changed
|
|
58
|
+
2. Requirement 6 - Secure systems (web application security)
|
|
59
|
+
3. Requirement 8 - Authentication controls
|
|
60
|
+
4. Requirement 9 - Physical access (if applicable)
|
|
61
|
+
5. Requirement 12 - Security policy documentation
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 12 PCI-DSS Requirements Mapped to Zoho Implementation
|
|
66
|
+
|
|
67
|
+
### Full Requirement Mapping (SAQ-A Applicable Items Only)
|
|
68
|
+
|
|
69
|
+
| PCI Req | Requirement | SAQ-A Applicable? | Zoho Implementation |
|
|
70
|
+
|---|---|---|---|
|
|
71
|
+
| 1 | Install and maintain network security controls | Partial | N/A - Zoho manages infrastructure |
|
|
72
|
+
| 2 | Apply secure configurations | YES | Change default passwords on all Zoho accounts |
|
|
73
|
+
| 3 | Protect stored account data | YES (by exclusion) | We store NO cardholder data - tokens only |
|
|
74
|
+
| 4 | Protect data in transit | YES | Zoho enforces TLS 1.2+ on all connections |
|
|
75
|
+
| 5 | Protect from malicious software | Partial | Zoho manages endpoint security for SaaS |
|
|
76
|
+
| 6 | Develop and maintain secure systems | YES | Secure Deluge coding practices, input validation |
|
|
77
|
+
| 7 | Restrict access by business need | YES | Role-based access in Creator (see SOC 2 access controls) |
|
|
78
|
+
| 8 | Identify users and authenticate access | YES | MFA, unique IDs, password policies in Zoho One |
|
|
79
|
+
| 9 | Restrict physical access | Minimal | No on-premises cardholder data storage |
|
|
80
|
+
| 10 | Log and monitor access | Partial | Deluge execution logging, Creator audit trail |
|
|
81
|
+
| 11 | Test security regularly | YES | Quarterly review of payment integration |
|
|
82
|
+
| 12 | Support information security with policies | YES | Security policy documentation required |
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Documentation Requirements
|
|
87
|
+
|
|
88
|
+
### Required Documents for SAQ-A
|
|
89
|
+
|
|
90
|
+
| Document | Purpose | Update Frequency |
|
|
91
|
+
|---|---|---|
|
|
92
|
+
| Information Security Policy | Overarching security governance | Annual review |
|
|
93
|
+
| Incident Response Plan | Procedures for security incidents | Annual + after incidents |
|
|
94
|
+
| Payment Provider AoC | Proof of provider PCI compliance | Annual (request from provider) |
|
|
95
|
+
| SAQ-A Questionnaire | Self-assessment responses | Annual |
|
|
96
|
+
| Attestation of Compliance (AoC) | Merchant's compliance declaration | Annual |
|
|
97
|
+
| Network Diagram | Shows payment flow | Annual + on changes |
|
|
98
|
+
| Data Flow Diagram | Shows where card data does/doesn't go | Annual + on changes |
|
|
99
|
+
| Vendor Management List | All third parties in payment flow | Annual review |
|
|
100
|
+
| Change Control Records | Evidence of change management | Ongoing |
|
|
101
|
+
| Access Control Documentation | User access matrix | Quarterly review |
|
|
102
|
+
|
|
103
|
+
### Payment Data Flow Diagram (Required)
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
Customer Browser
|
|
107
|
+
|
|
|
108
|
+
| HTTPS (TLS 1.2+)
|
|
109
|
+
|
|
|
110
|
+
v
|
|
111
|
+
Client's Zoho Creator Portal
|
|
112
|
+
|
|
|
113
|
+
| (1) "Pay Now" button clicked
|
|
114
|
+
| (Redirect URL generated - NO card data)
|
|
115
|
+
|
|
|
116
|
+
v
|
|
117
|
+
Zoho Checkout Hosted Page <--- PCI BOUNDARY
|
|
118
|
+
| (Everything below is
|
|
119
|
+
| (2) Card entered here Zoho's PCI responsibility)
|
|
120
|
+
| (Customer ↔ Zoho ONLY)
|
|
121
|
+
v
|
|
122
|
+
Zoho Payment Gateway
|
|
123
|
+
|
|
|
124
|
+
| (3) Card processed
|
|
125
|
+
|
|
|
126
|
+
v
|
|
127
|
+
Card Network (Visa/MC/Amex)
|
|
128
|
+
|
|
|
129
|
+
| (4) Authorized/Declined
|
|
130
|
+
|
|
|
131
|
+
v
|
|
132
|
+
Zoho Payments
|
|
133
|
+
|
|
|
134
|
+
| (5) Token + status returned to Creator
|
|
135
|
+
| (NO card data in this response)
|
|
136
|
+
|
|
|
137
|
+
v
|
|
138
|
+
Client's Zoho Creator <--- OUTSIDE PCI BOUNDARY
|
|
139
|
+
| (Only receives tokens)
|
|
140
|
+
| (6) Token stored for future use
|
|
141
|
+
| (7) Customer notified of result
|
|
142
|
+
v
|
|
143
|
+
Payment Complete
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
> The dotted PCI boundary shows that card data ONLY exists within Zoho's PCI-certified environment. Client systems never touch it.
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Quarterly Network Scans
|
|
151
|
+
|
|
152
|
+
### SAQ-A Scan Requirements
|
|
153
|
+
|
|
154
|
+
For most SAQ-A merchants (e-commerce only, no direct internet-facing payment systems):
|
|
155
|
+
|
|
156
|
+
- **External vulnerability scans**: Generally NOT required for pure SAQ-A
|
|
157
|
+
- **Internal scans**: NOT required for SAQ-A
|
|
158
|
+
- **However**: If you have ANY internet-facing systems that could affect payment security, quarterly ASV scans ARE required
|
|
159
|
+
|
|
160
|
+
### When Scans ARE Required for SAQ-A
|
|
161
|
+
|
|
162
|
+
| Scenario | Scan Required? | Type |
|
|
163
|
+
|---|---|---|
|
|
164
|
+
| Pure hosted payment redirect | No | N/A |
|
|
165
|
+
| Client website hosts payment iFrame | Yes (SAQ-A-EP) | Quarterly ASV scan |
|
|
166
|
+
| Client has any web application | Recommended | Quarterly ASV scan |
|
|
167
|
+
| Custom Catalyst endpoints handling payment webhooks | Recommended | Quarterly ASV scan |
|
|
168
|
+
|
|
169
|
+
### Approved Scanning Vendor (ASV) Options
|
|
170
|
+
|
|
171
|
+
If scans are required or recommended:
|
|
172
|
+
- Qualys
|
|
173
|
+
- Rapid7
|
|
174
|
+
- Tenable
|
|
175
|
+
- SecurityMetrics (popular for small businesses)
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Penetration Testing Requirements
|
|
180
|
+
|
|
181
|
+
### SAQ-A Requirements
|
|
182
|
+
|
|
183
|
+
- SAQ-A does **NOT** explicitly require penetration testing
|
|
184
|
+
- **However**: PCI-DSS v4.0 Requirement 11.4 strongly recommends it
|
|
185
|
+
- **CloudStream recommendation**: Annual penetration test of the payment integration flow
|
|
186
|
+
|
|
187
|
+
### What to Test
|
|
188
|
+
|
|
189
|
+
| Test Area | Scope | Frequency |
|
|
190
|
+
|---|---|---|
|
|
191
|
+
| Payment redirect flow | Ensure no card data leakage | Annual |
|
|
192
|
+
| Webhook endpoint | Authentication, injection | Annual |
|
|
193
|
+
| Token storage forms | Access controls, exposure | Annual |
|
|
194
|
+
| Creator portal | Session management, auth | Annual |
|
|
195
|
+
| Error handling | Ensure errors don't expose card data | Annual |
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## Incident Response Plan
|
|
200
|
+
|
|
201
|
+
### Payment Security Incident Categories
|
|
202
|
+
|
|
203
|
+
| Category | Example | Response Time |
|
|
204
|
+
|---|---|---|
|
|
205
|
+
| **Critical** | Suspected card data breach | Immediate (within 1 hour) |
|
|
206
|
+
| **High** | Unauthorized access to payment tokens | Within 4 hours |
|
|
207
|
+
| **Medium** | Payment webhook failures | Within 24 hours |
|
|
208
|
+
| **Low** | Failed payment processing | Next business day |
|
|
209
|
+
|
|
210
|
+
### Incident Response Steps
|
|
211
|
+
|
|
212
|
+
1. **Detect**: Identify the incident (monitoring, alert, customer report)
|
|
213
|
+
2. **Contain**: Isolate affected systems, disable compromised credentials
|
|
214
|
+
3. **Assess**: Determine scope -- was actual card data exposed?
|
|
215
|
+
4. **Notify**: Alert payment processor, client, acquiring bank (if breach confirmed)
|
|
216
|
+
5. **Investigate**: Root cause analysis using audit logs
|
|
217
|
+
6. **Remediate**: Fix the vulnerability, implement controls
|
|
218
|
+
7. **Report**: Document findings, update incident log
|
|
219
|
+
8. **Review**: Post-incident review, update procedures
|
|
220
|
+
|
|
221
|
+
### Incident Response Contact List
|
|
222
|
+
|
|
223
|
+
```
|
|
224
|
+
| Role | Contact | When to Notify |
|
|
225
|
+
|---|---|---|
|
|
226
|
+
| CloudStream Security Lead | security@cloudstreamsoftware.com | All incidents |
|
|
227
|
+
| Client IT Contact | [per client] | High+ incidents |
|
|
228
|
+
| Zoho Security | security@zohocorp.com | If Zoho platform involved |
|
|
229
|
+
| Acquiring Bank | [per client's bank] | Confirmed breaches only |
|
|
230
|
+
| PCI Forensic Investigator | [retain on standby] | Confirmed breaches only |
|
|
231
|
+
| Legal Counsel | [per client] | High+ incidents |
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## Compliance Evidence Collection
|
|
237
|
+
|
|
238
|
+
### Annual Evidence Package
|
|
239
|
+
|
|
240
|
+
Collect and maintain these artifacts for each client annually:
|
|
241
|
+
|
|
242
|
+
| Evidence | Source | Format |
|
|
243
|
+
|---|---|---|
|
|
244
|
+
| Completed SAQ-A form | PCI SSC template | PDF (signed) |
|
|
245
|
+
| Attestation of Compliance | Generated from SAQ-A | PDF (signed) |
|
|
246
|
+
| Provider AoC (Zoho) | Request from Zoho | PDF |
|
|
247
|
+
| Provider AoC (Stripe, if used) | Stripe Dashboard | PDF |
|
|
248
|
+
| Payment data flow diagram | CloudStream documentation | PDF/PNG |
|
|
249
|
+
| Security policy | Client compliance folder | PDF |
|
|
250
|
+
| Incident response plan | Client compliance folder | PDF |
|
|
251
|
+
| Access review evidence | Quarterly review logs | PDF/CSV |
|
|
252
|
+
| Change management records | Creator Change_Requests form | CSV export |
|
|
253
|
+
| Webhook security config | Catalyst function config | Screenshot |
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## ASV Scan Scheduling
|
|
258
|
+
|
|
259
|
+
If quarterly scans are required:
|
|
260
|
+
|
|
261
|
+
| Quarter | Scan Window | Results Due | Remediation Due |
|
|
262
|
+
|---|---|---|---|
|
|
263
|
+
| Q1 | Jan 1-31 | Feb 15 | Mar 1 |
|
|
264
|
+
| Q2 | Apr 1-30 | May 15 | Jun 1 |
|
|
265
|
+
| Q3 | Jul 1-31 | Aug 15 | Sep 1 |
|
|
266
|
+
| Q4 | Oct 1-31 | Nov 15 | Dec 1 |
|
|
267
|
+
|
|
268
|
+
### Scan Failure Response
|
|
269
|
+
|
|
270
|
+
1. Review scan findings (categorized by CVSS score)
|
|
271
|
+
2. CVSS 4.0+ (Medium+): Must remediate for passing scan
|
|
272
|
+
3. Rescan after remediation
|
|
273
|
+
4. Document all findings and remediation in compliance folder
|
|
274
|
+
5. Maintain scan history for 12+ months
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## Maintaining Compliance Year-Round
|
|
279
|
+
|
|
280
|
+
### Monthly PCI Maintenance Tasks
|
|
281
|
+
|
|
282
|
+
- [ ] Review payment processing logs for anomalies
|
|
283
|
+
- [ ] Verify hosted payment page is functioning correctly
|
|
284
|
+
- [ ] Check webhook endpoint health and response times
|
|
285
|
+
- [ ] Review any new Creator forms/fields for accidental card data fields
|
|
286
|
+
- [ ] Verify MFA is enforced for all users with payment system access
|
|
287
|
+
- [ ] Review and disable unnecessary user accounts
|
|
288
|
+
|
|
289
|
+
### Quarterly PCI Maintenance Tasks
|
|
290
|
+
|
|
291
|
+
- [ ] Conduct access review for payment-related forms
|
|
292
|
+
- [ ] Review change log for payment flow modifications
|
|
293
|
+
- [ ] Verify payment provider's compliance status (check for breach announcements)
|
|
294
|
+
- [ ] Run ASV scan (if applicable)
|
|
295
|
+
- [ ] Review and update incident response plan contacts
|
|
296
|
+
|
|
297
|
+
### Annual PCI Maintenance Tasks
|
|
298
|
+
|
|
299
|
+
- [ ] Complete SAQ-A self-assessment
|
|
300
|
+
- [ ] Obtain updated AoC from payment providers
|
|
301
|
+
- [ ] Review and update security policies
|
|
302
|
+
- [ ] Conduct payment flow penetration test (recommended)
|
|
303
|
+
- [ ] Update data flow diagram if architecture changed
|
|
304
|
+
- [ ] Submit attestation to acquiring bank
|
|
305
|
+
- [ ] Archive previous year's compliance evidence
|
|
306
|
+
|
|
307
|
+
> **WARNING**: PCI compliance is continuous, not a once-per-year event. A compliance gap discovered mid-year can result in fines from the acquiring bank and potential loss of payment processing privileges.
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
# PCI-DSS Tokenization Patterns
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
PCI-DSS compliance requires that cardholder data is protected throughout its lifecycle. The primary strategy for Zoho-based implementations is **scope reduction via tokenization** -- never handling raw card data directly. Zoho Payments provides tokenization through hosted payment pages, ensuring that card numbers never touch CloudStream or client infrastructure.
|
|
6
|
+
|
|
7
|
+
> **WARNING**: If raw card data (full PAN, CVV, or magnetic stripe data) ever touches your Zoho Creator application, your client is in PCI-DSS scope for the full 300+ requirement set. Hosted pages reduce this to SAQ-A (22 requirements). This is non-negotiable.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Zoho Payments API for Tokenization
|
|
12
|
+
|
|
13
|
+
### How Tokenization Works
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
Customer Browser
|
|
17
|
+
|
|
|
18
|
+
| (1) Redirect to Zoho Checkout hosted page
|
|
19
|
+
v
|
|
20
|
+
Zoho Hosted Payment Page (Zoho's PCI-certified environment)
|
|
21
|
+
|
|
|
22
|
+
| (2) Customer enters card details (NEVER touches your systems)
|
|
23
|
+
v
|
|
24
|
+
Zoho Payment Gateway
|
|
25
|
+
|
|
|
26
|
+
| (3) Card tokenized, token returned
|
|
27
|
+
v
|
|
28
|
+
Zoho Creator (receives TOKEN only, never raw card data)
|
|
29
|
+
|
|
|
30
|
+
| (4) Store token for future charges
|
|
31
|
+
v
|
|
32
|
+
Your Application (token-based operations only)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Key Principle
|
|
36
|
+
|
|
37
|
+
**Your code, your servers, your Creator forms NEVER see raw card numbers.** You only ever interact with tokens that represent the card.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Hosted Payment Pages (Zoho Checkout)
|
|
42
|
+
|
|
43
|
+
### Implementation Pattern
|
|
44
|
+
|
|
45
|
+
```deluge
|
|
46
|
+
// ============================================================
|
|
47
|
+
// FUNCTION: createPaymentSession
|
|
48
|
+
// PURPOSE: Generate a hosted payment page URL for the customer
|
|
49
|
+
// CONTEXT: Called when customer is ready to pay
|
|
50
|
+
// ============================================================
|
|
51
|
+
|
|
52
|
+
Map createPaymentSession(int invoiceId, Decimal amount, String customerEmail)
|
|
53
|
+
{
|
|
54
|
+
invoice = zoho.creator.getRecordById("app", "Invoices", invoiceId);
|
|
55
|
+
|
|
56
|
+
// Create payment session via Zoho Payments API
|
|
57
|
+
paymentData = Map();
|
|
58
|
+
paymentData.put("amount", amount * 100); // Amount in cents
|
|
59
|
+
paymentData.put("currency", "USD");
|
|
60
|
+
paymentData.put("customer_email", customerEmail);
|
|
61
|
+
paymentData.put("description", "Invoice #" + invoice.get("Invoice_Number"));
|
|
62
|
+
paymentData.put("reference_id", invoiceId.toString());
|
|
63
|
+
paymentData.put("success_url", "https://client-app.zohocreatorportal.com/payment-success");
|
|
64
|
+
paymentData.put("cancel_url", "https://client-app.zohocreatorportal.com/payment-cancelled");
|
|
65
|
+
|
|
66
|
+
// For recurring: request tokenization consent
|
|
67
|
+
paymentData.put("payment_mode", "tokenize"); // Stores card as token
|
|
68
|
+
|
|
69
|
+
response = invokeurl [
|
|
70
|
+
url: "https://payments.zoho.com/api/v1/sessions"
|
|
71
|
+
type: POST
|
|
72
|
+
body: paymentData.toString()
|
|
73
|
+
connection: "zoho_payments_connection"
|
|
74
|
+
];
|
|
75
|
+
|
|
76
|
+
return {
|
|
77
|
+
"session_id": response.get("session_id"),
|
|
78
|
+
"checkout_url": response.get("checkout_url"),
|
|
79
|
+
"expires_at": response.get("expires_at")
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Hosted Page Configuration
|
|
85
|
+
|
|
86
|
+
| Setting | Value | Rationale |
|
|
87
|
+
|---|---|---|
|
|
88
|
+
| Payment methods | Cards, ACH (as needed) | Limit to required methods |
|
|
89
|
+
| Card storage consent | Required for recurring | Customer must opt-in |
|
|
90
|
+
| 3D Secure | Enabled | Reduces fraud, may reduce scope |
|
|
91
|
+
| Address collection | Based on business need | AVS verification |
|
|
92
|
+
| Custom branding | Client logo + colors | Professional appearance |
|
|
93
|
+
| Redirect URLs | Client portal pages | Return to application |
|
|
94
|
+
| Webhook URL | Catalyst function endpoint | Process payment events |
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## What You CAN and CANNOT Store
|
|
99
|
+
|
|
100
|
+
> **WARNING**: Storing prohibited data elements -- even accidentally, even in logs -- puts you in full PCI-DSS scope. Review every form field, every log entry, every error message.
|
|
101
|
+
|
|
102
|
+
### Prohibited (NEVER Store)
|
|
103
|
+
|
|
104
|
+
| Data Element | Also Known As | Why Prohibited |
|
|
105
|
+
|---|---|---|
|
|
106
|
+
| Full PAN | Card number (all 16 digits) | PCI-DSS Requirement 3.4 |
|
|
107
|
+
| CVV/CVC/CID | Security code (3-4 digits) | PCI-DSS Requirement 3.2.2 |
|
|
108
|
+
| Magnetic stripe data | Track 1 / Track 2 | PCI-DSS Requirement 3.2.1 |
|
|
109
|
+
| PIN / PIN block | Personal Identification Number | PCI-DSS Requirement 3.2.3 |
|
|
110
|
+
|
|
111
|
+
### Permitted (Safe to Store)
|
|
112
|
+
|
|
113
|
+
| Data Element | Example | Storage Guidelines |
|
|
114
|
+
|---|---|---|
|
|
115
|
+
| Token | `tok_abc123xyz789` | Primary identifier for future charges |
|
|
116
|
+
| Last 4 digits | `****4242` | Display purposes, customer identification |
|
|
117
|
+
| Expiry month/year | `12/2027` | Proactive card expiry notifications |
|
|
118
|
+
| Cardholder name | `John Smith` | Reference (but treat as PII) |
|
|
119
|
+
| Card brand | `Visa`, `Mastercard` | Display and routing |
|
|
120
|
+
| Payment status | `succeeded`, `failed` | Transaction tracking |
|
|
121
|
+
| Transaction ID | `txn_xyz789` | Reference for refunds/disputes |
|
|
122
|
+
|
|
123
|
+
### Creator Form: Payment_Tokens
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
Form: Payment_Tokens
|
|
127
|
+
Fields:
|
|
128
|
+
- Token_ID (Auto-number)
|
|
129
|
+
- Customer_ID (Lookup to Customers)
|
|
130
|
+
- Payment_Token (Single Line - the token from Zoho Payments)
|
|
131
|
+
- Card_Last_Four (Single Line - 4 characters max)
|
|
132
|
+
- Card_Brand (Picklist: Visa/Mastercard/Amex/Discover)
|
|
133
|
+
- Expiry_Month (Number - 1-12)
|
|
134
|
+
- Expiry_Year (Number - 2024-2040)
|
|
135
|
+
- Cardholder_Name (Single Line)
|
|
136
|
+
- Is_Default (Checkbox)
|
|
137
|
+
- Token_Created_Date (DateTime)
|
|
138
|
+
- Token_Status (Picklist: Active/Expired/Revoked)
|
|
139
|
+
- Last_Used_Date (DateTime)
|
|
140
|
+
- Customer_Consent_Date (DateTime)
|
|
141
|
+
- Consent_Method (Picklist: Checkout Page/API/In-Person)
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
> **WARNING**: NEVER add fields like "Card_Number" or "CVV" to ANY form. Even creating the field without populating it suggests a misunderstanding of PCI scope and will concern auditors.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Recurring Charge Patterns Using Tokens
|
|
149
|
+
|
|
150
|
+
### Subscription Billing
|
|
151
|
+
|
|
152
|
+
```deluge
|
|
153
|
+
// ============================================================
|
|
154
|
+
// FUNCTION: processRecurringCharge
|
|
155
|
+
// PURPOSE: Charge a stored token for subscription renewal
|
|
156
|
+
// CONTEXT: Called by scheduled workflow on billing date
|
|
157
|
+
// ============================================================
|
|
158
|
+
|
|
159
|
+
Map processRecurringCharge(int subscriptionId)
|
|
160
|
+
{
|
|
161
|
+
startTime = zoho.currenttime;
|
|
162
|
+
subscription = zoho.creator.getRecordById("app", "Subscriptions", subscriptionId);
|
|
163
|
+
token = zoho.creator.getRecordById("app", "Payment_Tokens", subscription.get("Payment_Token_ID"));
|
|
164
|
+
|
|
165
|
+
// Verify token is still active
|
|
166
|
+
if (token.get("Token_Status") != "Active") {
|
|
167
|
+
// Notify customer of expired payment method
|
|
168
|
+
notifyExpiredCard(subscription);
|
|
169
|
+
return {"status": "failed", "reason": "token_inactive"};
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Check expiry date
|
|
173
|
+
if (isCardExpired(token)) {
|
|
174
|
+
zoho.creator.updateRecord("app", "Payment_Tokens", token.get("ID"), {"Token_Status": "Expired"});
|
|
175
|
+
notifyExpiredCard(subscription);
|
|
176
|
+
return {"status": "failed", "reason": "card_expired"};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Process charge via Zoho Payments
|
|
180
|
+
chargeData = Map();
|
|
181
|
+
chargeData.put("amount", subscription.get("Amount") * 100);
|
|
182
|
+
chargeData.put("currency", "USD");
|
|
183
|
+
chargeData.put("token", token.get("Payment_Token"));
|
|
184
|
+
chargeData.put("description", "Subscription renewal - " + subscription.get("Plan_Name"));
|
|
185
|
+
chargeData.put("reference_id", subscriptionId.toString());
|
|
186
|
+
|
|
187
|
+
response = invokeurl [
|
|
188
|
+
url: "https://payments.zoho.com/api/v1/charges"
|
|
189
|
+
type: POST
|
|
190
|
+
body: chargeData.toString()
|
|
191
|
+
connection: "zoho_payments_connection"
|
|
192
|
+
];
|
|
193
|
+
|
|
194
|
+
if (response.get("status") == "succeeded") {
|
|
195
|
+
// Record successful payment
|
|
196
|
+
insert into Payment_History [
|
|
197
|
+
Subscription_ID = subscriptionId,
|
|
198
|
+
Amount = subscription.get("Amount"),
|
|
199
|
+
Transaction_ID = response.get("transaction_id"),
|
|
200
|
+
Status = "Succeeded",
|
|
201
|
+
Payment_Date = zoho.currentdate,
|
|
202
|
+
Token_Last_Four = token.get("Card_Last_Four")
|
|
203
|
+
];
|
|
204
|
+
|
|
205
|
+
return {"status": "succeeded", "transaction_id": response.get("transaction_id")};
|
|
206
|
+
} else {
|
|
207
|
+
// Handle decline
|
|
208
|
+
handlePaymentDecline(subscription, response);
|
|
209
|
+
return {"status": "failed", "reason": response.get("failure_reason")};
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Retry Logic for Failed Recurring Charges
|
|
215
|
+
|
|
216
|
+
| Attempt | Timing | Action on Failure |
|
|
217
|
+
|---|---|---|
|
|
218
|
+
| 1st attempt | Billing date | Retry in 3 days |
|
|
219
|
+
| 2nd attempt | Billing + 3 days | Retry in 5 days, email customer |
|
|
220
|
+
| 3rd attempt | Billing + 8 days | Retry in 5 days, email + SMS |
|
|
221
|
+
| 4th attempt | Billing + 13 days | Final notice, suspend service in 2 days |
|
|
222
|
+
| Final | Billing + 15 days | Suspend service, require manual payment |
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Refund Processing
|
|
227
|
+
|
|
228
|
+
```deluge
|
|
229
|
+
// ============================================================
|
|
230
|
+
// FUNCTION: processRefund
|
|
231
|
+
// PURPOSE: Issue a refund against a previous charge
|
|
232
|
+
// CONTEXT: Called from admin action on Payment_History form
|
|
233
|
+
// ============================================================
|
|
234
|
+
|
|
235
|
+
Map processRefund(int paymentId, Decimal refundAmount, String reason)
|
|
236
|
+
{
|
|
237
|
+
payment = zoho.creator.getRecordById("app", "Payment_History", paymentId);
|
|
238
|
+
|
|
239
|
+
// Validate refund amount
|
|
240
|
+
if (refundAmount > payment.get("Amount")) {
|
|
241
|
+
return {"status": "error", "message": "Refund amount exceeds original charge"};
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
refundData = Map();
|
|
245
|
+
refundData.put("transaction_id", payment.get("Transaction_ID"));
|
|
246
|
+
refundData.put("amount", refundAmount * 100); // Cents
|
|
247
|
+
refundData.put("reason", reason);
|
|
248
|
+
|
|
249
|
+
response = invokeurl [
|
|
250
|
+
url: "https://payments.zoho.com/api/v1/refunds"
|
|
251
|
+
type: POST
|
|
252
|
+
body: refundData.toString()
|
|
253
|
+
connection: "zoho_payments_connection"
|
|
254
|
+
];
|
|
255
|
+
|
|
256
|
+
if (response.get("status") == "succeeded") {
|
|
257
|
+
insert into Payment_History [
|
|
258
|
+
Subscription_ID = payment.get("Subscription_ID"),
|
|
259
|
+
Amount = refundAmount * -1, // Negative for refund
|
|
260
|
+
Transaction_ID = response.get("refund_id"),
|
|
261
|
+
Status = "Refunded",
|
|
262
|
+
Payment_Date = zoho.currentdate,
|
|
263
|
+
Refund_Reason = reason,
|
|
264
|
+
Original_Payment_ID = paymentId
|
|
265
|
+
];
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
return response;
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
## Payment Status Webhooks
|
|
275
|
+
|
|
276
|
+
### Webhook Handler (Catalyst Function)
|
|
277
|
+
|
|
278
|
+
```javascript
|
|
279
|
+
// File: functions/payment_webhook/index.js
|
|
280
|
+
// Receives webhook events from Zoho Payments
|
|
281
|
+
|
|
282
|
+
module.exports = async (req, res, context) => {
|
|
283
|
+
const event = req.body;
|
|
284
|
+
|
|
285
|
+
// Verify webhook signature (CRITICAL for security)
|
|
286
|
+
if (!verifyWebhookSignature(req.headers['x-zoho-signature'], req.body)) {
|
|
287
|
+
console.error('Invalid webhook signature');
|
|
288
|
+
return res.status(401).send('Unauthorized');
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
switch (event.event_type) {
|
|
292
|
+
case 'payment.succeeded':
|
|
293
|
+
await handlePaymentSuccess(event.data);
|
|
294
|
+
break;
|
|
295
|
+
case 'payment.failed':
|
|
296
|
+
await handlePaymentFailure(event.data);
|
|
297
|
+
break;
|
|
298
|
+
case 'refund.succeeded':
|
|
299
|
+
await handleRefundSuccess(event.data);
|
|
300
|
+
break;
|
|
301
|
+
case 'token.expired':
|
|
302
|
+
await handleTokenExpired(event.data);
|
|
303
|
+
break;
|
|
304
|
+
case 'dispute.created':
|
|
305
|
+
await handleDisputeCreated(event.data);
|
|
306
|
+
break;
|
|
307
|
+
default:
|
|
308
|
+
console.log(`Unhandled event type: ${event.event_type}`);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
res.status(200).send('OK');
|
|
312
|
+
};
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### Webhook Events to Handle
|
|
316
|
+
|
|
317
|
+
| Event | Action | Priority |
|
|
318
|
+
|---|---|---|
|
|
319
|
+
| `payment.succeeded` | Update invoice status, send receipt | Critical |
|
|
320
|
+
| `payment.failed` | Log failure, notify customer | Critical |
|
|
321
|
+
| `refund.succeeded` | Update payment record, notify customer | High |
|
|
322
|
+
| `token.expired` | Mark token inactive, notify customer | High |
|
|
323
|
+
| `dispute.created` | Alert admin, freeze account if needed | Critical |
|
|
324
|
+
| `payout.completed` | Update settlement records | Medium |
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## PCI Scope Reduction via Hosted Pages
|
|
329
|
+
|
|
330
|
+
### Scope Comparison
|
|
331
|
+
|
|
332
|
+
| Approach | PCI Scope | Requirements | Audit Effort |
|
|
333
|
+
|---|---|---|---|
|
|
334
|
+
| **Hosted pages (Zoho Checkout)** | SAQ-A (minimal) | 22 requirements | Self-assessment |
|
|
335
|
+
| Direct card input (your forms) | SAQ-D (full) | 300+ requirements | On-site audit |
|
|
336
|
+
| JavaScript tokenization (your page) | SAQ-A-EP | ~140 requirements | Moderate audit |
|
|
337
|
+
| API direct card processing | SAQ-D (full) | 300+ requirements | On-site audit |
|
|
338
|
+
|
|
339
|
+
> **WARNING**: The ONLY approach CloudStream should implement is hosted pages (SAQ-A). Any other approach dramatically increases compliance burden and liability.
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## Zoho Payments vs. Stripe for the Zoho Ecosystem
|
|
344
|
+
|
|
345
|
+
| Feature | Zoho Payments | Stripe |
|
|
346
|
+
|---|---|---|
|
|
347
|
+
| Native Zoho integration | YES - first-party | Requires custom integration |
|
|
348
|
+
| Hosted checkout pages | YES (Zoho Checkout) | YES (Stripe Checkout) |
|
|
349
|
+
| Tokenization | YES | YES |
|
|
350
|
+
| Recurring billing | YES (Zoho Subscriptions) | YES (Stripe Billing) |
|
|
351
|
+
| SAQ-A eligible | YES (hosted pages) | YES (hosted pages) |
|
|
352
|
+
| US availability | YES | YES |
|
|
353
|
+
| International | Limited markets | 195+ countries |
|
|
354
|
+
| Pricing | 2.9% + $0.30 (US cards) | 2.9% + $0.30 (US cards) |
|
|
355
|
+
| Zoho Books sync | Native | Requires Zoho Flow/custom |
|
|
356
|
+
| PCI compliance docs | Available on request | Self-service in dashboard |
|
|
357
|
+
| Creator integration | Direct API connection | Custom API integration |
|
|
358
|
+
|
|
359
|
+
### Recommendation
|
|
360
|
+
|
|
361
|
+
- **Use Zoho Payments when**: Client is fully in the Zoho ecosystem, US-focused, wants native Books/Invoice integration
|
|
362
|
+
- **Use Stripe when**: International transactions needed, advanced fraud detection required, or client has existing Stripe infrastructure
|
|
363
|
+
- **Either way**: ALWAYS use hosted pages for SAQ-A scope reduction
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
## Implementation Checklist
|
|
368
|
+
|
|
369
|
+
- [ ] Zoho Payments account configured for client
|
|
370
|
+
- [ ] Hosted payment page designed with client branding
|
|
371
|
+
- [ ] Success/cancel redirect URLs configured
|
|
372
|
+
- [ ] Webhook endpoint deployed (Catalyst function)
|
|
373
|
+
- [ ] Webhook signature verification implemented
|
|
374
|
+
- [ ] Payment_Tokens form created (NO prohibited fields)
|
|
375
|
+
- [ ] Payment_History form created
|
|
376
|
+
- [ ] Recurring charge workflow configured (if applicable)
|
|
377
|
+
- [ ] Refund process documented and tested
|
|
378
|
+
- [ ] Token expiry notification workflow active
|
|
379
|
+
- [ ] PCI SAQ-A self-assessment completed
|
|
380
|
+
- [ ] No raw card data in any form, log, or error message
|
|
381
|
+
- [ ] Payment flows tested end-to-end in sandbox
|
|
382
|
+
- [ ] Client trained on payment dashboard access
|