Skip to content

Commit 4eeb624

Browse files
committed
feat(slack): add install + privacy section to integration landing page
Adds a hand-authored, slug-keyed landing-content module (separate from the generated integrations.json so it survives regeneration) and renders an install walkthrough + privacy-policy link on integration pages when present. Also refreshes generated docs (data-enrichment entry, icon mappings, tool mdx).
1 parent 4b0dab4 commit 4eeb624

11 files changed

Lines changed: 193 additions & 30 deletions

File tree

apps/docs/components/icons.tsx

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,22 @@
11
import type { SVGProps } from 'react'
22
import { useId } from 'react'
33

4+
export function EnrichmentIcon(props: SVGProps<SVGSVGElement>) {
5+
return (
6+
<svg
7+
{...props}
8+
viewBox='0 0 24 24'
9+
fill='currentColor'
10+
role='img'
11+
xmlns='http://www.w3.org/2000/svg'
12+
>
13+
<path d='M12 2.5l1.9 4.6 4.6 1.9-4.6 1.9L12 15.5l-1.9-4.6L5.5 9l4.6-1.9L12 2.5z' />
14+
<path d='M18.5 14l.95 2.3 2.3.95-2.3.95L18.5 20.5l-.95-2.3-2.3-.95 2.3-.95.95-2.3z' />
15+
<path d='M5.5 14.5l.7 1.7 1.7.7-1.7.7-.7 1.7-.7-1.7-1.7-.7 1.7-.7.7-1.7z' />
16+
</svg>
17+
)
18+
}
19+
420
export function AgentMailIcon(props: SVGProps<SVGSVGElement>) {
521
return (
622
<svg {...props} viewBox='0 0 350 363' fill='none' xmlns='http://www.w3.org/2000/svg'>
@@ -4731,7 +4747,7 @@ export function ZoomInfoIcon(props: SVGProps<SVGSVGElement>) {
47314747
return (
47324748
<svg
47334749
{...props}
4734-
viewBox='0 0 65 65'
4750+
viewBox='0.272461 0.272461 64 64'
47354751
fill='none'
47364752
xmlns='http://www.w3.org/2000/svg'
47374753
aria-hidden='true'

apps/docs/components/ui/icon-mapping.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import {
2020
AshbyIcon,
2121
AthenaIcon,
2222
AttioIcon,
23-
AzureDevOpsIcon,
2423
AzureIcon,
2524
BoxCompanyIcon,
2625
BrainIcon,
@@ -53,6 +52,7 @@ import {
5352
ElasticsearchIcon,
5453
ElevenLabsIcon,
5554
EmailBisonIcon,
55+
EnrichmentIcon,
5656
EnrichSoIcon,
5757
EvernoteIcon,
5858
ExaAIIcon,
@@ -232,7 +232,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
232232
ashby: AshbyIcon,
233233
athena: AthenaIcon,
234234
attio: AttioIcon,
235-
azure_devops: AzureDevOpsIcon,
235+
azure_devops: AzureIcon,
236236
box: BoxCompanyIcon,
237237
brandfetch: BrandfetchIcon,
238238
brightdata: BrightDataIcon,
@@ -265,6 +265,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
265265
elevenlabs: ElevenLabsIcon,
266266
emailbison: EmailBisonIcon,
267267
enrich: EnrichSoIcon,
268+
enrichment: EnrichmentIcon,
268269
evernote: EvernoteIcon,
269270
exa: ExaAIIcon,
270271
extend: ExtendIcon,

apps/docs/content/docs/en/tools/apollo.mdx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ Update an existing contact in your Apollo database
252252
| `mobile_phone` | string | No | Mobile phone number |
253253
| `home_phone` | string | No | Home phone number |
254254
| `other_phone` | string | No | Alternative phone number |
255-
| `typed_custom_fields` | json | No | Custom field values keyed by custom field ID \(accepted by Apollo but not officially documented for PATCH /contacts/\{id\}\) |
255+
| `typed_custom_fields` | json | No | Custom field values keyed by custom field ID |
256256

257257
#### Output
258258

@@ -440,16 +440,17 @@ Update up to 1000 existing accounts at once in your Apollo database (higher limi
440440
| `account_ids` | array | No | Array of account IDs to update with the same values \(max 1000\). Use with name/owner_id for uniform updates. Use either this OR account_attributes. |
441441
| `name` | string | No | When using account_ids, apply this name to all accounts |
442442
| `owner_id` | string | No | When using account_ids, apply this owner to all accounts |
443+
| `account_stage_id` | string | No | When using account_ids, apply this account stage to all accounts |
443444
| `account_attributes` | json | No | Array of account objects with individual updates \(each must include id\). Example: \[\{"id": "acc1", "name": "Acme", "owner_id": "u1", "account_stage_id": "s1", "typed_custom_fields": \{"field_id": "value"\}\}\] |
444445
| `async` | boolean | No | When true, processes the update asynchronously. Only supported when using account_ids; returns 422 if used with account_attributes. |
445446

446447
#### Output
447448

448449
| Parameter | Type | Description |
449450
| --------- | ---- | ----------- |
450-
| `accounts` | json | Updated accounts \(synchronous response, ≤100 accounts\): \[\{id, account_stage_id, ...\}\] |
451+
| `accounts` | json | Updated accounts \(synchronous response\): \[\{id, account_stage_id, ...\}\] |
451452
| `account_ids` | json | IDs of accounts that were updated |
452-
| `entity_progress_job` | json | Async job descriptor \(&gt;100 accounts or async=true\) |
453+
| `entity_progress_job` | json | Async job descriptor \(when async=true is passed with account_ids\) |
453454
| `job_id` | string | Async job ID extracted from entity_progress_job |
454455
| `message` | string | Optional confirmation message from Apollo |
455456

apps/docs/content/docs/en/tools/enrichment.mdx

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
title: Enrichment
2+
title: Data Enrichment
33
description: Enrich data with a Sim enrichment
44
---
55

@@ -31,18 +31,9 @@ Run a Sim enrichment (e.g. Work Email, Phone Number) and return its outputs
3131

3232
#### Output
3333

34-
The exact fields depend on which enrichment ran. `matched` and `provider` are always present.
35-
3634
| Parameter | Type | Description |
3735
| --------- | ---- | ----------- |
3836
| `matched` | boolean | Whether the enrichment found a result |
39-
| `provider` | string | Provider whose result was returned (e.g. "Hunter", "People Data Labs"); `null` on no match |
40-
| `email` | string | Work email address (Work Email enrichment) |
41-
| `phone` | string | Phone number (Phone Number enrichment) |
42-
| `domain` | string | Website domain (Company Domain enrichment) |
43-
| `industry` | string | Industry (Company Info enrichment) |
44-
| `employeeCount` | number | Employee count (Company Info enrichment) |
45-
| `foundedYear` | number | Founded year (Company Info enrichment) |
46-
| `description` | string | Company description (Company Info enrichment) |
37+
| `provider` | string | Provider whose result was returned \(e.g. "Hunter", "People Data Labs"\) |
4738

4839

apps/docs/content/docs/en/tools/resend.mdx

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,17 +80,19 @@ Retrieve details of a previously sent email by its ID
8080
| --------- | ---- | ----------- |
8181
| `id` | string | Email ID |
8282
| `from` | string | Sender email address |
83-
| `to` | json | Recipient email addresses |
83+
| `to` | array | Recipient email addresses |
8484
| `subject` | string | Email subject |
8585
| `html` | string | HTML email content |
8686
| `text` | string | Plain text email content |
87-
| `cc` | json | CC email addresses |
88-
| `bcc` | json | BCC email addresses |
89-
| `replyTo` | json | Reply-to email addresses |
87+
| `cc` | array | CC email addresses |
88+
| `bcc` | array | BCC email addresses |
89+
| `replyTo` | array | Reply-to email addresses |
9090
| `lastEvent` | string | Last event status \(e.g., delivered, bounced\) |
9191
| `createdAt` | string | Email creation timestamp |
9292
| `scheduledAt` | string | Scheduled send timestamp |
93-
| `tags` | json | Email tags as name-value pairs |
93+
| `tags` | array | Email tags as name-value pairs |
94+
|`name` | string | Tag name |
95+
|`value` | string | Tag value |
9496

9597
### `resend_create_contact`
9698

@@ -126,7 +128,13 @@ List all contacts in Resend
126128

127129
| Parameter | Type | Description |
128130
| --------- | ---- | ----------- |
129-
| `contacts` | json | Array of contacts with id, email, first_name, last_name, created_at, unsubscribed |
131+
| `contacts` | array | Array of contacts |
132+
|`id` | string | Contact ID |
133+
|`email` | string | Contact email address |
134+
|`first_name` | string | Contact first name |
135+
|`last_name` | string | Contact last name |
136+
|`created_at` | string | Contact creation timestamp |
137+
|`unsubscribed` | boolean | Whether the contact is unsubscribed |
130138
| `hasMore` | boolean | Whether there are more contacts to retrieve |
131139

132140
### `resend_get_contact`
@@ -203,7 +211,12 @@ List all verified domains in your Resend account
203211

204212
| Parameter | Type | Description |
205213
| --------- | ---- | ----------- |
206-
| `domains` | json | Array of domains with id, name, status, region, and createdAt |
214+
| `domains` | array | Array of domains |
215+
|`id` | string | Domain ID |
216+
|`name` | string | Domain name |
217+
|`status` | string | Domain verification status |
218+
|`region` | string | Region the domain is configured in |
219+
|`createdAt` | string | Domain creation timestamp |
207220
| `hasMore` | boolean | Whether there are more domains to retrieve |
208221

209222

apps/docs/content/docs/en/tools/wiza.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ Enrich a company by name, domain, LinkedIn ID, or LinkedIn slug with detailed fi
149149
| `company_region` | string | State/region |
150150
| `company_postal_code` | string | Postal code |
151151
| `company_country` | string | Country |
152-
| `credits` | json | Credits deducted for this enrichment \(api_credits: \{ total, email_credits, phone_credits, scrape_credits \}\) |
152+
| `credits` | json | Credits deducted for this enrichment \(api_credits: \{ total, company_credits \}\) |
153153

154154
### `wiza_start_individual_reveal`
155155

apps/docs/content/docs/en/tools/zoominfo.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ Enrich up to 25 companies in one request with detailed firmographics, industry,
119119
| `clientId` | string | Yes | ZoomInfo OAuth client ID |
120120
| `clientSecret` | string | Yes | ZoomInfo OAuth client secret |
121121
| `matchCompanyInput` | string | Yes | JSON array \(1-25 items\) of company matching criteria, e.g. \[\{"companyName":"Acme","companyWebsite":"acme.com"\}\] |
122-
| `outputFields` | string | No | JSON array or comma-separated list of fields to return \(e.g. \["id","name","website","revenue","employeeCount"\]\) |
122+
| `outputFields` | string | No | JSON array or comma-separated list of fields to return \(e.g. \["id","name","website","revenue","employeeCount"\]\). Defaults to a standard firmographic set if omitted. |
123123

124124
#### Output
125125

@@ -138,7 +138,7 @@ Enrich up to 25 contacts in one request with verified emails, phone numbers, job
138138
| `clientId` | string | Yes | ZoomInfo OAuth client ID |
139139
| `clientSecret` | string | Yes | ZoomInfo OAuth client secret |
140140
| `matchPersonInput` | string | Yes | JSON array \(1-25 items\) of contact matching criteria, e.g. \[\{"firstName":"Jane","lastName":"Doe","companyName":"Acme"\}\] |
141-
| `outputFields` | string | No | JSON array or comma-separated list of fields to return \(e.g. \["id","firstName","email","phone","jobTitle"\]\) |
141+
| `outputFields` | string | No | JSON array or comma-separated list of fields to return \(e.g. \["id","firstName","email","phone","jobTitle"\]\). Defaults to a standard contact set if omitted. |
142142
| `requiredFields` | string | No | JSON array or comma-separated list of fields that must exist in results \(e.g. \["email"\]\) |
143143

144144
#### Output

apps/sim/app/(landing)/integrations/(shell)/[slug]/page.tsx

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { TemplateCardButton } from '@/app/(landing)/integrations/(shell)/[slug]/
99
import { IntegrationIcon } from '@/app/(landing)/integrations/components/integration-icon'
1010
import { blockTypeToIconMap } from '@/app/(landing)/integrations/data/icon-mapping'
1111
import integrations from '@/app/(landing)/integrations/data/integrations.json'
12+
import { INTEGRATION_LANDING_CONTENT } from '@/app/(landing)/integrations/data/landing-content'
1213
import type { AuthType, FAQItem, Integration } from '@/app/(landing)/integrations/data/types'
1314
import { TEMPLATES } from '@/app/workspace/[workspaceId]/home/components/template-prompts/consts'
1415

@@ -217,6 +218,8 @@ export default async function IntegrationPage({ params }: { params: Promise<{ sl
217218
const { name, description, longDescription, bgColor, docsUrl, operations, triggers, authType } =
218219
integration
219220

221+
const landingContent = INTEGRATION_LANDING_CONTENT[slug]
222+
220223
const IconComponent = blockTypeToIconMap[integration.type]
221224
const faqs = buildFAQs(integration)
222225
const relatedSlugs = getRelatedSlugs(slug, operations, authType)
@@ -444,6 +447,64 @@ export default async function IntegrationPage({ params }: { params: Promise<{ sl
444447
</>
445448
)}
446449

450+
{/* Install / Add to workspace (integration-specific) */}
451+
{landingContent?.install && (
452+
<>
453+
<section aria-labelledby='install-heading' className='px-6 py-10'>
454+
<h2
455+
id='install-heading'
456+
className='mb-4 text-[20px] text-white leading-[100%] tracking-[-0.02em]'
457+
>
458+
{landingContent.install.heading}
459+
</h2>
460+
<p className='mb-6 max-w-[700px] text-[15px] text-[var(--landing-text-body)] leading-[150%] tracking-[0.02em]'>
461+
{landingContent.install.intro}
462+
</p>
463+
<ol className='space-y-4' aria-label={`Steps to add ${name}`}>
464+
{landingContent.install.steps.map((item, index) => (
465+
<li key={item.title} className='flex gap-4'>
466+
<span
467+
className='mt-0.5 flex size-7 shrink-0 items-center justify-center rounded-full border border-[var(--landing-border-strong)] font-martian-mono text-[11px] text-[var(--landing-text-subtle)]'
468+
aria-hidden='true'
469+
>
470+
{String(index + 1).padStart(2, '0')}
471+
</span>
472+
<div>
473+
<h3 className='mb-1 text-[15px] text-white tracking-[-0.02em]'>
474+
{item.title}
475+
</h3>
476+
<p className='text-[14px] text-[var(--landing-text-body)] leading-[150%] tracking-[0.02em]'>
477+
{item.body}
478+
</p>
479+
</div>
480+
</li>
481+
))}
482+
</ol>
483+
<div className='mt-8 flex flex-wrap gap-2'>
484+
<IntegrationCtaButton
485+
label={`Add ${name}`}
486+
className='inline-flex h-[32px] items-center gap-2 rounded-[5px] border border-white bg-white px-2.5 font-season text-black text-sm transition-colors hover:border-[#E0E0E0] hover:bg-[#E0E0E0]'
487+
>
488+
Add to {name}
489+
</IntegrationCtaButton>
490+
</div>
491+
{landingContent.privacy && (
492+
<p className='mt-6 max-w-[700px] text-[13px] text-[var(--landing-text-muted)] leading-[150%] tracking-[0.02em]'>
493+
{landingContent.privacy.body}{' '}
494+
<Link
495+
href={landingContent.privacy.href}
496+
className='text-[var(--landing-text)] underline underline-offset-2 hover:text-white'
497+
>
498+
Privacy Policy
499+
</Link>
500+
.
501+
</p>
502+
)}
503+
</section>
504+
<div className='h-px w-full bg-[var(--landing-bg-elevated)]' />
505+
</>
506+
)}
507+
447508
{/* How to automate */}
448509
<section aria-labelledby='how-it-works-heading' className='px-6 py-10'>
449510
<h2

apps/sim/app/(landing)/integrations/data/icon-mapping.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import {
2020
AshbyIcon,
2121
AthenaIcon,
2222
AttioIcon,
23-
AzureDevOpsIcon,
2423
AzureIcon,
2524
BoxCompanyIcon,
2625
BrainIcon,
@@ -53,6 +52,7 @@ import {
5352
ElasticsearchIcon,
5453
ElevenLabsIcon,
5554
EmailBisonIcon,
55+
EnrichmentIcon,
5656
EnrichSoIcon,
5757
EvernoteIcon,
5858
ExaAIIcon,
@@ -231,7 +231,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
231231
ashby: AshbyIcon,
232232
athena: AthenaIcon,
233233
attio: AttioIcon,
234-
azure_devops: AzureDevOpsIcon,
234+
azure_devops: AzureIcon,
235235
box: BoxCompanyIcon,
236236
brandfetch: BrandfetchIcon,
237237
brightdata: BrightDataIcon,
@@ -262,6 +262,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
262262
elevenlabs: ElevenLabsIcon,
263263
emailbison: EmailBisonIcon,
264264
enrich: EnrichSoIcon,
265+
enrichment: EnrichmentIcon,
265266
evernote: EvernoteIcon,
266267
exa: ExaAIIcon,
267268
extend_v2: ExtendIcon,

apps/sim/app/(landing)/integrations/data/integrations.json

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1889,7 +1889,7 @@
18891889
"description": "Interact with Azure DevOps pipelines, builds, and work items",
18901890
"longDescription": "Integrate Azure DevOps into your workflow. List and inspect pipelines and builds, query and manage work items, and add or read comments.",
18911891
"bgColor": "#0078D4",
1892-
"iconName": "AzureDevOpsIcon",
1892+
"iconName": "AzureIcon",
18931893
"docsUrl": "https://docs.sim.ai/tools/azure_devops",
18941894
"operations": [
18951895
{
@@ -3137,6 +3137,24 @@
31373137
"integrationTypes": ["analytics", "developer-tools"],
31383138
"tags": ["data-analytics", "automation"]
31393139
},
3140+
{
3141+
"type": "enrichment",
3142+
"slug": "data-enrichment",
3143+
"name": "Data Enrichment",
3144+
"description": "Enrich data with a Sim enrichment",
3145+
"longDescription": "Run a Sim enrichment to look up data — work email, phone number, company domain, company info, and more — from the fields you map in. Uses the same provider cascade as table enrichments.",
3146+
"bgColor": "#9333EA",
3147+
"iconName": "EnrichmentIcon",
3148+
"docsUrl": "https://docs.sim.ai/tools/enrichment",
3149+
"operations": [],
3150+
"operationCount": 0,
3151+
"triggers": [],
3152+
"triggerCount": 0,
3153+
"authType": "none",
3154+
"category": "tools",
3155+
"integrationTypes": ["sales"],
3156+
"tags": ["enrichment"]
3157+
},
31403158
{
31413159
"type": "databricks",
31423160
"slug": "databricks",

0 commit comments

Comments
 (0)