Add Activepieces integration for workflow automation

- Add Activepieces fork with SmoothSchedule custom piece
- Create integrations app with Activepieces service layer
- Add embed token endpoint for iframe integration
- Create Automations page with embedded workflow builder
- Add sidebar visibility fix for embed mode
- Add list inactive customers endpoint to Public API
- Include SmoothSchedule triggers: event created/updated/cancelled
- Include SmoothSchedule actions: create/update/cancel events, list resources/services/customers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-18 22:59:37 -05:00
parent 9848268d34
commit 3aa7199503
16292 changed files with 1284892 additions and 4708 deletions

View File

@@ -0,0 +1,33 @@
{
"extends": [
"../../../../.eslintrc.base.json"
],
"ignorePatterns": [
"!**/*"
],
"overrides": [
{
"files": [
"*.ts",
"*.tsx",
"*.js",
"*.jsx"
],
"rules": {}
},
{
"files": [
"*.ts",
"*.tsx"
],
"rules": {}
},
{
"files": [
"*.js",
"*.jsx"
],
"rules": {}
}
]
}

View File

@@ -0,0 +1,7 @@
# pieces-lemlist
This library was generated with [Nx](https://nx.dev).
## Building
Run `nx build pieces-lemlist` to build the library.

View File

@@ -0,0 +1,10 @@
{
"name": "@activepieces/piece-lemlist",
"version": "0.0.2",
"type": "commonjs",
"main": "./src/index.js",
"types": "./src/index.d.ts",
"dependencies": {
"tslib": "^2.3.0"
}
}

View File

@@ -0,0 +1,65 @@
{
"name": "pieces-lemlist",
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "packages/pieces/community/lemlist/src",
"projectType": "library",
"release": {
"version": {
"manifestRootsToUpdate": [
"dist/{projectRoot}"
],
"currentVersionResolver": "git-tag",
"fallbackCurrentVersionResolver": "disk"
}
},
"tags": [],
"targets": {
"build": {
"executor": "@nx/js:tsc",
"outputs": [
"{options.outputPath}"
],
"options": {
"outputPath": "dist/packages/pieces/community/lemlist",
"tsConfig": "packages/pieces/community/lemlist/tsconfig.lib.json",
"packageJson": "packages/pieces/community/lemlist/package.json",
"main": "packages/pieces/community/lemlist/src/index.ts",
"assets": [
"packages/pieces/community/lemlist/*.md",
{
"input": "packages/pieces/community/lemlist/src/i18n",
"output": "./src/i18n",
"glob": "**/!(i18n.json)"
}
],
"buildableProjectDepsInPackageJsonType": "dependencies",
"updateBuildableProjectDepsInPackageJson": true
},
"dependsOn": [
"^build",
"prebuild"
]
},
"nx-release-publish": {
"options": {
"packageRoot": "dist/{projectRoot}"
}
},
"lint": {
"executor": "@nx/eslint:lint",
"outputs": [
"{options.outputFile}"
]
},
"prebuild": {
"executor": "nx:run-commands",
"options": {
"cwd": "packages/pieces/community/lemlist",
"command": "bun install --no-save --silent"
},
"dependsOn": [
"^build"
]
}
}
}

View File

@@ -0,0 +1,64 @@
{
"Enter your Lemlist API key": "Geben Sie Ihren Lemlist API-Schlüssel ein",
"Mark Lead From One Campaign as Interested": "Lead von einer Kampagne als interessiert markieren",
"Mark Lead From One Campaign as Not Interested": "Lead von einer Kampagne als nicht interessiert markieren",
"Mark Lead From All Campaign as Interested": "Lead von allen Kampagnen als interessiert markieren",
"Mark Lead From All Campaigns as Not Interested": "Lead von allen Kampagnen als nicht interessiert markieren",
"Pause Lead From All or Specific Campaigns": "Lead von allen oder bestimmten Kampagnen anhalten",
"Resume Lead From All or Specific Campaigns": "Lead von allen oder bestimmten Kampagnen fortsetzen",
"Remove Lead From Unsubscribe List": "Lead von der Abmeldeliste entfernen",
"Remove Lead from A Campaign": "Lead von einer Kampagne entfernen",
"Unsubscribe a Lead": "Lead abbestellen",
"Add Lead To A Campaign": "Lead zu einer Kampagne hinzufügen",
"Update Lead From Campaign": "Lead von Kampagne aktualisieren",
"Search Lead": "Suche Lead",
"Mark a lead in a campaign as interested.": "Markieren Sie einen Vorsprung in einer Kampagne als interessiert.",
"Mark a lead in a campaign as not interested.": "Markieren Sie einen Vorsprung in einer Kampagne als nicht interessiert.",
"Mark a lead as “interested” across all campaigns.": "Markieren Sie einen Vorsprung als „interessiert“ in allen Kampagnen.",
"Mark a lead as “not interested” across all campaigns.": "Markieren Sie einen Vorsprung als „nicht interessiert“ in allen Kampagnen.",
"Pause a leads outreach across all or specific campaigns.": "Stoppen Sie den Zugang eines Leiters über alle oder bestimmte Kampagnen hinweg.",
"Resume a leads outreach across all or specific campaigns.": "Fortsetzen Sie die Reichweite eines Leiters über alle oder bestimmte Kampagnen hinweg.",
"Remove a lead from “unsubscribe” list.": "Entferne einen Lead von der „Abmelden“-Liste.",
"removes a lead from a specific campaign.": "entfernt einen Lead aus einer bestimmten Kampagne.",
"Unsubscribe a lead from a campaign.": "Einen Vorsprung von einer Kampagne abbestellen.",
"Adds a lead to a specific campaign with optional enrichment and lead details.": "Fügt eine Führung zu einer bestimmten Kampagne mit optionalen Anreicherungs- und Leaddetails hinzu.",
"Updates a lead in a specific campaign.": "Aktualisiert einen Vorsprung in einer bestimmten Kampagne.",
"Look up a lead by email and campaign.": "Suchen Sie einen Vorsprung per E-Mail und Kampagne.",
"Campaign": "Kampagne",
"Lead Email": "Lead E-Mail",
"First Name": "Vorname",
"Last Name": "Nachname",
"Picture URL": "Bild-URL",
"Phone": "Telefon",
"LinkedIn URL": "LinkedIn URL",
"Company Name": "Firmenname",
"Company Domain": "Firmendomäne",
"Icebreaker": "Icebreaker",
"Job Title": "Job Titel",
"Deduplicate": "Deduplicate",
"LinkedIn Enrichment": "LinkedIn-Erweiterung",
"Find Email": "E-Mail finden",
"Verify Email": "E-Mail bestätigen",
"Find Phone": "Telefon finden",
"Select a campaign": "Kampagne auswählen",
"The email of the lead to mark as interested.": "Die E-Mail der Lead zu markieren als interessiert.",
"The email of the lead to mark as not interested.": "Die E-Mail der Lead zu markieren, als nicht interessiert.",
"Select a campaign (optional)": "Wählen Sie eine Kampagne (optional)",
"The email of the lead to pause.": "Die E-Mail der Lead zu pausieren.",
"The email of the lead to resume.": "Die E-Mail der Lead zum Fortsetzen.",
"The email of the lead to remove from the unsubscribe list.": "Die E-Mail der Lead-Liste, die von der Liste der Abbestellungen entfernt werden soll.",
"The email of the lead to remove.": "Die E-Mail des zu entfernenden Leads.",
"The email of the lead to unsubscribe.": "Die E-Mail der Lead zum Abmelden.",
"The email of the lead to add": "Die E-Mail der Lead hinzufügen",
"Avoid adding the lead if it already exists in any campaign": "Vermeiden Sie das Hinzufügen der Lead wenn sie bereits in einer Kampagne existiert",
"Run LinkedIn enrichment for this lead": "LinkedIn-Anreicherung für diesen Lead ausführen",
"Try to find a verified email for this lead": "Versuche eine verifizierte E-Mail für diesen Lead zu finden",
"Verify the leads email using debounce": "Bestätigen Sie die E-Mail des Interessenten mit debounce",
"Try to find a phone number for this lead": "Versuchen Sie eine Telefonnummer für diesen Lead zu finden",
"The email of the lead to update.": "Die E-Mail des zu aktualisierenden Leads.",
"The email of the lead to look up": "Die E-Mail der Lead zum nachschlagen",
"New Activity": "Neue Aktivität",
"Unsubscribed Recipient": "Abgemeldeter Empfänger",
"Triggers for each new activity.": "Trigger für jede neue Aktivität.",
"Triggers when a recipient unsubscribes.": "Wird ausgelöst, wenn ein Empfänger sich abmeldet."
}

View File

@@ -0,0 +1,64 @@
{
"Enter your Lemlist API key": "Introduzca su clave API Lemlist",
"Mark Lead From One Campaign as Interested": "Marcar líder de una campaña como interesado",
"Mark Lead From One Campaign as Not Interested": "Marcar como líder de una campaña como no interesado",
"Mark Lead From All Campaign as Interested": "Marcar como líder de toda la campaña como interesado",
"Mark Lead From All Campaigns as Not Interested": "Marcar como líder de todas las campañas como no interesado",
"Pause Lead From All or Specific Campaigns": "Pausar plomo de todas o campañas específicas",
"Resume Lead From All or Specific Campaigns": "Reanudar el plomo de todas o campañas específicas",
"Remove Lead From Unsubscribe List": "Quitar cliente potencial de la lista de desuscripción",
"Remove Lead from A Campaign": "Eliminar jefe de una campaña",
"Unsubscribe a Lead": "Darse de baja de un plomo",
"Add Lead To A Campaign": "Añadir Prospectos a una Campaña",
"Update Lead From Campaign": "Actualizar jefe de campaña",
"Search Lead": "Buscar plomo",
"Mark a lead in a campaign as interested.": "Marque un líder en una campaña como interesado.",
"Mark a lead in a campaign as not interested.": "Marque un líder en una campaña como no interesado.",
"Mark a lead as “interested” across all campaigns.": "Marque un liderazgo como “interesado” en todas las campañas.",
"Mark a lead as “not interested” across all campaigns.": "Marque un líder como “no interesado” en todas las campañas.",
"Pause a leads outreach across all or specific campaigns.": "Pausar el alcance de un líder a través de todas o campañas específicas.",
"Resume a leads outreach across all or specific campaigns.": "Reanudar el alcance de un líder a través de todas o campañas específicas.",
"Remove a lead from “unsubscribe” list.": "Elimine un cliente potencial de la lista de “darse de baja”.",
"removes a lead from a specific campaign.": "elimina un plomo de una campaña específica.",
"Unsubscribe a lead from a campaign.": "Darse de baja de un líder de una campaña.",
"Adds a lead to a specific campaign with optional enrichment and lead details.": "Añade una campaña específica con enrichment opcional y detalles de plomo.",
"Updates a lead in a specific campaign.": "Actualiza un líder en una campaña específica.",
"Look up a lead by email and campaign.": "Buscar un líder por correo electrónico y campaña.",
"Campaign": "Campaña",
"Lead Email": "Correo principal",
"First Name": "Nombre",
"Last Name": "Apellido",
"Picture URL": "URL de la imagen",
"Phone": "Teléfono",
"LinkedIn URL": "LinkedIn URL",
"Company Name": "Nombre De La Empresa",
"Company Domain": "Dominio de la empresa",
"Icebreaker": "Icebreaker",
"Job Title": "Trabajo",
"Deduplicate": "Deduplicate",
"LinkedIn Enrichment": "Enriquecimiento de LinkedIn",
"Find Email": "Buscar Email",
"Verify Email": "Verificar Email",
"Find Phone": "Encontrar teléfono",
"Select a campaign": "Seleccione una campaña",
"The email of the lead to mark as interested.": "El correo electrónico de la iniciativa a marcar como interesado.",
"The email of the lead to mark as not interested.": "El correo electrónico de la persona a marcar como no interesado.",
"Select a campaign (optional)": "Seleccione una campaña (opcional)",
"The email of the lead to pause.": "El correo electrónico del lead a la pausa.",
"The email of the lead to resume.": "El correo electrónico de la iniciativa a reanudar.",
"The email of the lead to remove from the unsubscribe list.": "El correo electrónico de la iniciativa a eliminar de la lista de desuscripción.",
"The email of the lead to remove.": "El correo electrónico de la iniciativa a eliminar.",
"The email of the lead to unsubscribe.": "El correo electrónico de la iniciativa a darse de baja.",
"The email of the lead to add": "El correo electrónico de la iniciativa a añadir",
"Avoid adding the lead if it already exists in any campaign": "Evitar añadir el cliente principal si ya existe en cualquier campaña",
"Run LinkedIn enrichment for this lead": "Ejecutar enrichment LinkedIn para esta iniciativa",
"Try to find a verified email for this lead": "Intenta encontrar un correo electrónico verificado para esta iniciativa",
"Verify the leads email using debounce": "Verifique el correo electrónico del cliente potencial usando debounce",
"Try to find a phone number for this lead": "Intenta encontrar un número de teléfono para esta iniciativa",
"The email of the lead to update.": "El correo electrónico de la iniciativa a actualizar.",
"The email of the lead to look up": "El correo electrónico de la iniciativa a buscar",
"New Activity": "Nueva actividad",
"Unsubscribed Recipient": "Destinatario no suscrito",
"Triggers for each new activity.": "Disparadores para cada nueva actividad.",
"Triggers when a recipient unsubscribes.": "Se activa cuando un destinatario se quita de suscripción."
}

View File

@@ -0,0 +1,64 @@
{
"Enter your Lemlist API key": "Entrez votre clé API Lemlist",
"Mark Lead From One Campaign as Interested": "Marquer le plomb d'une campagne comme intéressé",
"Mark Lead From One Campaign as Not Interested": "Marquer le prospect d'une seule campagne comme non intéressé",
"Mark Lead From All Campaign as Interested": "Marquer le prospect de toutes les campagnes comme étant intéressé",
"Mark Lead From All Campaigns as Not Interested": "Marquer le prospect de toutes les campagnes comme n'étant pas intéressé",
"Pause Lead From All or Specific Campaigns": "Suspendre le plomb de toutes les campagnes ou campagnes spécifiques",
"Resume Lead From All or Specific Campaigns": "Reprendre le prospect de toutes les campagnes ou campagnes spécifiques",
"Remove Lead From Unsubscribe List": "Supprimer le prospect de la liste de désinscription",
"Remove Lead from A Campaign": "Retirer le prospect d'une campagne",
"Unsubscribe a Lead": "Désabonner un prospect",
"Add Lead To A Campaign": "Ajouter un prospect à une campagne",
"Update Lead From Campaign": "Mettre à jour le prospect depuis la campagne",
"Search Lead": "Rechercher un prospect",
"Mark a lead in a campaign as interested.": "Marquer un leader dans une campagne comme intéressé.",
"Mark a lead in a campaign as not interested.": "Marquer comme un leader dans une campagne comme non intéressé.",
"Mark a lead as “interested” across all campaigns.": "Marquer un leader comme « intéressé » dans toutes les campagnes.",
"Mark a lead as “not interested” across all campaigns.": "Marquer un leader comme « pas intéressé » dans toutes les campagnes.",
"Pause a leads outreach across all or specific campaigns.": "Suspendre le contact dun chef de file dans toutes les campagnes ou campagnes spécifiques.",
"Resume a leads outreach across all or specific campaigns.": "Reprendre la portée dun chef de file dans toutes les campagnes ou campagnes spécifiques.",
"Remove a lead from “unsubscribe” list.": "Retirer un prospect de la liste de \"désabonnement\".",
"removes a lead from a specific campaign.": "supprime un plomb d'une campagne spécifique.",
"Unsubscribe a lead from a campaign.": "Désabonnez-vous un prospect d'une campagne.",
"Adds a lead to a specific campaign with optional enrichment and lead details.": "Ajoute un résultat à une campagne spécifique avec des détails supplémentaires sur l'enrichissement et le plomb.",
"Updates a lead in a specific campaign.": "Met à jour un chef de file dans une campagne spécifique.",
"Look up a lead by email and campaign.": "Recherchez un leader par e-mail et campagne.",
"Campaign": "Campagnes",
"Lead Email": "Courriel du prospect",
"First Name": "First Name",
"Last Name": "Last Name",
"Picture URL": "URL de l'image",
"Phone": "Téléphone",
"LinkedIn URL": "LinkedIn URL",
"Company Name": "Nom de lentreprise",
"Company Domain": "Domaine de la société",
"Icebreaker": "Icebreaker",
"Job Title": "Titre du poste",
"Deduplicate": "Deduplicate",
"LinkedIn Enrichment": "Enrichissement LinkedIn",
"Find Email": "Trouver un e-mail",
"Verify Email": "Vérifier l'e-mail",
"Find Phone": "Trouver le téléphone",
"Select a campaign": "Sélectionnez une campagne",
"The email of the lead to mark as interested.": "Le courriel du plomb à marquer comme intéressé.",
"The email of the lead to mark as not interested.": "Le courriel du plomb à marquer comme non intéressé.",
"Select a campaign (optional)": "Sélectionnez une campagne (facultatif)",
"The email of the lead to pause.": "L'e-mail de la piste à mettre en pause.",
"The email of the lead to resume.": "Le courriel de la conduite à la reprise.",
"The email of the lead to remove from the unsubscribe list.": "L'e-mail du prospect à supprimer de la liste de désinscription.",
"The email of the lead to remove.": "L'e-mail de la piste à supprimer.",
"The email of the lead to unsubscribe.": "L'e-mail du conduit à se désabonner.",
"The email of the lead to add": "L'e-mail du prospect à ajouter",
"Avoid adding the lead if it already exists in any campaign": "Éviter d'ajouter le prospect s'il existe déjà dans une campagne",
"Run LinkedIn enrichment for this lead": "Exécuter l'enrichissement LinkedIn pour ce prospect",
"Try to find a verified email for this lead": "Essayez de trouver un e-mail vérifié pour ce prospect",
"Verify the leads email using debounce": "Vérifiez l'email du prospect en utilisant debounce",
"Try to find a phone number for this lead": "Essayez de trouver un numéro de téléphone pour ce prospect",
"The email of the lead to update.": "L'e-mail de la conduite à mettre à jour.",
"The email of the lead to look up": "L'e-mail du prospect à rechercher",
"New Activity": "Nouvelle activité",
"Unsubscribed Recipient": "Destinataire désabonné",
"Triggers for each new activity.": "Déclencheurs pour chaque nouvelle activité.",
"Triggers when a recipient unsubscribes.": "Déclenche lorsqu'un destinataire se désabonne."
}

View File

@@ -0,0 +1,64 @@
{
"Enter your Lemlist API key": "レムリストAPIキーを入力してください",
"Mark Lead From One Campaign as Interested": "1つのキャンペーンからリードを興味があるとマークする",
"Mark Lead From One Campaign as Not Interested": "1つのキャンペーンからリードを興味がないとマークする",
"Mark Lead From All Campaign as Interested": "すべてのキャンペーンからリードを興味があるとしてマーク",
"Mark Lead From All Campaigns as Not Interested": "すべてのキャンペーンからリードを非興味としてマーク",
"Pause Lead From All or Specific Campaigns": "すべてまたは特定のキャンペーンからのリードを一時停止",
"Resume Lead From All or Specific Campaigns": "すべてまたは特定のキャンペーンからリードを再開",
"Remove Lead From Unsubscribe List": "購読解除リストからリードを削除",
"Remove Lead from A Campaign": "キャンペーンからリードを削除",
"Unsubscribe a Lead": "リードの購読を解除",
"Add Lead To A Campaign": "キャンペーンにリードを追加",
"Update Lead From Campaign": "キャンペーンからリードを更新",
"Search Lead": "リードを検索",
"Mark a lead in a campaign as interested.": "キャンペーンのリードを興味があるとマークします。",
"Mark a lead in a campaign as not interested.": "興味のないキャンペーンでリードをマークします。",
"Mark a lead as “interested” across all campaigns.": "すべてのキャンペーンでリードを「興味がある」としてマークします。",
"Mark a lead as “not interested” across all campaigns.": "すべてのキャンペーンでリードを「興味がない」としてマークします。",
"Pause a leads outreach across all or specific campaigns.": "すべてまたは特定のキャンペーンでリードのアウトリーチを一時停止します。",
"Resume a leads outreach across all or specific campaigns.": "すべてまたは特定のキャンペーンでリードのアウトリーチを再開します。",
"Remove a lead from “unsubscribe” list.": "「購読解除」リストからリードを削除します。",
"removes a lead from a specific campaign.": "特定のキャンペーンのリードを削除します",
"Unsubscribe a lead from a campaign.": "キャンペーンのリードを購読解除します。",
"Adds a lead to a specific campaign with optional enrichment and lead details.": "オプションのエンリッチメントとリードの詳細を含む特定のキャンペーンにリードを追加します。",
"Updates a lead in a specific campaign.": "特定のキャンペーンのリードを更新します。",
"Look up a lead by email and campaign.": "メールとキャンペーンでリードを探します。",
"Campaign": "キャンペーン",
"Lead Email": "見込み客のメール",
"First Name": "名",
"Last Name": "姓",
"Picture URL": "画像 URL",
"Phone": "電話番号",
"LinkedIn URL": "LinkedIn URL",
"Company Name": "会社名",
"Company Domain": "会社ドメイン",
"Icebreaker": "Icebreaker",
"Job Title": "役職名",
"Deduplicate": "Deduplicate",
"LinkedIn Enrichment": "LinkedIn Enrichment",
"Find Email": "電子メールを検索",
"Verify Email": "メールアドレスを確認する",
"Find Phone": "電話番号を検索",
"Select a campaign": "キャンペーンを選択",
"The email of the lead to mark as interested.": "興味があるとマークするリードの電子メール。",
"The email of the lead to mark as not interested.": "興味がないとマークするリードの電子メール。",
"Select a campaign (optional)": "キャンペーンを選択 (オプション)",
"The email of the lead to pause.": "一時停止するリードのメール。",
"The email of the lead to resume.": "再開するリードの電子メール。",
"The email of the lead to remove from the unsubscribe list.": "購読解除リストから削除するリードのメール。",
"The email of the lead to remove.": "削除するリードのメール。",
"The email of the lead to unsubscribe.": "購読を解除するリードのEメール。",
"The email of the lead to add": "追加するリードのメールアドレス",
"Avoid adding the lead if it already exists in any campaign": "キャンペーンに既に存在する場合はリードを追加しないでください",
"Run LinkedIn enrichment for this lead": "このリードのLinkedInエンリッチメントを実行",
"Try to find a verified email for this lead": "このリードの確認済みメールを探してみてください",
"Verify the leads email using debounce": "デバウンスを使用してリードのメールを確認する",
"Try to find a phone number for this lead": "このリードの電話番号を見つけてみてください",
"The email of the lead to update.": "更新するリードのメール。",
"The email of the lead to look up": "検索する見込み客のメールアドレス",
"New Activity": "新しいアクティビティ",
"Unsubscribed Recipient": "未購読の受信者",
"Triggers for each new activity.": "新しいアクティビティごとにトリガーします。",
"Triggers when a recipient unsubscribes.": "受信者が購読を解除したときにトリガーします。"
}

View File

@@ -0,0 +1,64 @@
{
"Enter your Lemlist API key": "Voer uw Lemlist API-sleutel in",
"Mark Lead From One Campaign as Interested": "Markeer Lead van één campagne als geïnteresseerd",
"Mark Lead From One Campaign as Not Interested": "Markeer Lead van één campagne als niet interessant",
"Mark Lead From All Campaign as Interested": "Markeer Lead van alle campagne als interessant",
"Mark Lead From All Campaigns as Not Interested": "Markeer voorsprong van alle campagnes als niet interessant",
"Pause Lead From All or Specific Campaigns": "Pauzeer Lead van alle of specifieke campagnes",
"Resume Lead From All or Specific Campaigns": "Hervat Lead van alles of specifieke campagnes",
"Remove Lead From Unsubscribe List": "Verwijder Lead uit de afmeldlijst",
"Remove Lead from A Campaign": "Verwijder Lead uit een Campagne",
"Unsubscribe a Lead": "Een Lead uitschrijven",
"Add Lead To A Campaign": "Voeg Lead toe aan een Campagne",
"Update Lead From Campaign": "Update Lead Uit Campagne",
"Search Lead": "Zoek Lead",
"Mark a lead in a campaign as interested.": "Markeer een voorsprong in een campagne als geïnteresseerd.",
"Mark a lead in a campaign as not interested.": "Markeer een voorsprong in een campagne als niet geïnteresseerd.",
"Mark a lead as “interested” across all campaigns.": "Markeer een voorsprong als \"interessant\" over alle campagnes.",
"Mark a lead as “not interested” across all campaigns.": "Markeer een voorsprong als “niet geïnteresseerd” over alle campagnes.",
"Pause a leads outreach across all or specific campaigns.": "Onderbreek het outreach van een lead over alle of specifieke campagnes.",
"Resume a leads outreach across all or specific campaigns.": "Hervat het outreach van een leidraad over alle of specifieke campagnes.",
"Remove a lead from “unsubscribe” list.": "Verwijder een lead uit de \"uitschrijving\" lijst.",
"removes a lead from a specific campaign.": "verwijdert een lead uit een specifieke campagne.",
"Unsubscribe a lead from a campaign.": "Een voorsprong afmelden voor een campagne.",
"Adds a lead to a specific campaign with optional enrichment and lead details.": "Voegt een lead toe aan een specifieke campagne met optionele verrijking en looddetails.",
"Updates a lead in a specific campaign.": "Werkt een lead bij in een specifieke campagne.",
"Look up a lead by email and campaign.": "Zoek een voorsprong op via e-mail en campagne.",
"Campaign": "Campagne",
"Lead Email": "Lead e-mail",
"First Name": "Voornaam",
"Last Name": "Achternaam",
"Picture URL": "URL afbeelding",
"Phone": "Telefoonnummer",
"LinkedIn URL": "LinkedIn URL",
"Company Name": "Bedrijfsnaam",
"Company Domain": "Bedrijfsdomein",
"Icebreaker": "Icebreaker",
"Job Title": "Job titel",
"Deduplicate": "Deduplicate",
"LinkedIn Enrichment": "LinkedIn verrijking",
"Find Email": "Zoek e-mail",
"Verify Email": "Bevestig e-mailadres",
"Find Phone": "Telefoon zoeken",
"Select a campaign": "Selecteer een campagne",
"The email of the lead to mark as interested.": "De e-mail van de lead om te markeren als geïnteresseerd.",
"The email of the lead to mark as not interested.": "De e-mail van de lead om te markeren als niet geïnteresseerd.",
"Select a campaign (optional)": "Selecteer een campagne (optioneel)",
"The email of the lead to pause.": "De e-mail van de lead om te pauzeren.",
"The email of the lead to resume.": "De e-mail van de lead om te hervatten.",
"The email of the lead to remove from the unsubscribe list.": "De e-mail van de lead om uit de afmeldlijst te verwijderen.",
"The email of the lead to remove.": "De e-mail van de te verwijderen lead",
"The email of the lead to unsubscribe.": "De e-mail van de lead die u wilt uitschrijven.",
"The email of the lead to add": "De e-mail van de toe te voegen lead",
"Avoid adding the lead if it already exists in any campaign": "Vermijd het toevoegen van de lead als deze al bestaat in een campagne",
"Run LinkedIn enrichment for this lead": "Start LinkedIn verrijking voor deze lead",
"Try to find a verified email for this lead": "Probeer een geverifieerde e-mail te vinden voor deze lead",
"Verify the leads email using debounce": "Verifieer de lead e-mail met behulp van debounces",
"Try to find a phone number for this lead": "Probeer een telefoonnummer te vinden voor deze lead",
"The email of the lead to update.": "De e-mail van de lead om bij te werken.",
"The email of the lead to look up": "De e-mail van de lead om op te zoeken",
"New Activity": "Nieuwe activiteit",
"Unsubscribed Recipient": "Ontvanger uitgeschreven",
"Triggers for each new activity.": "Triggert voor elke nieuwe activiteit.",
"Triggers when a recipient unsubscribes.": "Triggert wanneer een ontvanger zich uitschrijft."
}

View File

@@ -0,0 +1,64 @@
{
"Enter your Lemlist API key": "Digite sua chave de API do Lemlist",
"Mark Lead From One Campaign as Interested": "Marcar Lead de uma campanha como Interessado",
"Mark Lead From One Campaign as Not Interested": "Marcar Lead de uma campanha como Não Interessado",
"Mark Lead From All Campaign as Interested": "Marcar Potencial de Todas as Campanhas como Interessado",
"Mark Lead From All Campaigns as Not Interested": "Marcar Potencial de Todas as Campanhas, como Não Interessado",
"Pause Lead From All or Specific Campaigns": "Pausar Lead de todas ou campanhas específicas",
"Resume Lead From All or Specific Campaigns": "Retomar Lead de Todas ou Campanhas Específicas",
"Remove Lead From Unsubscribe List": "Remover Lead de Lista de Desinscrever",
"Remove Lead from A Campaign": "Remover Lead de uma Campanha",
"Unsubscribe a Lead": "Cancelar inscrição de um Lead",
"Add Lead To A Campaign": "Adicionar Lead a Uma Campanha",
"Update Lead From Campaign": "Atualizar Lead de Campanha",
"Search Lead": "Buscar Potencial",
"Mark a lead in a campaign as interested.": "Marque uma liderança em uma campanha como interessada.",
"Mark a lead in a campaign as not interested.": "Marque uma liderança em uma campanha como não interessada.",
"Mark a lead as “interested” across all campaigns.": "Marque uma liderança como \"interessada\" em todas as campanhas.",
"Mark a lead as “not interested” across all campaigns.": "Marque uma liderança como \"não interessada\" em todas as campanhas.",
"Pause a leads outreach across all or specific campaigns.": "Pausa a divulgação de um líder em todas ou campanhas específicas.",
"Resume a leads outreach across all or specific campaigns.": "Retomar o alcance de um líder em todas ou campanhas específicas.",
"Remove a lead from “unsubscribe” list.": "Remover lead da lista de \"cancelar inscrição\".",
"removes a lead from a specific campaign.": "remove um líder de uma campanha específica.",
"Unsubscribe a lead from a campaign.": "Cancelar assinatura de uma iniciativa de uma campanha.",
"Adds a lead to a specific campaign with optional enrichment and lead details.": "Adiciona um lead a uma campanha específica com enriquecimento opcional e detalhes do chumbo.",
"Updates a lead in a specific campaign.": "Atualiza um potencial em uma campanha específica.",
"Look up a lead by email and campaign.": "Procure um líder por e-mail e campanha.",
"Campaign": "Campanha",
"Lead Email": "Email do lead",
"First Name": "Nome",
"Last Name": "Sobrenome",
"Picture URL": "URL da imagem",
"Phone": "Smartphone",
"LinkedIn URL": "LinkedIn URL",
"Company Name": "Nome da Empresa",
"Company Domain": "Domínio da empresa",
"Icebreaker": "Icebreaker",
"Job Title": "Título do Cargo",
"Deduplicate": "Deduplicate",
"LinkedIn Enrichment": "Enriquecimento no LinkedIn",
"Find Email": "Encontrar E-mail",
"Verify Email": "Verificar e-mail",
"Find Phone": "Localizar Telefone",
"Select a campaign": "Selecione a campanha",
"The email of the lead to mark as interested.": "O e-mail do Lead para marcar como interessado.",
"The email of the lead to mark as not interested.": "O e-mail do lead para marcar como não interessado.",
"Select a campaign (optional)": "Selecione uma campanha (opcional)",
"The email of the lead to pause.": "O e-mail do Lead para pausa.",
"The email of the lead to resume.": "O e-mail do Lead a retomar.",
"The email of the lead to remove from the unsubscribe list.": "O e-mail do Lead para remover da lista de cancelamento.",
"The email of the lead to remove.": "O e-mail do Lead a remover.",
"The email of the lead to unsubscribe.": "O e-mail do Lead para cancelar a assinatura.",
"The email of the lead to add": "O e-mail do Lead a adicionar",
"Avoid adding the lead if it already exists in any campaign": "Evite adicionar o lead se ele já existe em qualquer campanha",
"Run LinkedIn enrichment for this lead": "Executar enriquecimento do LinkedIn para esta vantagem",
"Try to find a verified email for this lead": "Tente encontrar um e-mail verificado para este lead",
"Verify the leads email using debounce": "Verifique o e-mail do cliente usando a mensagem debounce",
"Try to find a phone number for this lead": "Tentar encontrar um número de telefone para este lead",
"The email of the lead to update.": "O e-mail do Lead para atualização.",
"The email of the lead to look up": "O e-mail do Lead para procurar",
"New Activity": "Nova atividade",
"Unsubscribed Recipient": "Destinatário não inscrito",
"Triggers for each new activity.": "Gatilhos para cada nova atividade.",
"Triggers when a recipient unsubscribes.": "Aciona quando um destinatário cancela."
}

View File

@@ -0,0 +1,64 @@
{
"Enter your Lemlist API key": "Enter your Lemlist API key",
"Mark Lead From One Campaign as Interested": "Mark Lead From One Campaign as Interested",
"Mark Lead From One Campaign as Not Interested": "Mark Lead From One Campaign as Not Interested",
"Mark Lead From All Campaign as Interested": "Mark Lead From All Campaign as Interested",
"Mark Lead From All Campaigns as Not Interested": "Mark Lead From All Campaigns as Not Interested",
"Pause Lead From All or Specific Campaigns": "Pause Lead From All or Specific Campaigns",
"Resume Lead From All or Specific Campaigns": "Resume Lead From All or Specific Campaigns",
"Remove Lead From Unsubscribe List": "Remove Lead From Unsubscribe List",
"Remove Lead from A Campaign": "Remove Lead from A Campaign",
"Unsubscribe a Lead": "Unsubscribe a Lead",
"Add Lead To A Campaign": "Add Lead To A Campaign",
"Update Lead From Campaign": "Update Lead From Campaign",
"Search Lead": "Search Lead",
"Mark a lead in a campaign as interested.": "Mark a lead in a campaign as interested.",
"Mark a lead in a campaign as not interested.": "Mark a lead in a campaign as not interested.",
"Mark a lead as “interested” across all campaigns.": "Mark a lead as “interested” across all campaigns.",
"Mark a lead as “not interested” across all campaigns.": "Mark a lead as “not interested” across all campaigns.",
"Pause a leads outreach across all or specific campaigns.": "Pause a leads outreach across all or specific campaigns.",
"Resume a leads outreach across all or specific campaigns.": "Resume a leads outreach across all or specific campaigns.",
"Remove a lead from “unsubscribe” list.": "Remove a lead from “unsubscribe” list.",
"removes a lead from a specific campaign.": "removes a lead from a specific campaign.",
"Unsubscribe a lead from a campaign.": "Unsubscribe a lead from a campaign.",
"Adds a lead to a specific campaign with optional enrichment and lead details.": "Adds a lead to a specific campaign with optional enrichment and lead details.",
"Updates a lead in a specific campaign.": "Updates a lead in a specific campaign.",
"Look up a lead by email and campaign.": "Look up a lead by email and campaign.",
"Campaign": "Campaign",
"Lead Email": "Lead Email",
"First Name": "First Name",
"Last Name": "Last Name",
"Picture URL": "Picture URL",
"Phone": "Phone",
"LinkedIn URL": "LinkedIn URL",
"Company Name": "Company Name",
"Company Domain": "Company Domain",
"Icebreaker": "Icebreaker",
"Job Title": "Job Title",
"Deduplicate": "Deduplicate",
"LinkedIn Enrichment": "LinkedIn Enrichment",
"Find Email": "Find Email",
"Verify Email": "Verify Email",
"Find Phone": "Find Phone",
"Select a campaign": "Select a campaign",
"The email of the lead to mark as interested.": "The email of the lead to mark as interested.",
"The email of the lead to mark as not interested.": "The email of the lead to mark as not interested.",
"Select a campaign (optional)": "Select a campaign (optional)",
"The email of the lead to pause.": "The email of the lead to pause.",
"The email of the lead to resume.": "The email of the lead to resume.",
"The email of the lead to remove from the unsubscribe list.": "The email of the lead to remove from the unsubscribe list.",
"The email of the lead to remove.": "The email of the lead to remove.",
"The email of the lead to unsubscribe.": "The email of the lead to unsubscribe.",
"The email of the lead to add": "The email of the lead to add",
"Avoid adding the lead if it already exists in any campaign": "Avoid adding the lead if it already exists in any campaign",
"Run LinkedIn enrichment for this lead": "Run LinkedIn enrichment for this lead",
"Try to find a verified email for this lead": "Try to find a verified email for this lead",
"Verify the leads email using debounce": "Verify the leads email using debounce",
"Try to find a phone number for this lead": "Try to find a phone number for this lead",
"The email of the lead to update.": "The email of the lead to update.",
"The email of the lead to look up": "The email of the lead to look up",
"New Activity": "New Activity",
"Unsubscribed Recipient": "Unsubscribed Recipient",
"Triggers for each new activity.": "Triggers for each new activity.",
"Triggers when a recipient unsubscribes.": "Triggers when a recipient unsubscribes."
}

View File

@@ -0,0 +1,64 @@
{
"Enter your Lemlist API key": "Enter your Lemlist API key",
"Mark Lead From One Campaign as Interested": "Mark Lead From One Campaign as Interested",
"Mark Lead From One Campaign as Not Interested": "Mark Lead From One Campaign as Not Interested",
"Mark Lead From All Campaign as Interested": "Mark Lead From All Campaign as Interested",
"Mark Lead From All Campaigns as Not Interested": "Mark Lead From All Campaigns as Not Interested",
"Pause Lead From All or Specific Campaigns": "Pause Lead From All or Specific Campaigns",
"Resume Lead From All or Specific Campaigns": "Resume Lead From All or Specific Campaigns",
"Remove Lead From Unsubscribe List": "Remove Lead From Unsubscribe List",
"Remove Lead from A Campaign": "Remove Lead from A Campaign",
"Unsubscribe a Lead": "Unsubscribe a Lead",
"Add Lead To A Campaign": "Add Lead To A Campaign",
"Update Lead From Campaign": "Update Lead From Campaign",
"Search Lead": "Search Lead",
"Mark a lead in a campaign as interested.": "Mark a lead in a campaign as interested.",
"Mark a lead in a campaign as not interested.": "Mark a lead in a campaign as not interested.",
"Mark a lead as “interested” across all campaigns.": "Mark a lead as “interested” across all campaigns.",
"Mark a lead as “not interested” across all campaigns.": "Mark a lead as “not interested” across all campaigns.",
"Pause a leads outreach across all or specific campaigns.": "Pause a leads outreach across all or specific campaigns.",
"Resume a leads outreach across all or specific campaigns.": "Resume a leads outreach across all or specific campaigns.",
"Remove a lead from “unsubscribe” list.": "Remove a lead from “unsubscribe” list.",
"removes a lead from a specific campaign.": "removes a lead from a specific campaign.",
"Unsubscribe a lead from a campaign.": "Unsubscribe a lead from a campaign.",
"Adds a lead to a specific campaign with optional enrichment and lead details.": "Adds a lead to a specific campaign with optional enrichment and lead details.",
"Updates a lead in a specific campaign.": "Updates a lead in a specific campaign.",
"Look up a lead by email and campaign.": "Look up a lead by email and campaign.",
"Campaign": "Campaign",
"Lead Email": "Lead Email",
"First Name": "名字",
"Last Name": "名字",
"Picture URL": "Picture URL",
"Phone": "Phone",
"LinkedIn URL": "LinkedIn URL",
"Company Name": "Company Name",
"Company Domain": "Company Domain",
"Icebreaker": "Icebreaker",
"Job Title": "Job Title",
"Deduplicate": "Deduplicate",
"LinkedIn Enrichment": "LinkedIn Enrichment",
"Find Email": "Find Email",
"Verify Email": "Verify Email",
"Find Phone": "Find Phone",
"Select a campaign": "Select a campaign",
"The email of the lead to mark as interested.": "The email of the lead to mark as interested.",
"The email of the lead to mark as not interested.": "The email of the lead to mark as not interested.",
"Select a campaign (optional)": "Select a campaign (optional)",
"The email of the lead to pause.": "The email of the lead to pause.",
"The email of the lead to resume.": "The email of the lead to resume.",
"The email of the lead to remove from the unsubscribe list.": "The email of the lead to remove from the unsubscribe list.",
"The email of the lead to remove.": "The email of the lead to remove.",
"The email of the lead to unsubscribe.": "The email of the lead to unsubscribe.",
"The email of the lead to add": "The email of the lead to add",
"Avoid adding the lead if it already exists in any campaign": "Avoid adding the lead if it already exists in any campaign",
"Run LinkedIn enrichment for this lead": "Run LinkedIn enrichment for this lead",
"Try to find a verified email for this lead": "Try to find a verified email for this lead",
"Verify the leads email using debounce": "Verify the leads email using debounce",
"Try to find a phone number for this lead": "Try to find a phone number for this lead",
"The email of the lead to update.": "The email of the lead to update.",
"The email of the lead to look up": "The email of the lead to look up",
"New Activity": "New Activity",
"Unsubscribed Recipient": "Unsubscribed Recipient",
"Triggers for each new activity.": "Triggers for each new activity.",
"Triggers when a recipient unsubscribes.": "Triggers when a recipient unsubscribes."
}

View File

@@ -0,0 +1,39 @@
import { createPiece, PieceAuth } from '@activepieces/pieces-framework';
import { lemlistAuth } from './lib/common/constants';
import { newActivity } from './lib/triggers/new-activity';
import { unsubscribedRecipient } from './lib/triggers/unsubscribed-recipient';
import { markLeadFromOneCampaignAsInterested } from './lib/actions/mark-lead-from-one-campaign-as-interested';
import { markLeadFromOneCampaignAsNotInterested } from './lib/actions/mark-lead-from-one-campaign-as-not-interested';
import { markLeadFromAllCampaignAsInterested } from './lib/actions/mark-lead-from-all-campaign-as-interested';
import { markLeadFromAllCampaignsAsNotInterested } from './lib/actions/mark-lead-from-all-campaigns-as-not-interested';
import { pauseLeadFromAllOrSpecificCampaigns } from './lib/actions/pause-lead-from-all-or-specific-campaigns';
import { resumeLeadFromAllOrSpecificCampaigns } from './lib/actions/resume-lead-from-all-or-specific-campaigns';
import { removeLeadFromUnsubscribeList } from './lib/actions/remove-lead-from-unsubscribe-list';
import { removeLeadFromACampaign } from './lib/actions/remove-lead-from-a-campaign';
import { unsubscribeALead } from './lib/actions/unsubscribe-a-lead';
import { addLeadToACampaign } from './lib/actions/add-lead-to-a-campaign';
import { updateLeadFromCampaign } from './lib/actions/update-lead-from-campaign';
import { searchLead } from './lib/actions/search-lead';
export const lemlist = createPiece({
displayName: 'Lemlist',
auth: lemlistAuth,
minimumSupportedRelease: '0.36.1',
logoUrl: 'https://cdn.activepieces.com/pieces/lemlist.png',
authors: ['gs03-dev'],
actions: [
markLeadFromOneCampaignAsInterested,
markLeadFromOneCampaignAsNotInterested,
markLeadFromAllCampaignAsInterested,
markLeadFromAllCampaignsAsNotInterested,
pauseLeadFromAllOrSpecificCampaigns,
resumeLeadFromAllOrSpecificCampaigns,
removeLeadFromUnsubscribeList,
removeLeadFromACampaign,
unsubscribeALead,
addLeadToACampaign,
updateLeadFromCampaign,
searchLead,
],
triggers: [newActivity, unsubscribedRecipient],
});

View File

@@ -0,0 +1,100 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { lemlistAuth } from '../common/constants';
import { campaignsDropdown } from '../common/props';
import { lemlistApiService } from '../common/requests';
export const addLeadToACampaign = createAction({
auth: lemlistAuth,
name: 'addLeadToACampaign',
displayName: 'Add Lead To A Campaign',
description:
'Adds a lead to a specific campaign with optional enrichment and lead details.',
props: {
campaignId: campaignsDropdown({ refreshers: ['auth'] }),
email: Property.ShortText({
displayName: 'Lead Email',
description: 'The email of the lead to add',
required: true,
}),
firstName: Property.ShortText({
displayName: 'First Name',
required: false,
}),
lastName: Property.ShortText({ displayName: 'Last Name', required: false }),
picture: Property.ShortText({
displayName: 'Picture URL',
required: false,
}),
phone: Property.ShortText({ displayName: 'Phone', required: false }),
linkedinUrl: Property.ShortText({
displayName: 'LinkedIn URL',
required: false,
}),
companyName: Property.ShortText({
displayName: 'Company Name',
required: false,
}),
companyDomain: Property.ShortText({
displayName: 'Company Domain',
required: false,
}),
icebreaker: Property.LongText({
displayName: 'Icebreaker',
required: false,
}),
jobTitle: Property.ShortText({ displayName: 'Job Title', required: false }),
deduplicate: Property.Checkbox({
displayName: 'Deduplicate',
description: 'Avoid adding the lead if it already exists in any campaign',
required: false,
defaultValue: false,
}),
linkedinEnrichment: Property.Checkbox({
displayName: 'LinkedIn Enrichment',
description: 'Run LinkedIn enrichment for this lead',
required: false,
defaultValue: false,
}),
findEmail: Property.Checkbox({
displayName: 'Find Email',
description: 'Try to find a verified email for this lead',
required: false,
defaultValue: false,
}),
verifyEmail: Property.Checkbox({
displayName: 'Verify Email',
description: 'Verify the leads email using debounce',
required: false,
defaultValue: false,
}),
findPhone: Property.Checkbox({
displayName: 'Find Phone',
description: 'Try to find a phone number for this lead',
required: false,
defaultValue: false,
}),
},
async run({ auth, propsValue }) {
const {
campaignId,
email,
deduplicate,
linkedinEnrichment,
findEmail,
verifyEmail,
findPhone,
...leadData
} = propsValue as any;
return await lemlistApiService.addLeadToACampaign(auth, {
campaignId,
leadEmail: email,
leadData,
deduplicate,
linkedinEnrichment,
findEmail,
verifyEmail,
findPhone,
});
},
});

View File

@@ -0,0 +1,23 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { lemlistAuth } from '../common/constants';
import { campaignsDropdown } from '../common/props';
import { lemlistApiService } from '../common/requests';
export const markLeadFromAllCampaignAsInterested = createAction({
auth: lemlistAuth,
name: 'markLeadFromAllCampaignAsInterested',
displayName: 'Mark Lead From All Campaign as Interested',
description: 'Mark a lead as “interested” across all campaigns.',
props: {
email: Property.ShortText({
displayName: 'Lead Email',
description: 'The email of the lead to mark as interested.',
required: true,
}),
},
async run({ auth, propsValue: { email } }) {
return await lemlistApiService.markLeadAsInterestedInAllCampaigns(auth, {
leadEmail: email as string,
});
},
});

View File

@@ -0,0 +1,23 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { lemlistAuth } from '../common/constants';
import { campaignsDropdown } from '../common/props';
import { lemlistApiService } from '../common/requests';
export const markLeadFromAllCampaignsAsNotInterested = createAction({
auth: lemlistAuth,
name: 'markLeadFromAllCampaignsAsNotInterested',
displayName: 'Mark Lead From All Campaigns as Not Interested',
description: 'Mark a lead as “not interested” across all campaigns.',
props: {
email: Property.ShortText({
displayName: 'Lead Email',
description: 'The email of the lead to mark as not interested.',
required: true,
}),
},
async run({ auth, propsValue: { email } }) {
return await lemlistApiService.markLeadAsNotInterestedInAllCampaigns(auth, {
leadEmail: email as string,
});
},
});

View File

@@ -0,0 +1,28 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { lemlistAuth } from '../common/constants';
import { campaignsDropdown } from '../common/props';
import { lemlistApiService } from '../common/requests';
export const markLeadFromOneCampaignAsInterested = createAction({
auth: lemlistAuth,
name: 'markLeadFromOneCampaignAsInterested',
displayName: 'Mark Lead From One Campaign as Interested',
description: 'Mark a lead in a campaign as interested.',
props: {
campaignId: campaignsDropdown({refreshers: ['auth']}),
email: Property.ShortText({
displayName: 'Lead Email',
description: 'The email of the lead to mark as interested.',
required: true,
}),
},
async run({ auth, propsValue: { campaignId, email } }) {
return await lemlistApiService.markLeadAsInterestedInCampaign(
auth,
{
campaignId: campaignId as string,
leadEmail: email as string,
}
);
},
});

View File

@@ -0,0 +1,25 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { lemlistAuth } from '../common/constants';
import { campaignsDropdown } from '../common/props';
import { lemlistApiService } from '../common/requests';
export const markLeadFromOneCampaignAsNotInterested = createAction({
auth: lemlistAuth,
name: 'markLeadFromOneCampaignAsNotInterested',
displayName: 'Mark Lead From One Campaign as Not Interested',
description: 'Mark a lead in a campaign as not interested.',
props: {
campaignId: campaignsDropdown({ refreshers: ['auth'] }),
email: Property.ShortText({
displayName: 'Lead Email',
description: 'The email of the lead to mark as not interested.',
required: true,
}),
},
async run({ auth, propsValue: { campaignId, email } }) {
return await lemlistApiService.markLeadAsNotInterestedInCampaign(auth, {
campaignId: campaignId as string,
leadEmail: email as string,
});
},
});

View File

@@ -0,0 +1,25 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { campaignsDropdown } from '../common/props';
import { lemlistAuth } from '../common/constants';
import { lemlistApiService } from '../common/requests';
export const pauseLeadFromAllOrSpecificCampaigns = createAction({
auth: lemlistAuth,
name: 'pauseLeadFromAllOrSpecificCampaigns',
displayName: 'Pause Lead From All or Specific Campaigns',
description: 'Pause a leads outreach across all or specific campaigns.',
props: {
campaignId: campaignsDropdown({ refreshers: ['auth'], required: false }),
email: Property.ShortText({
displayName: 'Lead Email',
description: 'The email of the lead to pause.',
required: true,
}),
},
async run({ auth, propsValue: { campaignId, email } }) {
return await lemlistApiService.pauseLeadInSpecificOrAllCampaigns(auth, {
campaignId: campaignId as string,
leadEmail: email as string,
});
},
});

View File

@@ -0,0 +1,25 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { lemlistAuth } from '../common/constants';
import { campaignsDropdown } from '../common/props';
import { lemlistApiService } from '../common/requests';
export const removeLeadFromACampaign = createAction({
auth: lemlistAuth,
name: 'removeLeadFromACampaign',
displayName: 'Remove Lead from A Campaign',
description: 'removes a lead from a specific campaign.',
props: {
campaignId: campaignsDropdown({ refreshers: ['auth'] }),
email: Property.ShortText({
displayName: 'Lead Email',
description: 'The email of the lead to remove.',
required: true,
}),
},
async run({ auth, propsValue: { campaignId, email } }) {
return await lemlistApiService.removeLeadFromACampaign(auth, {
campaignId: campaignId as string,
leadEmail: email as string,
});
},
});

View File

@@ -0,0 +1,22 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { lemlistAuth } from '../common/constants';
import { lemlistApiService } from '../common/requests';
export const removeLeadFromUnsubscribeList = createAction({
auth: lemlistAuth,
name: 'removeLeadFromUnsubscribeList',
displayName: 'Remove Lead From Unsubscribe List',
description: 'Remove a lead from “unsubscribe” list.',
props: {
email: Property.ShortText({
displayName: 'Lead Email',
description: 'The email of the lead to remove from the unsubscribe list.',
required: true,
}),
},
async run({ auth, propsValue: { email } }) {
return await lemlistApiService.removeLeadFromUnsubscribeList(auth, {
leadEmail: email as string,
});
},
});

View File

@@ -0,0 +1,25 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { lemlistAuth } from '../common/constants';
import { campaignsDropdown } from '../common/props';
import { lemlistApiService } from '../common/requests';
export const resumeLeadFromAllOrSpecificCampaigns = createAction({
auth: lemlistAuth,
name: 'resumeLeadFromAllOrSpecificCampaigns',
displayName: 'Resume Lead From All or Specific Campaigns',
description: 'Resume a leads outreach across all or specific campaigns.',
props: {
campaignId: campaignsDropdown({ refreshers: ['auth'], required: false }),
email: Property.ShortText({
displayName: 'Lead Email',
description: 'The email of the lead to resume.',
required: true,
}),
},
async run({ auth, propsValue: { campaignId, email } }) {
return await lemlistApiService.resumeLeadInSpecificOrAllCampaigns(auth, {
campaignId: campaignId as string,
leadEmail: email as string,
});
},
});

View File

@@ -0,0 +1,44 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { lemlistAuth } from '../common/constants';
import { campaignsDropdown } from '../common/props';
import { lemlistApiService } from '../common/requests';
export const searchLead = createAction({
auth: lemlistAuth,
name: 'searchLead',
displayName: 'Search Lead',
description: 'Look up a lead by email and campaign.',
props: {
campaignId: campaignsDropdown({ refreshers: ['auth'], required: false }),
email: Property.ShortText({
displayName: 'Lead Email',
description: 'The email of the lead to look up',
required: true,
}),
},
async run({ auth, propsValue }) {
const { email, campaignId } = propsValue as {
email: string;
campaignId: string;
};
const leads = await lemlistApiService.getLeadByEmail(auth, email);
if (!Array.isArray(leads) || leads.length === 0) {
return { found: false, message: `No leads found for ${email}` };
}
const matching = campaignId
? leads.filter((lead) => lead.campaign.id === campaignId)
: leads;
if (matching.length === 0) {
return {
found: false,
message: `Lead with email ${email} not found in campaign ${campaignId}`,
};
}
return { found: true, leads: matching };
},
});

View File

@@ -0,0 +1,25 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { lemlistAuth } from '../common/constants';
import { campaignsDropdown } from '../common/props';
import { lemlistApiService } from '../common/requests';
export const unsubscribeALead = createAction({
auth: lemlistAuth,
name: 'unsubscribeALead',
displayName: 'Unsubscribe a Lead',
description: 'Unsubscribe a lead from a campaign.',
props: {
campaignId: campaignsDropdown({ refreshers: ['auth'] }),
email: Property.ShortText({
displayName: 'Lead Email',
description: 'The email of the lead to unsubscribe.',
required: true,
}),
},
async run({ auth, propsValue: { campaignId, email } }) {
return await lemlistApiService.unsubscribeLeadFromACampaign(auth, {
campaignId: campaignId as string,
leadEmail: email as string,
});
},
});

View File

@@ -0,0 +1,60 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { lemlistAuth } from '../common/constants';
import { campaignsDropdown } from '../common/props';
import { lemlistApiService } from '../common/requests';
export const updateLeadFromCampaign = createAction({
auth: lemlistAuth,
name: 'updateLeadFromCampaign',
displayName: 'Update Lead From Campaign',
description:
'Updates a lead in a specific campaign.',
props: {
campaignId: campaignsDropdown({ refreshers: ['auth'] }),
email: Property.ShortText({
displayName: 'Lead Email',
description: 'The email of the lead to update.',
required: true,
}),
firstName: Property.ShortText({
displayName: 'First Name',
required: false,
}),
lastName: Property.ShortText({ displayName: 'Last Name', required: false }),
picture: Property.ShortText({
displayName: 'Picture URL',
required: false,
}),
phone: Property.ShortText({ displayName: 'Phone', required: false }),
linkedinUrl: Property.ShortText({
displayName: 'LinkedIn URL',
required: false,
}),
companyName: Property.ShortText({
displayName: 'Company Name',
required: false,
}),
companyDomain: Property.ShortText({
displayName: 'Company Domain',
required: false,
}),
icebreaker: Property.LongText({
displayName: 'Icebreaker',
required: false,
}),
jobTitle: Property.ShortText({ displayName: 'Job Title', required: false })
},
async run({ auth, propsValue }) {
const {
campaignId,
email,
...leadData
} = propsValue as any;
return await lemlistApiService.updateLeadFromCampaign(auth, {
campaignId,
leadEmail: email,
leadData,
});
},
});

View File

@@ -0,0 +1,38 @@
import { PieceAuth } from '@activepieces/pieces-framework';
import { lemlistApiService } from './requests';
import { AppConnectionType } from '@activepieces/shared';
export const BASE_URL = 'https://api.lemlist.com/api';
export const lemlistAuth = PieceAuth.SecretText({
displayName: 'Lemlist API Key',
description: 'Enter your Lemlist API key',
required: true,
validate: async ({ auth }) => {
try {
await lemlistApiService.fetchTeams({
secret_text: auth,
type: AppConnectionType.SECRET_TEXT
}).catch((err) => {
throw err;
});
return {
valid: true,
};
} catch (e: any) {
return {
valid: false,
error: `Auth validation error: ${e.message}`,
};
}
},
});
export const API_ENDPOINTS = {
TEAM: '/team',
HOOKS: '/hooks',
CAMPAIGNS: '/campaigns',
LEADS: '/leads',
UNSUBSCRIBES: '/unsubscribes',
};

View File

@@ -0,0 +1,46 @@
import { Property } from '@activepieces/pieces-framework';
import { lemlistApiService } from './requests';
import { lemlistAuth } from './constants';
export const campaignsDropdown = ({
refreshers,
required = true,
}: {
refreshers: string[];
required?: boolean;
}) =>
Property.Dropdown({
auth: lemlistAuth,
displayName: 'Campaign',
description: required
? 'Select a campaign'
: 'Select a campaign (optional)',
required,
refreshers,
async options({ auth }: any) {
if (!auth) {
return {
disabled: true,
placeholder: 'Connect your Lemlist account first',
options: [],
};
}
try {
const campaigns = await lemlistApiService.fetchCampaigns(auth);
return {
options: campaigns.map((c: any) => ({
label: c.name,
value: c._id,
})),
};
} catch (e) {
console.error('Failed to fetch campaigns', e);
return {
options: [],
placeholder: 'Unable to load campaigns',
};
}
},
});

View File

@@ -0,0 +1,244 @@
import {
AuthenticationType,
HttpMethod,
httpClient,
} from '@activepieces/pieces-common';
import { API_ENDPOINTS, BASE_URL } from './constants';
import { AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework';
import { lemlistAuth } from './constants';
async function fireHttpRequest({
method,
path,
auth,
body,
}: {
method: HttpMethod;
path: string;
auth: string;
body?: unknown;
}) {
return await httpClient
.sendRequest({
method,
url: `${BASE_URL}${path}`,
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body,
authentication: {
type: AuthenticationType.BASIC,
username: '',
password: auth,
},
})
.then((res) => res.body);
}
export const lemlistApiService = {
async fetchTeams(auth: AppConnectionValueForAuthProperty<typeof lemlistAuth>) {
return await fireHttpRequest({
path: `${API_ENDPOINTS.TEAM}`,
method: HttpMethod.GET,
auth: auth.secret_text,
});
},
async getLeadByEmail(auth: AppConnectionValueForAuthProperty<typeof lemlistAuth>, email: string) {
return await fireHttpRequest({
path: `${API_ENDPOINTS.LEADS}/${email}?version=v2`,
method: HttpMethod.GET,
auth: auth.secret_text,
});
},
async fetchCampaigns(auth: string) {
const response = await fireHttpRequest({
path: `${API_ENDPOINTS.CAMPAIGNS}?version=v2&sortBy=createdAt&sortOrder=desc`,
method: HttpMethod.GET,
auth,
});
return response.campaigns;
},
async removeLeadFromACampaign(
auth: AppConnectionValueForAuthProperty<typeof lemlistAuth>,
{ campaignId, leadEmail }: { campaignId: string; leadEmail: string }
) {
const response = await fireHttpRequest({
path: `${API_ENDPOINTS.CAMPAIGNS}/${campaignId}${API_ENDPOINTS.LEADS}/${leadEmail}?action=remove`,
method: HttpMethod.DELETE,
auth: auth.secret_text,
});
return response;
},
async addLeadToACampaign(
auth: AppConnectionValueForAuthProperty<typeof lemlistAuth>,
{
campaignId,
leadEmail,
leadData,
deduplicate,
linkedinEnrichment,
findEmail,
verifyEmail,
findPhone,
}: {
campaignId: string;
leadEmail: string;
leadData?: Record<string, unknown>;
deduplicate?: boolean;
linkedinEnrichment?: boolean;
findEmail?: boolean;
verifyEmail?: boolean;
findPhone?: boolean;
}
) {
const queryParams = new URLSearchParams();
if (deduplicate) queryParams.append('deduplicate', 'true');
if (linkedinEnrichment) queryParams.append('linkedinEnrichment', 'true');
if (findEmail) queryParams.append('findEmail', 'true');
if (verifyEmail) queryParams.append('verifyEmail', 'true');
if (findPhone) queryParams.append('findPhone', 'true');
const query = queryParams.toString() ? `?${queryParams.toString()}` : '';
const response = await fireHttpRequest({
path: `${API_ENDPOINTS.CAMPAIGNS}/${campaignId}${API_ENDPOINTS.LEADS}/${leadEmail}${query}`,
method: HttpMethod.POST,
auth: auth.secret_text,
body: leadData,
});
return response;
},
async updateLeadFromCampaign(
auth: AppConnectionValueForAuthProperty<typeof lemlistAuth>,
{
campaignId,
leadEmail,
leadData,
}: {
campaignId: string;
leadEmail: string;
leadData?: Record<string, unknown>;
}
) {
const response = await fireHttpRequest({
path: `${API_ENDPOINTS.CAMPAIGNS}/${campaignId}${API_ENDPOINTS.LEADS}/${leadEmail}`,
method: HttpMethod.PATCH,
auth: auth.secret_text,
body: leadData,
});
return response;
},
async unsubscribeLeadFromACampaign(
auth: AppConnectionValueForAuthProperty<typeof lemlistAuth>,
{ campaignId, leadEmail }: { campaignId: string; leadEmail: string }
) {
const response = await fireHttpRequest({
path: `${API_ENDPOINTS.CAMPAIGNS}/${campaignId}${API_ENDPOINTS.LEADS}/${leadEmail}`,
method: HttpMethod.DELETE,
auth: auth.secret_text,
});
return response;
},
async markLeadAsInterestedInCampaign(
auth: AppConnectionValueForAuthProperty<typeof lemlistAuth>,
{ campaignId, leadEmail }: { campaignId: string; leadEmail: string }
) {
const response = await fireHttpRequest({
path: `${API_ENDPOINTS.CAMPAIGNS}/${campaignId}${API_ENDPOINTS.LEADS}/${leadEmail}/interested`,
method: HttpMethod.POST,
auth: auth.secret_text,
});
return response;
},
async markLeadAsInterestedInAllCampaigns(
auth: AppConnectionValueForAuthProperty<typeof lemlistAuth>,
{ leadEmail }: { leadEmail: string }
) {
const response = await fireHttpRequest({
path: `${API_ENDPOINTS.LEADS}/interested/${leadEmail}`,
method: HttpMethod.POST,
auth: auth.secret_text,
});
return response;
},
async markLeadAsNotInterestedInAllCampaigns(
auth: AppConnectionValueForAuthProperty<typeof lemlistAuth>,
{ leadEmail }: { leadEmail: string }
) {
const response = await fireHttpRequest({
path: `${API_ENDPOINTS.LEADS}/notinterested/${leadEmail}`,
method: HttpMethod.POST,
auth: auth.secret_text,
});
return response;
},
async markLeadAsNotInterestedInCampaign(
auth: AppConnectionValueForAuthProperty<typeof lemlistAuth>,
{ campaignId, leadEmail }: { campaignId: string; leadEmail: string }
) {
const response = await fireHttpRequest({
path: `${API_ENDPOINTS.CAMPAIGNS}/${campaignId}${API_ENDPOINTS.LEADS}/${leadEmail}/notinterested`,
method: HttpMethod.POST,
auth: auth.secret_text,
});
return response;
},
async pauseLeadInSpecificOrAllCampaigns(
auth: AppConnectionValueForAuthProperty<typeof lemlistAuth>,
{ campaignId, leadEmail }: { campaignId?: string; leadEmail: string }
) {
const query = campaignId ? `?campaignId=${campaignId}` : '';
const response = await fireHttpRequest({
path: `${API_ENDPOINTS.LEADS}/pause/${leadEmail}${query}`,
method: HttpMethod.POST,
auth: auth.secret_text,
});
return response;
},
async resumeLeadInSpecificOrAllCampaigns(
auth: AppConnectionValueForAuthProperty<typeof lemlistAuth>,
{ campaignId, leadEmail }: { campaignId?: string; leadEmail: string }
) {
const query = campaignId ? `?campaignId=${campaignId}` : '';
const response = await fireHttpRequest({
path: `${API_ENDPOINTS.LEADS}/start/${leadEmail}${query}`,
method: HttpMethod.POST,
auth: auth.secret_text,
});
return response;
},
async removeLeadFromUnsubscribeList(
auth: AppConnectionValueForAuthProperty<typeof lemlistAuth>,
{ leadEmail }: { leadEmail: string }
) {
const response = await fireHttpRequest({
path: `${API_ENDPOINTS.UNSUBSCRIBES}/${leadEmail}`,
method: HttpMethod.DELETE,
auth: auth.secret_text,
});
return response;
},
async createWebhook(auth: AppConnectionValueForAuthProperty<typeof lemlistAuth>, payload: any) {
return await fireHttpRequest({
path: `${API_ENDPOINTS.HOOKS}`,
method: HttpMethod.POST,
auth: auth.secret_text,
body: payload,
});
},
async deleteWebhook(auth: AppConnectionValueForAuthProperty<typeof lemlistAuth>, webhookId: string) {
return await fireHttpRequest({
path: `${API_ENDPOINTS.HOOKS}/${webhookId}`,
method: HttpMethod.DELETE,
auth: auth.secret_text,
});
},
};

View File

@@ -0,0 +1,38 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { lemlistAuth } from '../common/constants';
import { lemlistApiService } from '../common/requests';
const CACHE_KEY = 'lemlist_new_activity_trigger_key';
export const newActivity = createTrigger({
auth: lemlistAuth,
name: 'newActivity',
displayName: 'New Activity',
description: 'Triggers for each new activity.',
props: {},
sampleData: {},
type: TriggerStrategy.WEBHOOK,
async onEnable(context) {
const response = await lemlistApiService.createWebhook(context.auth, {
targetUrl: context.webhookUrl,
});
await context.store.put(CACHE_KEY, {
webhookId: response._id,
});
},
async onDisable(context) {
const cachedWebhookData: any = await context.store.get(CACHE_KEY);
if (cachedWebhookData) {
await lemlistApiService
.deleteWebhook(context.auth, cachedWebhookData.webhookId)
.then(async () => {
await context.store.delete(CACHE_KEY);
});
}
},
async run(context) {
return [context.payload.body];
},
});

View File

@@ -0,0 +1,39 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { lemlistAuth } from '../common/constants';
import { lemlistApiService } from '../common/requests';
const CACHE_KEY = 'lemlist_unsubscribed_recipient_trigger_key';
export const unsubscribedRecipient = createTrigger({
auth: lemlistAuth,
name: 'unsubscribedRecipient',
displayName: 'Unsubscribed Recipient',
description: 'Triggers when a recipient unsubscribes.',
props: {},
sampleData: {},
type: TriggerStrategy.WEBHOOK,
async onEnable(context) {
const response = await lemlistApiService.createWebhook(context.auth, {
targetUrl: context.webhookUrl,
type: 'emailsUnsubscribed',
});
await context.store.put(CACHE_KEY, {
webhookId: response._id,
});
},
async onDisable(context) {
const cachedWebhookData: any = await context.store.get(CACHE_KEY);
if (cachedWebhookData) {
await lemlistApiService
.deleteWebhook(context.auth, cachedWebhookData.webhookId)
.then(async () => {
await context.store.delete(CACHE_KEY);
});
}
},
async run(context) {
return [context.payload.body];
},
});

View File

@@ -0,0 +1,20 @@
{
"extends": "../../../../tsconfig.base.json",
"compilerOptions": {
"module": "commonjs",
"forceConsistentCasingInFileNames": true,
"strict": true,
"importHelpers": true,
"noImplicitOverride": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"noPropertyAccessFromIndexSignature": true
},
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
}
]
}

View File

@@ -0,0 +1,9 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../../../dist/out-tsc",
"declaration": true,
"types": ["node"]
},
"include": ["src/**/*.ts"]
}