@ucptools/validator 1.0.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 (121) hide show
  1. package/CLAUDE.md +109 -0
  2. package/CONTRIBUTING.md +113 -0
  3. package/LICENSE +21 -0
  4. package/README.md +203 -0
  5. package/api/analyze-feed.js +140 -0
  6. package/api/badge.js +185 -0
  7. package/api/benchmark.js +177 -0
  8. package/api/directory-stats.ts +29 -0
  9. package/api/directory.ts +73 -0
  10. package/api/generate-compliance.js +143 -0
  11. package/api/generate-schema.js +457 -0
  12. package/api/generate.js +132 -0
  13. package/api/security-scan.js +133 -0
  14. package/api/simulate.js +187 -0
  15. package/api/tsconfig.json +10 -0
  16. package/api/validate.js +1351 -0
  17. package/apify-actor/.actor/actor.json +68 -0
  18. package/apify-actor/.actor/input_schema.json +32 -0
  19. package/apify-actor/APIFY-STORE-LISTING.md +412 -0
  20. package/apify-actor/Dockerfile +8 -0
  21. package/apify-actor/README.md +166 -0
  22. package/apify-actor/main.ts +111 -0
  23. package/apify-actor/package.json +17 -0
  24. package/apify-actor/src/main.js +199 -0
  25. package/docs/BRAND-IDENTITY.md +238 -0
  26. package/docs/BRAND-STYLE-GUIDE.md +356 -0
  27. package/drizzle/0000_black_king_cobra.sql +39 -0
  28. package/drizzle/meta/0000_snapshot.json +309 -0
  29. package/drizzle/meta/_journal.json +13 -0
  30. package/drizzle.config.ts +10 -0
  31. package/examples/full-profile.json +70 -0
  32. package/examples/minimal-profile.json +23 -0
  33. package/package.json +69 -0
  34. package/public/.well-known/ucp +25 -0
  35. package/public/android-chrome-192x192.png +0 -0
  36. package/public/android-chrome-512x512.png +0 -0
  37. package/public/apple-touch-icon.png +0 -0
  38. package/public/brand.css +321 -0
  39. package/public/directory.html +701 -0
  40. package/public/favicon-16x16.png +0 -0
  41. package/public/favicon-32x32.png +0 -0
  42. package/public/favicon.ico +0 -0
  43. package/public/guides/bigcommerce.html +743 -0
  44. package/public/guides/fastucp.html +838 -0
  45. package/public/guides/magento.html +779 -0
  46. package/public/guides/shopify.html +726 -0
  47. package/public/guides/squarespace.html +749 -0
  48. package/public/guides/wix.html +747 -0
  49. package/public/guides/woocommerce.html +733 -0
  50. package/public/index.html +3835 -0
  51. package/public/learn.html +396 -0
  52. package/public/logo.jpeg +0 -0
  53. package/public/og-image-icon.png +0 -0
  54. package/public/og-image.png +0 -0
  55. package/public/robots.txt +6 -0
  56. package/public/site.webmanifest +31 -0
  57. package/public/sitemap.xml +69 -0
  58. package/public/social/linkedin-banner-1128x191.png +0 -0
  59. package/public/social/temp.PNG +0 -0
  60. package/public/social/x-header-1500x500.png +0 -0
  61. package/public/verify.html +410 -0
  62. package/scripts/generate-favicons.js +44 -0
  63. package/scripts/generate-ico.js +23 -0
  64. package/scripts/generate-og-image.js +45 -0
  65. package/scripts/reset-db.ts +77 -0
  66. package/scripts/seed-db.ts +71 -0
  67. package/scripts/setup-benchmark-db.js +70 -0
  68. package/src/api/server.ts +266 -0
  69. package/src/cli/index.ts +302 -0
  70. package/src/compliance/compliance-generator.ts +452 -0
  71. package/src/compliance/index.ts +28 -0
  72. package/src/compliance/templates.ts +338 -0
  73. package/src/compliance/types.ts +170 -0
  74. package/src/db/index.ts +28 -0
  75. package/src/db/schema.ts +84 -0
  76. package/src/feed-analyzer/feed-analyzer.ts +726 -0
  77. package/src/feed-analyzer/index.ts +34 -0
  78. package/src/feed-analyzer/types.ts +354 -0
  79. package/src/generator/index.ts +7 -0
  80. package/src/generator/key-generator.ts +124 -0
  81. package/src/generator/profile-builder.ts +402 -0
  82. package/src/hosting/artifacts-generator.ts +679 -0
  83. package/src/hosting/index.ts +6 -0
  84. package/src/index.ts +105 -0
  85. package/src/security/index.ts +15 -0
  86. package/src/security/security-scanner.ts +604 -0
  87. package/src/security/types.ts +55 -0
  88. package/src/services/directory.ts +434 -0
  89. package/src/simulator/agent-simulator.ts +941 -0
  90. package/src/simulator/index.ts +7 -0
  91. package/src/simulator/types.ts +170 -0
  92. package/src/types/generator.ts +140 -0
  93. package/src/types/index.ts +7 -0
  94. package/src/types/ucp-profile.ts +140 -0
  95. package/src/types/validation.ts +89 -0
  96. package/src/validator/index.ts +194 -0
  97. package/src/validator/network-validator.ts +417 -0
  98. package/src/validator/rules-validator.ts +297 -0
  99. package/src/validator/sdk-validator.ts +330 -0
  100. package/src/validator/structural-validator.ts +476 -0
  101. package/tests/fixtures/non-compliant-profile.json +25 -0
  102. package/tests/fixtures/official-sample-profile.json +75 -0
  103. package/tests/integration/benchmark.test.ts +207 -0
  104. package/tests/integration/database.test.ts +163 -0
  105. package/tests/integration/directory-api.test.ts +268 -0
  106. package/tests/integration/simulate-api.test.ts +230 -0
  107. package/tests/integration/validate-api.test.ts +269 -0
  108. package/tests/setup.ts +15 -0
  109. package/tests/unit/agent-simulator.test.ts +575 -0
  110. package/tests/unit/compliance-generator.test.ts +374 -0
  111. package/tests/unit/directory-service.test.ts +272 -0
  112. package/tests/unit/feed-analyzer.test.ts +517 -0
  113. package/tests/unit/lint-suggestions.test.ts +423 -0
  114. package/tests/unit/official-samples.test.ts +211 -0
  115. package/tests/unit/pdf-report.test.ts +390 -0
  116. package/tests/unit/sdk-validator.test.ts +531 -0
  117. package/tests/unit/security-scanner.test.ts +410 -0
  118. package/tests/unit/validation.test.ts +390 -0
  119. package/tsconfig.json +20 -0
  120. package/vercel.json +34 -0
  121. package/vitest.config.ts +22 -0
