@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.
Files changed (189) hide show
  1. package/README.md +152 -37
  2. package/agents/INDEX.md +183 -0
  3. package/agents/architect.md +247 -0
  4. package/agents/build-error-resolver.md +555 -0
  5. package/agents/catalyst-deployer.md +132 -0
  6. package/agents/code-reviewer.md +121 -0
  7. package/agents/compliance-auditor.md +148 -0
  8. package/agents/creator-architect.md +395 -0
  9. package/agents/deluge-reviewer.md +98 -0
  10. package/agents/doc-updater.md +471 -0
  11. package/agents/e2e-runner.md +711 -0
  12. package/agents/planner.md +122 -0
  13. package/agents/refactor-cleaner.md +309 -0
  14. package/agents/security-reviewer.md +582 -0
  15. package/agents/tdd-guide.md +302 -0
  16. package/config/versions.json +63 -0
  17. package/dist/hooks/hooks.json +209 -0
  18. package/dist/index.js +47 -0
  19. package/dist/lib/asset-value.js +609 -0
  20. package/dist/lib/client-manager.js +300 -0
  21. package/dist/lib/command-matcher.js +242 -0
  22. package/dist/lib/cross-session-patterns.js +754 -0
  23. package/dist/lib/intent-classifier.js +1075 -0
  24. package/dist/lib/package-manager.js +374 -0
  25. package/dist/lib/recommendation-engine.js +597 -0
  26. package/dist/lib/session-memory.js +489 -0
  27. package/dist/lib/skill-effectiveness.js +486 -0
  28. package/dist/lib/skill-matcher.js +595 -0
  29. package/dist/lib/tutorial-metrics.js +242 -0
  30. package/dist/lib/tutorial-progress.js +209 -0
  31. package/dist/lib/tutorial-renderer.js +431 -0
  32. package/dist/lib/utils.js +380 -0
  33. package/dist/lib/verify-formatter.js +143 -0
  34. package/dist/lib/workflow-state.js +249 -0
  35. package/hooks/hooks.json +209 -0
  36. package/package.json +5 -1
  37. package/scripts/aggregate-sessions.js +290 -0
  38. package/scripts/branch-name-validator.js +291 -0
  39. package/scripts/build.js +101 -0
  40. package/scripts/commands/client-switch.js +231 -0
  41. package/scripts/deprecate-skill.js +610 -0
  42. package/scripts/diagnose.js +324 -0
  43. package/scripts/doc-freshness.js +168 -0
  44. package/scripts/generate-weekly-digest.js +393 -0
  45. package/scripts/health-check.js +270 -0
  46. package/scripts/hooks/credential-check.js +101 -0
  47. package/scripts/hooks/evaluate-session.js +81 -0
  48. package/scripts/hooks/pre-compact.js +66 -0
  49. package/scripts/hooks/prompt-analyzer.js +276 -0
  50. package/scripts/hooks/prompt-router.js +422 -0
  51. package/scripts/hooks/quality-gate-enforcer.js +371 -0
  52. package/scripts/hooks/session-end.js +156 -0
  53. package/scripts/hooks/session-start.js +195 -0
  54. package/scripts/hooks/skill-injector.js +333 -0
  55. package/scripts/hooks/suggest-compact.js +58 -0
  56. package/scripts/lib/asset-value.js +609 -0
  57. package/scripts/lib/client-manager.js +300 -0
  58. package/scripts/lib/command-matcher.js +242 -0
  59. package/scripts/lib/cross-session-patterns.js +754 -0
  60. package/scripts/lib/intent-classifier.js +1075 -0
  61. package/scripts/lib/package-manager.js +374 -0
  62. package/scripts/lib/recommendation-engine.js +597 -0
  63. package/scripts/lib/session-memory.js +489 -0
  64. package/scripts/lib/skill-effectiveness.js +486 -0
  65. package/scripts/lib/skill-matcher.js +595 -0
  66. package/scripts/lib/tutorial-metrics.js +242 -0
  67. package/scripts/lib/tutorial-progress.js +209 -0
  68. package/scripts/lib/tutorial-renderer.js +431 -0
  69. package/scripts/lib/utils.js +380 -0
  70. package/scripts/lib/verify-formatter.js +143 -0
  71. package/scripts/lib/workflow-state.js +249 -0
  72. package/scripts/onboard.js +363 -0
  73. package/scripts/quarterly-report.js +692 -0
  74. package/scripts/setup-package-manager.js +204 -0
  75. package/scripts/sync-upstream.js +391 -0
  76. package/scripts/test.js +108 -0
  77. package/scripts/tutorial-runner.js +351 -0
  78. package/scripts/validate-all.js +201 -0
  79. package/scripts/verifiers/agents.js +245 -0
  80. package/scripts/verifiers/config.js +186 -0
  81. package/scripts/verifiers/environment.js +123 -0
  82. package/scripts/verifiers/hooks.js +188 -0
  83. package/scripts/verifiers/index.js +38 -0
  84. package/scripts/verifiers/persistence.js +140 -0
  85. package/scripts/verifiers/plugin.js +215 -0
  86. package/scripts/verifiers/skills.js +209 -0
  87. package/scripts/verify-setup.js +164 -0
  88. package/skills/INDEX.md +157 -0
  89. package/skills/backend-patterns/SKILL.md +586 -0
  90. package/skills/backend-patterns/catalyst-patterns.md +128 -0
  91. package/skills/bigquery-patterns/SKILL.md +27 -0
  92. package/skills/bigquery-patterns/performance-optimization.md +518 -0
  93. package/skills/bigquery-patterns/query-patterns.md +372 -0
  94. package/skills/bigquery-patterns/schema-design.md +78 -0
  95. package/skills/cloudstream-project-template/SKILL.md +20 -0
  96. package/skills/cloudstream-project-template/structure.md +65 -0
  97. package/skills/coding-standards/SKILL.md +524 -0
  98. package/skills/coding-standards/deluge-standards.md +83 -0
  99. package/skills/compliance-patterns/SKILL.md +28 -0
  100. package/skills/compliance-patterns/hipaa/audit-requirements.md +251 -0
  101. package/skills/compliance-patterns/hipaa/baa-process.md +298 -0
  102. package/skills/compliance-patterns/hipaa/data-archival-strategy.md +387 -0
  103. package/skills/compliance-patterns/hipaa/phi-handling.md +52 -0
  104. package/skills/compliance-patterns/pci-dss/saq-a-requirements.md +307 -0
  105. package/skills/compliance-patterns/pci-dss/tokenization-patterns.md +382 -0
  106. package/skills/compliance-patterns/pci-dss/zoho-checkout-patterns.md +56 -0
  107. package/skills/compliance-patterns/soc2/access-controls.md +344 -0
  108. package/skills/compliance-patterns/soc2/audit-logging.md +458 -0
  109. package/skills/compliance-patterns/soc2/change-management.md +403 -0
  110. package/skills/compliance-patterns/soc2/deluge-execution-logging.md +407 -0
  111. package/skills/consultancy-workflows/SKILL.md +19 -0
  112. package/skills/consultancy-workflows/client-isolation.md +21 -0
  113. package/skills/consultancy-workflows/documentation-automation.md +454 -0
  114. package/skills/consultancy-workflows/handoff-procedures.md +257 -0
  115. package/skills/consultancy-workflows/knowledge-capture.md +513 -0
  116. package/skills/consultancy-workflows/time-tracking.md +26 -0
  117. package/skills/continuous-learning/SKILL.md +84 -0
  118. package/skills/continuous-learning/config.json +18 -0
  119. package/skills/continuous-learning/evaluate-session.sh +60 -0
  120. package/skills/continuous-learning-v2/SKILL.md +126 -0
  121. package/skills/continuous-learning-v2/config.json +61 -0
  122. package/skills/frontend-patterns/SKILL.md +635 -0
  123. package/skills/frontend-patterns/zoho-widget-patterns.md +103 -0
  124. package/skills/gcp-data-engineering/SKILL.md +36 -0
  125. package/skills/gcp-data-engineering/bigquery/performance-optimization.md +337 -0
  126. package/skills/gcp-data-engineering/dataflow/error-handling.md +496 -0
  127. package/skills/gcp-data-engineering/dataflow/pipeline-patterns.md +444 -0
  128. package/skills/gcp-data-engineering/dbt/model-organization.md +63 -0
  129. package/skills/gcp-data-engineering/dbt/testing-patterns.md +503 -0
  130. package/skills/gcp-data-engineering/medallion-architecture/bronze-layer.md +60 -0
  131. package/skills/gcp-data-engineering/medallion-architecture/gold-layer.md +311 -0
  132. package/skills/gcp-data-engineering/medallion-architecture/layer-transitions.md +517 -0
  133. package/skills/gcp-data-engineering/medallion-architecture/silver-layer.md +305 -0
  134. package/skills/gcp-data-engineering/zoho-to-gcp/data-extraction.md +543 -0
  135. package/skills/gcp-data-engineering/zoho-to-gcp/real-time-vs-batch.md +337 -0
  136. package/skills/security-review/SKILL.md +498 -0
  137. package/skills/security-review/compliance-checklist.md +53 -0
  138. package/skills/strategic-compact/SKILL.md +67 -0
  139. package/skills/tdd-workflow/SKILL.md +413 -0
  140. package/skills/tdd-workflow/zoho-testing.md +124 -0
  141. package/skills/tutorial/SKILL.md +249 -0
  142. package/skills/tutorial/docs/ACCESSIBILITY.md +169 -0
  143. package/skills/tutorial/lessons/00-philosophy-and-workflow.md +198 -0
  144. package/skills/tutorial/lessons/01-basics.md +81 -0
  145. package/skills/tutorial/lessons/02-training.md +86 -0
  146. package/skills/tutorial/lessons/03-commands.md +109 -0
  147. package/skills/tutorial/lessons/04-workflows.md +115 -0
  148. package/skills/tutorial/lessons/05-compliance.md +116 -0
  149. package/skills/tutorial/lessons/06-zoho.md +121 -0
  150. package/skills/tutorial/lessons/07-hooks-system.md +277 -0
  151. package/skills/tutorial/lessons/08-mcp-servers.md +316 -0
  152. package/skills/tutorial/lessons/09-client-management.md +215 -0
  153. package/skills/tutorial/lessons/10-testing-e2e.md +260 -0
  154. package/skills/tutorial/lessons/11-skills-deep-dive.md +272 -0
  155. package/skills/tutorial/lessons/12-rules-system.md +326 -0
  156. package/skills/tutorial/lessons/13-golden-standard-graduation.md +213 -0
  157. package/skills/tutorial/lessons/14-fork-setup-and-sync.md +312 -0
  158. package/skills/tutorial/lessons/15-living-examples-system.md +221 -0
  159. package/skills/tutorial/tracks/accelerated/README.md +134 -0
  160. package/skills/tutorial/tracks/accelerated/assessment/checkpoint-1.md +161 -0
  161. package/skills/tutorial/tracks/accelerated/assessment/checkpoint-2.md +175 -0
  162. package/skills/tutorial/tracks/accelerated/day-1-core-concepts.md +234 -0
  163. package/skills/tutorial/tracks/accelerated/day-2-essential-commands.md +270 -0
  164. package/skills/tutorial/tracks/accelerated/day-3-workflow-mastery.md +305 -0
  165. package/skills/tutorial/tracks/accelerated/day-4-compliance-zoho.md +304 -0
  166. package/skills/tutorial/tracks/accelerated/day-5-hooks-skills.md +344 -0
  167. package/skills/tutorial/tracks/accelerated/day-6-client-testing.md +386 -0
  168. package/skills/tutorial/tracks/accelerated/day-7-graduation.md +369 -0
  169. package/skills/zoho-patterns/CHANGELOG.md +108 -0
  170. package/skills/zoho-patterns/SKILL.md +446 -0
  171. package/skills/zoho-patterns/analytics/dashboard-patterns.md +352 -0
  172. package/skills/zoho-patterns/analytics/zoho-to-bigquery-pipeline.md +427 -0
  173. package/skills/zoho-patterns/catalyst/appsail-deployment.md +349 -0
  174. package/skills/zoho-patterns/catalyst/context-close-patterns.md +354 -0
  175. package/skills/zoho-patterns/catalyst/cron-batch-processing.md +374 -0
  176. package/skills/zoho-patterns/catalyst/function-patterns.md +439 -0
  177. package/skills/zoho-patterns/creator/form-design.md +304 -0
  178. package/skills/zoho-patterns/creator/publish-api-patterns.md +313 -0
  179. package/skills/zoho-patterns/creator/widget-integration.md +306 -0
  180. package/skills/zoho-patterns/creator/workflow-automation.md +253 -0
  181. package/skills/zoho-patterns/deluge/api-patterns.md +468 -0
  182. package/skills/zoho-patterns/deluge/batch-processing.md +403 -0
  183. package/skills/zoho-patterns/deluge/cross-app-integration.md +356 -0
  184. package/skills/zoho-patterns/deluge/error-handling.md +423 -0
  185. package/skills/zoho-patterns/deluge/syntax-reference.md +65 -0
  186. package/skills/zoho-patterns/integration/cors-proxy-architecture.md +426 -0
  187. package/skills/zoho-patterns/integration/crm-books-native-sync.md +277 -0
  188. package/skills/zoho-patterns/integration/oauth-token-management.md +461 -0
  189. 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