Skip to content

Commit e1e773f

Browse files
authored
feat(slack): add install + privacy section to integration landing page (#4799)
* 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). * fix(landing): render privacy section independently, align CTA analytics label * docs(landing): clarify the Slack install button is behind sign-in * refactor(landing): bake integration landing content into generated json via docs-gen Moves landing content (install walkthrough + privacy) out of a render-time augment and into the generation pipeline: generate-docs reads the pure-data content map and writes landingContent into integrations.json, so the page reads a single source (integration.landingContent). Canonical types live in integrations/data/types.ts.
1 parent 925dd87 commit e1e773f

13 files changed

Lines changed: 254 additions & 32 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: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,8 @@ export default async function IntegrationPage({ params }: { params: Promise<{ sl
217217
const { name, description, longDescription, bgColor, docsUrl, operations, triggers, authType } =
218218
integration
219219

220+
const landingContent = integration.landingContent
221+
220222
const IconComponent = blockTypeToIconMap[integration.type]
221223
const faqs = buildFAQs(integration)
222224
const relatedSlugs = getRelatedSlugs(slug, operations, authType)
@@ -444,6 +446,77 @@ export default async function IntegrationPage({ params }: { params: Promise<{ sl
444446
</>
445447
)}
446448

449+
{/* Install / Add to workspace (integration-specific) */}
450+
{landingContent?.install && (
451+
<>
452+
<section aria-labelledby='install-heading' className='px-6 py-10'>
453+
<h2
454+
id='install-heading'
455+
className='mb-4 text-[20px] text-white leading-[100%] tracking-[-0.02em]'
456+
>
457+
{landingContent.install.heading}
458+
</h2>
459+
<p className='mb-6 max-w-[700px] text-[15px] text-[var(--landing-text-body)] leading-[150%] tracking-[0.02em]'>
460+
{landingContent.install.intro}
461+
</p>
462+
<ol className='space-y-4' aria-label={`Steps to add ${name}`}>
463+
{landingContent.install.steps.map((item, index) => (
464+
<li key={item.title} className='flex gap-4'>
465+
<span
466+
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)]'
467+
aria-hidden='true'
468+
>
469+
{String(index + 1).padStart(2, '0')}
470+
</span>
471+
<div>
472+
<h3 className='mb-1 text-[15px] text-white tracking-[-0.02em]'>
473+
{item.title}
474+
</h3>
475+
<p className='text-[14px] text-[var(--landing-text-body)] leading-[150%] tracking-[0.02em]'>
476+
{item.body}
477+
</p>
478+
</div>
479+
</li>
480+
))}
481+
</ol>
482+
<div className='mt-8 flex flex-wrap gap-2'>
483+
<IntegrationCtaButton
484+
label={`Add to ${name}`}
485+
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]'
486+
>
487+
Add to {name}
488+
</IntegrationCtaButton>
489+
</div>
490+
</section>
491+
<div className='h-px w-full bg-[var(--landing-bg-elevated)]' />
492+
</>
493+
)}
494+
495+
{/* Privacy & data (integration-specific) */}
496+
{landingContent?.privacy && (
497+
<>
498+
<section aria-labelledby='privacy-heading' className='px-6 py-10'>
499+
<h2
500+
id='privacy-heading'
501+
className='mb-4 text-[20px] text-white leading-[100%] tracking-[-0.02em]'
502+
>
503+
Privacy & data
504+
</h2>
505+
<p className='max-w-[700px] text-[15px] text-[var(--landing-text-body)] leading-[150%] tracking-[0.02em]'>
506+
{landingContent.privacy.body}{' '}
507+
<Link
508+
href={landingContent.privacy.href}
509+
className='text-[var(--landing-text)] underline underline-offset-2 hover:text-white'
510+
>
511+
Privacy Policy
512+
</Link>
513+
.
514+
</p>
515+
</section>
516+
<div className='h-px w-full bg-[var(--landing-bg-elevated)]' />
517+
</>
518+
)}
519+
447520
{/* How to automate */}
448521
<section aria-labelledby='how-it-works-heading' className='px-6 py-10'>
449522
<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: 48 additions & 2 deletions
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",
@@ -13288,7 +13306,35 @@
1328813306
"authType": "oauth",
1328913307
"category": "tools",
1329013308
"integrationTypes": ["communication", "developer-tools"],
13291-
"tags": ["messaging", "webhooks", "automation"]
13309+
"tags": ["messaging", "webhooks", "automation"],
13310+
"landingContent": {
13311+
"install": {
13312+
"heading": "Add Sim to your Slack workspace",
13313+
"intro": "Sim connects to Slack through Slack’s official OAuth flow. The “Add to Slack” button lives inside your Sim account (after sign-in) — connect from there and the Sim bot is installed in your Slack workspace. The steps below show exactly how to reach it.",
13314+
"steps": [
13315+
{
13316+
"title": "Create your free Sim account",
13317+
"body": "Sign up at sim.ai — no credit card required."
13318+
},
13319+
{
13320+
"title": "Add a Slack block",
13321+
"body": "Open a workflow, drag in a Slack block, and open its credential dropdown."
13322+
},
13323+
{
13324+
"title": "Connect Slack",
13325+
"body": "Click Connect Slack, choose your workspace, and approve the requested permissions. This installs the Sim bot in your Slack workspace."
13326+
},
13327+
{
13328+
"title": "Invite the bot and build",
13329+
"body": "Invite the Sim bot to the channels it should act in, pick a Slack action, wire it into your agent, and run."
13330+
}
13331+
]
13332+
},
13333+
"privacy": {
13334+
"body": "Sim requests only the Slack permissions its actions and triggers need, and never shows private channel names or messages to people who are not members of those channels in Slack.",
13335+
"href": "/privacy"
13336+
}
13337+
}
1329213338
},
1329313339
{
1329413340
"type": "smtp",

0 commit comments

Comments
 (0)