@@ -0,0 +1,747 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <!-- Google Analytics -->
6
+ <script async src="https://www.googletagmanager.com/gtag/js?id=G-J5JSHV7H1E"></script>
7
+ <script>
8
+ window.dataLayer = window.dataLayer || [];
9
+ function gtag() { dataLayer.push(arguments); }
10
+ gtag('js', new Date());
11
+ gtag('config', 'G-J5JSHV7H1E');
12
+ </script>
13
+ <meta charset="UTF-8">
14
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
15
+ <title>Wix UCP Implementation Guide - AI Commerce Ready | UCP Tools</title>
16
+ <meta name="description"
17
+ content="Step-by-step guide to implementing UCP (Universal Commerce Protocol) on your Wix store. Make your Wix eCommerce site AI-ready for ChatGPT and AI shopping agents.">
18
+ <link rel="canonical" href="https://ucptools.dev/guides/wix">
19
+ <link rel="icon" type="image/x-icon" href="/favicon.ico">
20
+ <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
21
+ <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
22
+ <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
23
+ <link rel="manifest" href="/site.webmanifest">
24
+ <meta name="theme-color" content="#0C6EFC">
25
+ <meta property="og:title" content="Wix UCP Implementation Guide - AI Commerce Ready">
26
+ <meta property="og:description"
27
+ content="Make your Wix eCommerce store AI-ready with UCP. Simple implementation guide.">
28
+ <meta property="og:image" content="/og-image.png">
29
+ <meta property="og:type" content="article">
30
+
31
+ <!-- Google Fonts -->
32
+ <link rel="preconnect" href="https://fonts.googleapis.com">
33
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
34
+ <link
35
+ href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Fira+Code:wght@400;500&display=swap"
36
+ rel="stylesheet">
37
+
38
+ <style>
39
+ :root {
40
+ --brand-blue: #2E86AB;
41
+ --brand-teal: #36B5A2;
42
+ --brand-green: #47C97A;
43
+ --brand-gradient: linear-gradient(135deg, #2E86AB 0%, #36B5A2 50%, #47C97A 100%);
44
+ --platform-color: #0C6EFC;
45
+ --platform-dark: #0052CC;
46
+ --color-dark: #1A2B3C;
47
+ --color-medium: #5A6978;
48
+ --color-light: #94A3B8;
49
+ --color-border: #E2E8F0;
50
+ --color-background: #F8FAFC;
51
+ --color-card: #FFFFFF;
52
+ --color-success: #47C97A;
53
+ --color-warning: #F59E0B;
54
+ --color-error: #EF4444;
55
+ --color-info: #2E86AB;
56
+ }
57
+
58
+ * { box-sizing: border-box; margin: 0; padding: 0; }
59
+
60
+ body {
61
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
62
+ background: var(--color-background);
63
+ color: var(--color-dark);
64
+ line-height: 1.6;
65
+ min-height: 100vh;
66
+ }
67
+
68
+ a { color: var(--brand-blue); text-decoration: none; }
69
+ a:hover { text-decoration: underline; }
70
+
71
+ .container { max-width: 1200px; margin: 0 auto; padding: 0 20px; }
72
+
73
+ header {
74
+ background: var(--color-card);
75
+ border-bottom: 1px solid var(--color-border);
76
+ padding: 16px 0;
77
+ position: sticky;
78
+ top: 0;
79
+ z-index: 1000;
80
+ }
81
+
82
+ .header-inner {
83
+ display: flex;
84
+ justify-content: space-between;
85
+ align-items: center;
86
+ max-width: 1200px;
87
+ margin: 0 auto;
88
+ padding: 0 20px;
89
+ }
90
+
91
+ .logo {
92
+ display: flex;
93
+ align-items: center;
94
+ gap: 12px;
95
+ font-size: 24px;
96
+ font-weight: 700;
97
+ text-decoration: none;
98
+ }
99
+
100
+ .logo:hover { text-decoration: none; }
101
+ .logo-icon { width: 40px; height: 40px; border-radius: 8px; }
102
+
103
+ .logo-text {
104
+ background: var(--brand-gradient);
105
+ -webkit-background-clip: text;
106
+ -webkit-text-fill-color: transparent;
107
+ background-clip: text;
108
+ }
109
+
110
+ .logo-suffix { font-weight: 400; -webkit-text-fill-color: var(--color-medium); }
111
+
112
+ nav { display: flex; gap: 8px; }
113
+
114
+ nav a {
115
+ padding: 8px 16px;
116
+ color: var(--color-medium);
117
+ text-decoration: none;
118
+ font-weight: 500;
119
+ border-radius: 6px;
120
+ transition: all 0.2s;
121
+ }
122
+
123
+ nav a:hover {
124
+ color: var(--brand-blue);
125
+ background: rgba(46, 134, 171, 0.08);
126
+ text-decoration: none;
127
+ }
128
+
129
+ nav a.active {
130
+ color: var(--brand-blue);
131
+ background: rgba(46, 134, 171, 0.12);
132
+ }
133
+
134
+ .guide-hero {
135
+ background: linear-gradient(135deg, #0052CC 0%, #0C6EFC 100%);
136
+ color: white;
137
+ padding: 80px 0;
138
+ }
139
+
140
+ .guide-hero .container { max-width: 800px; }
141
+
142
+ .guide-hero h1 {
143
+ font-size: 2.75rem;
144
+ font-weight: 700;
145
+ margin-bottom: 16px;
146
+ line-height: 1.2;
147
+ }
148
+
149
+ .guide-hero p {
150
+ font-size: 1.25rem;
151
+ opacity: 0.9;
152
+ line-height: 1.6;
153
+ margin-bottom: 24px;
154
+ }
155
+
156
+ .guide-badges { display: flex; gap: 12px; flex-wrap: wrap; }
157
+
158
+ .guide-badge {
159
+ background: rgba(255, 255, 255, 0.15);
160
+ backdrop-filter: blur(10px);
161
+ padding: 8px 16px;
162
+ border-radius: 24px;
163
+ font-size: 0.9rem;
164
+ font-weight: 500;
165
+ border: 1px solid rgba(255, 255, 255, 0.1);
166
+ }
167
+
168
+ .guide-content {
169
+ display: grid;
170
+ grid-template-columns: 1fr 260px;
171
+ gap: 60px;
172
+ max-width: 1100px;
173
+ margin: 0 auto;
174
+ padding: 60px 20px;
175
+ }
176
+
177
+ @media (max-width: 968px) {
178
+ .guide-content { grid-template-columns: 1fr; gap: 40px; }
179
+ .guide-sidebar { order: -1; }
180
+ }
181
+
182
+ @media (max-width: 600px) {
183
+ .guide-hero h1 { font-size: 2rem; }
184
+ .guide-hero p { font-size: 1.1rem; }
185
+ .header-inner { flex-direction: column; gap: 16px; }
186
+ nav { flex-wrap: wrap; justify-content: center; }
187
+ }
188
+
189
+ .guide-main section { margin-bottom: 48px; }
190
+
191
+ .guide-main h2 {
192
+ color: var(--color-dark);
193
+ font-size: 1.75rem;
194
+ font-weight: 700;
195
+ margin-bottom: 20px;
196
+ padding-bottom: 12px;
197
+ border-bottom: 2px solid var(--color-border);
198
+ }
199
+
200
+ .guide-main h3 {
201
+ font-size: 1.25rem;
202
+ font-weight: 600;
203
+ margin: 32px 0 16px;
204
+ color: var(--color-dark);
205
+ }
206
+
207
+ .guide-main p {
208
+ margin-bottom: 16px;
209
+ color: var(--color-medium);
210
+ font-size: 1.05rem;
211
+ line-height: 1.7;
212
+ }
213
+
214
+ .guide-main ul, .guide-main ol { margin-bottom: 20px; padding-left: 24px; }
215
+
216
+ .guide-main li {
217
+ margin-bottom: 10px;
218
+ color: var(--color-medium);
219
+ line-height: 1.6;
220
+ }
221
+
222
+ .guide-main li strong { color: var(--color-dark); }
223
+
224
+ pre {
225
+ background: #1e1e1e;
226
+ color: #d4d4d4;
227
+ padding: 24px;
228
+ border-radius: 12px;
229
+ overflow-x: auto;
230
+ margin: 20px 0;
231
+ font-family: 'Fira Code', 'Monaco', 'Consolas', monospace;
232
+ font-size: 0.9rem;
233
+ line-height: 1.6;
234
+ border: 1px solid #333;
235
+ }
236
+
237
+ code { font-family: 'Fira Code', 'Monaco', 'Consolas', monospace; }
238
+
239
+ :not(pre)>code {
240
+ background: #EEF2F6;
241
+ padding: 3px 8px;
242
+ border-radius: 6px;
243
+ font-size: 0.9em;
244
+ color: var(--platform-dark);
245
+ font-weight: 500;
246
+ }
247
+
248
+ .step-number {
249
+ display: inline-flex;
250
+ align-items: center;
251
+ justify-content: center;
252
+ width: 32px;
253
+ height: 32px;
254
+ background: var(--platform-color);
255
+ color: white;
256
+ border-radius: 50%;
257
+ font-weight: 700;
258
+ font-size: 0.9rem;
259
+ margin-right: 12px;
260
+ }
261
+
262
+ .step-title {
263
+ display: flex;
264
+ align-items: center;
265
+ font-size: 1.25rem;
266
+ font-weight: 600;
267
+ margin: 32px 0 16px;
268
+ color: var(--color-dark);
269
+ }
270
+
271
+ .tip-box {
272
+ background: #EFF6FF;
273
+ border-left: 4px solid var(--brand-blue);
274
+ padding: 20px 24px;
275
+ border-radius: 0 12px 12px 0;
276
+ margin: 24px 0;
277
+ }
278
+
279
+ .tip-box.warning { background: #FEF3C7; border-color: var(--color-warning); }
280
+ .tip-box.success { background: #DCFCE7; border-color: var(--color-success); }
281
+ .tip-box.platform { background: #EEF5FF; border-color: var(--platform-color); }
282
+
283
+ .tip-box strong {
284
+ display: block;
285
+ margin-bottom: 6px;
286
+ color: var(--color-dark);
287
+ font-size: 1rem;
288
+ }
289
+
290
+ .tip-box p, .tip-box { color: var(--color-medium); font-size: 0.95rem; }
291
+
292
+ .cta-box {
293
+ background: var(--brand-gradient);
294
+ color: white;
295
+ padding: 40px;
296
+ border-radius: 16px;
297
+ text-align: center;
298
+ margin: 32px 0;
299
+ box-shadow: 0 8px 32px rgba(46, 134, 171, 0.25);
300
+ }
301
+
302
+ .cta-box h3 { color: white; font-size: 1.5rem; margin-bottom: 12px; }
303
+ .cta-box p { color: rgba(255, 255, 255, 0.9); margin-bottom: 24px; font-size: 1.05rem; }
304
+
305
+ .cta-box .btn {
306
+ background: white;
307
+ color: var(--brand-blue);
308
+ padding: 14px 32px;
309
+ border-radius: 8px;
310
+ text-decoration: none;
311
+ font-weight: 600;
312
+ font-size: 1rem;
313
+ display: inline-block;
314
+ transition: all 0.2s;
315
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
316
+ }
317
+
318
+ .cta-box .btn:hover {
319
+ transform: translateY(-2px);
320
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.2);
321
+ text-decoration: none;
322
+ }
323
+
324
+ table {
325
+ width: 100%;
326
+ border-collapse: collapse;
327
+ margin: 20px 0;
328
+ background: var(--color-card);
329
+ border-radius: 12px;
330
+ overflow: hidden;
331
+ border: 1px solid var(--color-border);
332
+ }
333
+
334
+ th, td {
335
+ text-align: left;
336
+ padding: 16px 20px;
337
+ border-bottom: 1px solid var(--color-border);
338
+ }
339
+
340
+ th { background: var(--color-background); font-weight: 600; color: var(--color-dark); }
341
+ tr:last-child td { border-bottom: none; }
342
+ td code { background: #EEF2F6; padding: 4px 8px; border-radius: 4px; }
343
+
344
+ .guide-sidebar { position: sticky; top: 100px; align-self: start; }
345
+
346
+ .sidebar-toc {
347
+ background: var(--color-card);
348
+ border: 1px solid var(--color-border);
349
+ border-radius: 12px;
350
+ padding: 24px;
351
+ }
352
+
353
+ .sidebar-toc h4 {
354
+ font-size: 0.8rem;
355
+ text-transform: uppercase;
356
+ letter-spacing: 1px;
357
+ color: var(--color-light);
358
+ margin-bottom: 16px;
359
+ font-weight: 600;
360
+ }
361
+
362
+ .sidebar-toc ul { list-style: none; padding: 0; margin: 0; }
363
+ .sidebar-toc li { margin-bottom: 0; }
364
+
365
+ .sidebar-toc a {
366
+ display: block;
367
+ padding: 10px 12px;
368
+ color: var(--color-medium);
369
+ text-decoration: none;
370
+ font-size: 0.9rem;
371
+ border-radius: 6px;
372
+ transition: all 0.2s;
373
+ }
374
+
375
+ .sidebar-toc a:hover {
376
+ color: var(--platform-color);
377
+ background: rgba(12, 110, 252, 0.08);
378
+ text-decoration: none;
379
+ }
380
+
381
+ .other-guides {
382
+ margin-top: 24px;
383
+ padding-top: 24px;
384
+ border-top: 1px solid var(--color-border);
385
+ }
386
+
387
+ .other-guides h4 {
388
+ font-size: 0.8rem;
389
+ text-transform: uppercase;
390
+ letter-spacing: 1px;
391
+ color: var(--color-light);
392
+ margin-bottom: 12px;
393
+ font-weight: 600;
394
+ }
395
+
396
+ .other-guides a {
397
+ display: block;
398
+ padding: 8px 12px;
399
+ color: var(--color-medium);
400
+ font-size: 0.85rem;
401
+ border-radius: 6px;
402
+ transition: all 0.2s;
403
+ }
404
+
405
+ .other-guides a:hover {
406
+ color: var(--brand-blue);
407
+ background: rgba(46, 134, 171, 0.08);
408
+ text-decoration: none;
409
+ }
410
+
411
+ footer {
412
+ background: var(--color-dark);
413
+ color: white;
414
+ padding: 48px 0;
415
+ margin-top: 60px;
416
+ text-align: center;
417
+ }
418
+
419
+ footer p { margin: 0; opacity: 0.9; }
420
+ footer a { color: var(--brand-teal); }
421
+ footer a:hover { color: var(--brand-green); }
422
+ .footer-links { margin-top: 12px; opacity: 0.7; }
423
+ </style>
424
+ </head>
425
+
426
+ <body>
427
+ <header>
428
+ <div class="header-inner">
429
+ <a href="/" class="logo">
430
+ <img src="/logo.jpeg" alt="UCP.tools logo" class="logo-icon">
431
+ <span class="logo-text">UCP<span class="logo-suffix">.tools</span></span>
432
+ </a>
433
+ <nav>
434
+ <a href="/">Validator</a>
435
+ <a href="/learn">Learn</a>
436
+ <a href="/directory">Directory</a>
437
+ <a href="/guides/wix" class="active">Wix</a>
438
+ </nav>
439
+ </div>
440
+ </header>
441
+
442
+ <div class="guide-hero">
443
+ <div class="container">
444
+ <h1>✨ Wix UCP Implementation Guide</h1>
445
+ <p>Make your Wix eCommerce store AI-ready. Enable ChatGPT, Google AI Mode, and AI shopping agents to discover and shop your products.</p>
446
+ <div class="guide-badges">
447
+ <span class="guide-badge">🤖 AI Agent Ready</span>
448
+ <span class="guide-badge">⚡ Easy Setup</span>
449
+ <span class="guide-badge">🔧 Velo Code</span>
450
+ <span class="guide-badge">🔒 Secure</span>
451
+ </div>
452
+ </div>
453
+ </div>
454
+
455
+ <div class="guide-content">
456
+ <main class="guide-main">
457
+ <section id="overview">
458
+ <h2>Why Add UCP to Wix?</h2>
459
+ <p>
460
+ Wix powers millions of online stores worldwide. Adding UCP (Universal Commerce Protocol) support makes your Wix store discoverable by AI shopping assistants, enabling automatic product discovery and purchases.
461
+ </p>
462
+ <ul>
463
+ <li><strong>Visual Editor:</strong> Add UCP without deep technical knowledge</li>
464
+ <li><strong>Velo by Wix:</strong> Use Wix's development platform for custom implementations</li>
465
+ <li><strong>Built-in Hosting:</strong> No server configuration needed</li>
466
+ <li><strong>Wix Stores Integration:</strong> Works seamlessly with Wix eCommerce</li>
467
+ </ul>
468
+
469
+ <div class="tip-box platform">
470
+ <strong>📦 Wix Plans</strong>
471
+ UCP implementation requires a Wix premium plan with eCommerce features. The Velo method requires a plan that supports custom code.
472
+ </div>
473
+ </section>
474
+
475
+ <section id="methods">
476
+ <h2>Implementation Methods</h2>
477
+
478
+ <table>
479
+ <tr>
480
+ <th>Method</th>
481
+ <th>Difficulty</th>
482
+ <th>Requirements</th>
483
+ </tr>
484
+ <tr>
485
+ <td><strong>Wix App (Recommended)</strong></td>
486
+ <td>Easy</td>
487
+ <td>Any Wix eCommerce plan</td>
488
+ </tr>
489
+ <tr>
490
+ <td><strong>Velo Backend</strong></td>
491
+ <td>Medium</td>
492
+ <td>Velo-enabled plan</td>
493
+ </tr>
494
+ <tr>
495
+ <td><strong>External Hosting</strong></td>
496
+ <td>Medium</td>
497
+ <td>Domain with redirect capability</td>
498
+ </tr>
499
+ </table>
500
+ </section>
501
+
502
+ <section id="velo-method">
503
+ <h2>Method 1: Velo Backend (Recommended)</h2>
504
+ <p>Use Wix Velo to create a backend HTTP function that serves your UCP profile.</p>
505
+
506
+ <div class="step-title"><span class="step-number">1</span>Generate Your UCP Profile</div>
507
+
508
+ <div class="cta-box">
509
+ <h3>Generate Your UCP Profile</h3>
510
+ <p>Create a customized UCP profile for your Wix store.</p>
511
+ <a href="/#generate" class="btn">Open Generator →</a>
512
+ </div>
513
+
514
+ <div class="step-title"><span class="step-number">2</span>Enable Dev Mode</div>
515
+ <ol>
516
+ <li>Open your Wix site in the Editor</li>
517
+ <li>Click <strong>Dev Mode</strong> in the top menu</li>
518
+ <li>Click <strong>Turn on Dev Mode</strong></li>
519
+ </ol>
520
+
521
+ <div class="step-title"><span class="step-number">3</span>Create HTTP Function</div>
522
+ <ol>
523
+ <li>In the Site Structure panel, expand <strong>Backend</strong></li>
524
+ <li>Create a new file: <code>http-functions.js</code></li>
525
+ <li>Add the following code:</li>
526
+ </ol>
527
+
528
+ <pre><span style="color:#6A9955">// Backend/http-functions.js</span>
529
+ <span style="color:#C586C0">import</span> { ok, serverError } <span style="color:#C586C0">from</span> <span style="color:#CE9178">'wix-http-functions'</span>;
530
+
531
+ <span style="color:#6A9955">// This creates the endpoint: /_functions/ucp</span>
532
+ <span style="color:#C586C0">export function</span> <span style="color:#DCDCAA">get_ucp</span>(request) {
533
+ <span style="color:#C586C0">const</span> profile = {
534
+ profile_version: <span style="color:#CE9178">"1.0"</span>,
535
+ merchant: {
536
+ name: <span style="color:#CE9178">"Your Store Name"</span>,
537
+ url: <span style="color:#CE9178">"https://www.yoursite.com"</span>,
538
+ description: <span style="color:#CE9178">"Your store description"</span>,
539
+ contact: {
540
+ email: <span style="color:#CE9178">"support@yourstore.com"</span>
541
+ }
542
+ },
543
+ capabilities: [<span style="color:#CE9178">"browse"</span>, <span style="color:#CE9178">"search"</span>],
544
+ policies: {
545
+ returns_url: <span style="color:#CE9178">"https://www.yoursite.com/returns-policy"</span>,
546
+ shipping_url: <span style="color:#CE9178">"https://www.yoursite.com/shipping-policy"</span>,
547
+ privacy_url: <span style="color:#CE9178">"https://www.yoursite.com/privacy-policy"</span>
548
+ }
549
+ };
550
+
551
+ <span style="color:#C586C0">const</span> options = {
552
+ headers: {
553
+ <span style="color:#CE9178">"Content-Type"</span>: <span style="color:#CE9178">"application/json"</span>,
554
+ <span style="color:#CE9178">"Access-Control-Allow-Origin"</span>: <span style="color:#CE9178">"*"</span>
555
+ },
556
+ body: JSON.stringify(profile, <span style="color:#569CD6">null</span>, <span style="color:#B5CEA8">2</span>)
557
+ };
558
+
559
+ <span style="color:#C586C0">return</span> ok(options);
560
+ }</pre>
561
+
562
+ <div class="step-title"><span class="step-number">4</span>Create Router for .well-known</div>
563
+ <p>Create a new file <code>routers.js</code> in the Backend folder:</p>
564
+
565
+ <pre><span style="color:#6A9955">// Backend/routers.js</span>
566
+ <span style="color:#C586C0">import</span> { ok, WixRouterSitemapEntry } <span style="color:#C586C0">from</span> <span style="color:#CE9178">'wix-router'</span>;
567
+
568
+ <span style="color:#C586C0">export function</span> <span style="color:#DCDCAA">wellknown_Router</span>(request) {
569
+ <span style="color:#C586C0">if</span> (request.path[<span style="color:#B5CEA8">0</span>] === <span style="color:#CE9178">'ucp'</span>) {
570
+ <span style="color:#6A9955">// Redirect to HTTP function</span>
571
+ <span style="color:#C586C0">return</span> ok(<span style="color:#CE9178">'ucp-page'</span>, {});
572
+ }
573
+ }</pre>
574
+
575
+ <div class="step-title"><span class="step-number">5</span>Add Router Prefix</div>
576
+ <ol>
577
+ <li>In the Wix Editor, go to <strong>Site Menu → Add Page</strong></li>
578
+ <li>Choose <strong>Router Page</strong></li>
579
+ <li>Set prefix to <code>.well-known</code></li>
580
+ <li>Connect it to your router</li>
581
+ </ol>
582
+
583
+ <div class="tip-box warning">
584
+ <strong>⚠️ Wix Router Limitations</strong>
585
+ Wix routers may have limitations with <code>.well-known</code> paths. If you encounter issues, use the External Hosting method below.
586
+ </div>
587
+
588
+ <div class="step-title"><span class="step-number">6</span>Publish Your Site</div>
589
+ <p>Click <strong>Publish</strong> to make your changes live. Your UCP profile will be available at:</p>
590
+ <ul>
591
+ <li><code>https://yoursite.com/_functions/ucp</code> (HTTP function)</li>
592
+ <li><code>https://yoursite.com/.well-known/ucp</code> (if router works)</li>
593
+ </ul>
594
+ </section>
595
+
596
+ <section id="external-method">
597
+ <h2>Method 2: External Hosting with Redirect</h2>
598
+ <p>If Velo isn't available or the router doesn't work, host your UCP profile externally and redirect.</p>
599
+
600
+ <div class="step-title"><span class="step-number">1</span>Host Your UCP Profile</div>
601
+ <p>Upload your UCP JSON file to a service like:</p>
602
+ <ul>
603
+ <li><a href="https://gist.github.com" target="_blank">GitHub Gist</a> (get the raw URL)</li>
604
+ <li><a href="https://jsonbin.io" target="_blank">JSONBin.io</a></li>
605
+ <li>Your own server or CDN</li>
606
+ </ul>
607
+
608
+ <div class="step-title"><span class="step-number">2</span>Set Up Domain Redirect</div>
609
+ <p>If you're using a custom domain with Wix, you can set up a redirect at the DNS level or use Cloudflare Workers:</p>
610
+
611
+ <pre><span style="color:#6A9955">// Cloudflare Worker example</span>
612
+ <span style="color:#DCDCAA">addEventListener</span>(<span style="color:#CE9178">'fetch'</span>, event => {
613
+ event.respondWith(handleRequest(event.request))
614
+ })
615
+
616
+ <span style="color:#C586C0">async function</span> <span style="color:#DCDCAA">handleRequest</span>(request) {
617
+ <span style="color:#C586C0">const</span> url = <span style="color:#C586C0">new</span> URL(request.url)
618
+
619
+ <span style="color:#C586C0">if</span> (url.pathname === <span style="color:#CE9178">'/.well-known/ucp'</span>) {
620
+ <span style="color:#C586C0">const</span> ucpUrl = <span style="color:#CE9178">'https://your-hosted-ucp-url.com/ucp.json'</span>
621
+ <span style="color:#C586C0">const</span> response = <span style="color:#C586C0">await</span> fetch(ucpUrl)
622
+ <span style="color:#C586C0">return new</span> Response(response.body, {
623
+ headers: {
624
+ <span style="color:#CE9178">'Content-Type'</span>: <span style="color:#CE9178">'application/json'</span>,
625
+ <span style="color:#CE9178">'Access-Control-Allow-Origin'</span>: <span style="color:#CE9178">'*'</span>
626
+ }
627
+ })
628
+ }
629
+
630
+ <span style="color:#C586C0">return</span> fetch(request)
631
+ }</pre>
632
+ </section>
633
+
634
+ <section id="schema-markup">
635
+ <h2>Schema.org Markup</h2>
636
+ <p>Wix Stores automatically adds basic Schema.org markup to product pages. For enhanced AI compatibility:</p>
637
+
638
+ <ol>
639
+ <li>Go to your site's <strong>SEO Settings</strong></li>
640
+ <li>Navigate to <strong>SEO Tools → Structured Data</strong></li>
641
+ <li>Ensure Product schema is enabled</li>
642
+ </ol>
643
+
644
+ <div class="tip-box">
645
+ <strong>💡 Verification</strong>
646
+ Use <a href="https://search.google.com/test/rich-results" target="_blank">Google's Rich Results Test</a> to verify your product pages have proper structured data.
647
+ </div>
648
+ </section>
649
+
650
+ <section id="validation">
651
+ <h2>Validate Your Implementation</h2>
652
+
653
+ <div class="cta-box">
654
+ <h3>Validate Your Wix Store</h3>
655
+ <p>Check your UCP implementation and AI commerce readiness.</p>
656
+ <a href="/" class="btn">Run Validation →</a>
657
+ </div>
658
+ </section>
659
+
660
+ <section id="common-issues">
661
+ <h2>Common Issues & Solutions</h2>
662
+
663
+ <table>
664
+ <tr>
665
+ <th>Issue</th>
666
+ <th>Solution</th>
667
+ </tr>
668
+ <tr>
669
+ <td>Router prefix not working</td>
670
+ <td>Use the HTTP function method or external hosting</td>
671
+ </tr>
672
+ <tr>
673
+ <td>CORS errors</td>
674
+ <td>Ensure <code>Access-Control-Allow-Origin</code> header is set</td>
675
+ </tr>
676
+ <tr>
677
+ <td>Dev Mode not available</td>
678
+ <td>Upgrade to a Wix plan that includes Velo</td>
679
+ </tr>
680
+ <tr>
681
+ <td>Changes not live</td>
682
+ <td>Make sure to click <strong>Publish</strong> after changes</td>
683
+ </tr>
684
+ </table>
685
+ </section>
686
+
687
+ <section id="testing">
688
+ <h2>🤖 Test with AI Agents</h2>
689
+
690
+ <div class="cta-box">
691
+ <h3>Run AI Agent Simulation</h3>
692
+ <p>Test how AI shopping agents will interact with your Wix store.</p>
693
+ <a href="/#simulate" class="btn">Open Simulator →</a>
694
+ </div>
695
+ </section>
696
+
697
+ <section id="resources">
698
+ <h2>Resources</h2>
699
+ <ul>
700
+ <li><a href="https://ucp.dev" target="_blank">Official UCP Specification</a></li>
701
+ <li><a href="https://www.wix.com/velo/reference" target="_blank">Velo API Reference</a></li>
702
+ <li><a href="https://support.wix.com/en/article/velo-exposing-a-site-api-with-http-functions" target="_blank">Wix HTTP Functions Guide</a></li>
703
+ <li><a href="/learn">UCP Learning Center</a></li>
704
+ </ul>
705
+ </section>
706
+ </main>
707
+
708
+ <aside class="guide-sidebar">
709
+ <div class="sidebar-toc">
710
+ <h4>On This Page</h4>
711
+ <ul>
712
+ <li><a href="#overview">Why Add UCP?</a></li>
713
+ <li><a href="#methods">Implementation Methods</a></li>
714
+ <li><a href="#velo-method">Velo Method</a></li>
715
+ <li><a href="#external-method">External Hosting</a></li>
716
+ <li><a href="#schema-markup">Schema.org Markup</a></li>
717
+ <li><a href="#validation">Validation</a></li>
718
+ <li><a href="#common-issues">Common Issues</a></li>
719
+ <li><a href="#testing">Test with AI</a></li>
720
+ <li><a href="#resources">Resources</a></li>
721
+ </ul>
722
+ </div>
723
+
724
+ <div class="other-guides">
725
+ <h4>Other Platforms</h4>
726
+ <a href="/guides/shopify">Shopify</a>
727
+ <a href="/guides/woocommerce">WooCommerce</a>
728
+ <a href="/guides/magento">Magento</a>
729
+ <a href="/guides/bigcommerce">BigCommerce</a>
730
+ <a href="/guides/squarespace">Squarespace</a>
731
+ </div>
732
+ </aside>
733
+ </div>
734
+
735
+ <footer>
736
+ <div class="container">
737
+ <p>UCP Tools — Built for the AI Commerce era</p>
738
+ <p class="footer-links">
739
+ <a href="https://github.com/Nolpak14/ucp-tools" target="_blank">GitHub</a> ·
740
+ <a href="https://ucp.dev" target="_blank">UCP Spec</a> ·
741
+ <a href="/">Validator</a>
742
+ </p>
743
+ </div>
744
+ </footer>
745
+ </body>
746
+
747
+ </html>