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-clickfunnels
This library was generated with [Nx](https://nx.dev).
## Building
Run `nx build pieces-clickfunnels` to build the library.

View File

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

View File

@@ -0,0 +1,65 @@
{
"name": "pieces-clickfunnels",
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "packages/pieces/community/clickfunnels/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/clickfunnels",
"tsConfig": "packages/pieces/community/clickfunnels/tsconfig.lib.json",
"packageJson": "packages/pieces/community/clickfunnels/package.json",
"main": "packages/pieces/community/clickfunnels/src/index.ts",
"assets": [
"packages/pieces/community/clickfunnels/*.md",
{
"input": "packages/pieces/community/clickfunnels/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/clickfunnels",
"command": "bun install --no-save --silent"
},
"dependsOn": [
"^build"
]
}
}
}

View File

@@ -0,0 +1,85 @@
{
"Subdomain": "Subdomain",
"API Key": "API-Schlüssel",
"Your ClickFunnels subdomain (e.g., if your URL is https://mycompany.myclickfunnels.com, enter \"mycompany\").": "Ihre ClickFunnels Subdomain (z.B. wenn Ihre URL https://mycompany.myclickfunnels.com ist, geben Sie \"mycompany\" ein.",
"Your ClickFunnels API key. You can find this in your ClickFunnels account settings.": "Ihr ClickFunnels API-Schlüssel. Diesen finden Sie in den ClickFunnels Konto-Einstellungen.",
"Enter your ClickFunnels subdomain and API key.": "Geben Sie Ihre ClickFunnels Subdomain und API-Schlüssel ein.",
"Create Opportunity": "Verkaufschance erstellen",
"Apply Tag to Contact": "Tag auf Kontakt anwenden",
"Remove Tag From Contact": "Tag vom Kontakt entfernen",
"Enroll a Contact Into a Course": "Einen Kontakt in einen Kurs einschreiben",
"Update or Create Contact": "Kontakt aktualisieren oder erstellen",
"Search Contacts": "Kontakte suchen",
"Custom API Call": "Eigener API-Aufruf",
"Create a new opportunity for a contact.": "Erstelle eine neue Chance für einen Kontakt.",
"Apply a tag to a contact if it doesnt already exist.": "Wenden Sie ein Schlagwort an einen Kontakt, wenn es noch nicht existiert.",
"Remove a specific tag from a contact.": "Entferne ein bestimmtes Schlagwort aus einem Kontakt.",
"Create an enrollment for a contact in a course.": "Erstellen Sie eine Anmeldung für einen Kontakt in einem Kurs.",
"Searches for a contact by email and updates it, or creates a new one if not found.": "Sucht nach einem Kontakt per E-Mail und aktualisiert ihn, oder erstellt einen neuen, falls nicht gefunden.",
"Look up contacts by ID or email": "Kontakte per ID oder E-Mail suchen",
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
"Opportunity Name": "Opportunity Name",
"Team": "Team",
"Workspace": "Arbeitsbereich",
"Pipeline": "Pipeline",
"Pipeline Stage": "Pipeline-Phase",
"Contact": "Kontakt",
"Assignee": "Assignee",
"Value": "Wert",
"Close Date": "Schließungsdatum",
"Tag": "Markierung",
"Course": "Kurs",
"Email": "E-Mail",
"First Name": "Vorname",
"Last Name": "Nachname",
"Phone Number": "Telefonnummer",
"Custom Attributes": "Eigene Attribute",
"Search Query": "Suchanfrage",
"Method": "Methode",
"Headers": "Kopfzeilen",
"Query Parameters": "Abfrageparameter",
"Body": "Körper",
"Response is Binary ?": "Antwort ist binär?",
"No Error on Failure": "Kein Fehler bei Fehler",
"Timeout (in seconds)": "Timeout (in Sekunden)",
"The name or title of the opportunity.": "Der Name oder der Titel der Chance.",
"Select the team": "Team auswählen",
"Select the workspace": "Arbeitsbereich auswählen",
"Select a pipeline": "Pipeline auswählen",
"Select a pipeline stage.": "Wählen Sie eine Pipeline-Phase.",
"Select a contact": "Kontakt auswählen",
"Select an assignee on your team": "Wähle einen Beauftragten in deinem Team aus",
"The potential value of this opportunity in the default currency of the workspace": "Der potenzielle Wert dieser Gelegenheit in der Standardwährung des Arbeitsbereiches",
"The expected close date for the opportunity.": "Das erwartete Enddatum für die Chance.",
"Select a tag to apply": "Wählen Sie einen Tag zum Anwenden",
"Select a tag": "Tag auswählen",
"Select a course": "Wählen Sie einen Kurs",
"The contact's email address. This is used to find and (update/create) the contact.": "Die E-Mail-Adresse des Kontakts. Dies wird verwendet, um den Kontakt zu finden und (aktualisieren/erzeugen).",
"Select tags to apply": "Tags zum Anwenden auswählen",
"A key-value object for custom contact data. Keys that are default properties on the Contact resource or variations of it will result in an error. E.g., first_name, First Name, etc. are not valid inputs.": "Ein Schlüsselobjekt für benutzerdefinierte Kontaktdaten. Schlüssel, die Standard-Eigenschaften der Kontaktressource oder Variationen sind, führen zu einem Fehler. B. first_name, Vorname, etc. sind keine gültigen Eingabe.",
"Filter contacts by either email or id": "Kontakte entweder per E-Mail oder Id filtern",
"Authorization headers are injected automatically from your connection.": "Autorisierungs-Header werden automatisch von Ihrer Verbindung injiziert.",
"Enable for files like PDFs, images, etc..": "Aktivieren für Dateien wie PDFs, Bilder, etc..",
"GET": "ERHALTEN",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "LÖSCHEN",
"HEAD": "HEAD",
"Scheduled Appointment Event Created": "Termin-Ereignis erstellt",
"Course Enrollment Created for contact": "Kursanmeldung für Kontakt erstellt",
"Contact Submitted Form": "Gesendetes Kontaktformular",
"One-Time Order Paid": "Einmalige Bestellung bezahlt",
"Subscription Invoice Paid": "Abonnement-Rechnung bezahlt",
"Contact Completed Course": "Kontakt zum abgeschlossenen Kurs",
"Contact Identified": "Kontakt identifiziert",
"Contact Suspended From Course": "Kontakt vom Kurs unterbrochen",
"Triggers when a scheduled appointment event is created.": "Wird ausgelöst, wenn ein geplantes Terminereignis erstellt wird.",
"Triggers when a course enrollment is created for a contact.": "Wird ausgelöst, wenn eine Kurseinschreibung für einen Kontakt erstellt wird.",
"Triggers each time a contact submits a form (opt-in or order).": "Löscht jedes Mal, wenn ein Kontakt ein Formular absendet (Opt-in oder Bestellung).",
"Triggers when a customer pays a one-time order.": "Löst aus, wenn ein Kunde eine einmalige Bestellung bezahlt.",
"Triggers when a subscription invoice is paid.": "Wird ausgelöst, wenn eine Abo-Rechnung bezahlt wird.",
"Triggers when a contact completes a course.": "Wird ausgelöst, wenn ein Kontakt einen Kurs abgeschlossen hat.",
"Triggers when a new contact is identified by email/phone.": "Wird ausgelöst, wenn ein neuer Kontakt per E-Mail/Telefon erkannt wird.",
"Triggers when a contact is suspended from a course.": "Wird ausgelöst, wenn ein Kontakt von einem Kurs gesperrt wird."
}

View File

@@ -0,0 +1,85 @@
{
"Subdomain": "Subdominio",
"API Key": "Clave API",
"Your ClickFunnels subdomain (e.g., if your URL is https://mycompany.myclickfunnels.com, enter \"mycompany\").": "Su subdominio ClickFunnels (por ejemplo, si su URL es https://mycompany.myclickfunnels.com, introduzca \"mycompany\").",
"Your ClickFunnels API key. You can find this in your ClickFunnels account settings.": "Su clave de la API ClickFunnels. Puede encontrarla en la configuración de su cuenta ClickFunnels.",
"Enter your ClickFunnels subdomain and API key.": "Introduzca su subdominio ClickFunnels y clave API.",
"Create Opportunity": "Crear Oportunidad",
"Apply Tag to Contact": "Aplicar etiqueta al contacto",
"Remove Tag From Contact": "Eliminar etiqueta del contacto",
"Enroll a Contact Into a Course": "Inscribe un contacto en un curso",
"Update or Create Contact": "Actualizar o Crear contacto",
"Search Contacts": "Buscar contactos",
"Custom API Call": "Llamada API personalizada",
"Create a new opportunity for a contact.": "Crear una nueva oportunidad para un contacto.",
"Apply a tag to a contact if it doesnt already exist.": "Aplicar una etiqueta a un contacto si no existe.",
"Remove a specific tag from a contact.": "Elimina una etiqueta específica de un contacto.",
"Create an enrollment for a contact in a course.": "Crea una inscripción para un contacto en un curso.",
"Searches for a contact by email and updates it, or creates a new one if not found.": "Busca un contacto por correo electrónico y lo actualiza, o crea uno nuevo si no se encuentra.",
"Look up contacts by ID or email": "Buscar contactos por ID o email",
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
"Opportunity Name": "Nombre de la oportunidad",
"Team": "Equipo",
"Workspace": "Espacio de trabajo",
"Pipeline": "Pipeline",
"Pipeline Stage": "Etapa del gasoducto",
"Contact": "Contacto",
"Assignee": "Assignee",
"Value": "Valor",
"Close Date": "Fecha de cierre",
"Tag": "Etiqueta",
"Course": "Curso",
"Email": "E-mail",
"First Name": "Nombre",
"Last Name": "Apellido",
"Phone Number": "Número de teléfono",
"Custom Attributes": "Atributos personalizados",
"Search Query": "Buscar consulta",
"Method": "Método",
"Headers": "Encabezados",
"Query Parameters": "Parámetros de consulta",
"Body": "Cuerpo",
"Response is Binary ?": "¿Respuesta es binaria?",
"No Error on Failure": "No hay ningún error en fallo",
"Timeout (in seconds)": "Tiempo de espera (en segundos)",
"The name or title of the opportunity.": "El nombre o el título de la oportunidad.",
"Select the team": "Seleccione el equipo",
"Select the workspace": "Seleccione el área de trabajo",
"Select a pipeline": "Seleccione un pipeline",
"Select a pipeline stage.": "Seleccione una etapa del pipeline.",
"Select a contact": "Seleccione un contacto",
"Select an assignee on your team": "Selecciona una persona asignada a tu equipo",
"The potential value of this opportunity in the default currency of the workspace": "El valor potencial de esta oportunidad en la moneda predeterminada del área de trabajo",
"The expected close date for the opportunity.": "La fecha de cierre prevista para la oportunidad.",
"Select a tag to apply": "Seleccione una etiqueta para aplicar",
"Select a tag": "Seleccione una etiqueta",
"Select a course": "Selecciona un curso",
"The contact's email address. This is used to find and (update/create) the contact.": "La dirección de correo electrónico del contacto. Esto se utiliza para encontrar y (actualizar/crear) el contacto.",
"Select tags to apply": "Seleccionar etiquetas a aplicar",
"A key-value object for custom contact data. Keys that are default properties on the Contact resource or variations of it will result in an error. E.g., first_name, First Name, etc. are not valid inputs.": "Un objeto clave-valor para datos de contacto personalizados. Las claves que son propiedades por defecto en el recurso Contacto o variaciones de él resultarán en un error. E.g., first_name, First Name, etc. no son entradas válidas.",
"Filter contacts by either email or id": "Filtrar contactos por correo electrónico o id",
"Authorization headers are injected automatically from your connection.": "Las cabeceras de autorización se inyectan automáticamente desde tu conexión.",
"Enable for files like PDFs, images, etc..": "Activar para archivos como PDFs, imágenes, etc.",
"GET": "RECOGER",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "BORRAR",
"HEAD": "LIMPIO",
"Scheduled Appointment Event Created": "Evento de cita programada creado",
"Course Enrollment Created for contact": "Inscripción al curso creada para el contacto",
"Contact Submitted Form": "Formulario de contacto enviado",
"One-Time Order Paid": "Orden pagada una sola vez",
"Subscription Invoice Paid": "Factura de suscripción pagada",
"Contact Completed Course": "Contacto Completado Curso",
"Contact Identified": "Contacto identificado",
"Contact Suspended From Course": "Contacto suspendido del curso",
"Triggers when a scheduled appointment event is created.": "Activadores cuando se crea un evento de cita programado.",
"Triggers when a course enrollment is created for a contact.": "Desencadena cuando se crea la inscripción de un curso para un contacto.",
"Triggers each time a contact submits a form (opt-in or order).": "Dispara cada vez que un contacto envía un formulario (opt-in u order).",
"Triggers when a customer pays a one-time order.": "Dispara cuando un cliente paga un pedido único.",
"Triggers when a subscription invoice is paid.": "Dispara cuando se paga una factura de suscripción.",
"Triggers when a contact completes a course.": "Desencadena cuando un contacto completa un curso.",
"Triggers when a new contact is identified by email/phone.": "Dispara cuando un nuevo contacto es identificado por correo electrónico/teléfono.",
"Triggers when a contact is suspended from a course.": "Dispara cuando un contacto es suspendido de un curso."
}

View File

@@ -0,0 +1,85 @@
{
"Subdomain": "Sous-domaine",
"API Key": "Clé API",
"Your ClickFunnels subdomain (e.g., if your URL is https://mycompany.myclickfunnels.com, enter \"mycompany\").": "Votre sous-domaine ClickFunnels (par exemple, si votre URL est https://mycompany.myclickfunnels.com, entrez \"mycompany\").",
"Your ClickFunnels API key. You can find this in your ClickFunnels account settings.": "Votre clé API ClickFunnels . Vous pouvez la trouver dans les paramètres de votre compte ClickFunnels.",
"Enter your ClickFunnels subdomain and API key.": "Entrez votre sous-domaine ClickFunnels et votre clé API.",
"Create Opportunity": "Créer une Affaire",
"Apply Tag to Contact": "Appliquer le Tag au Contact",
"Remove Tag From Contact": "Retirer la balise du contact",
"Enroll a Contact Into a Course": "Inscrire un contact dans un cours",
"Update or Create Contact": "Mettre à jour ou créer un contact",
"Search Contacts": "Rechercher dans les contacts",
"Custom API Call": "Appel d'API personnalisé",
"Create a new opportunity for a contact.": "Créer une nouvelle opportunité pour un contact.",
"Apply a tag to a contact if it doesnt already exist.": "Appliquer un tag à un contact s'il n'existe pas déjà.",
"Remove a specific tag from a contact.": "Supprimer un tag spécifique d'un contact.",
"Create an enrollment for a contact in a course.": "Créer une inscription pour un contact dans un cours.",
"Searches for a contact by email and updates it, or creates a new one if not found.": "Recherche un contact par email et le met à jour, ou en crée un nouveau s'il n'est pas trouvé.",
"Look up contacts by ID or email": "Rechercher des contacts par ID ou par e-mail",
"Make a custom API call to a specific endpoint": "Passer un appel API personnalisé à un endpoint spécifique",
"Opportunity Name": "Nom de l'opportunité",
"Team": "Équipe",
"Workspace": "Espace de travail",
"Pipeline": "Pipeline",
"Pipeline Stage": "Étape du pipeline",
"Contact": "Contacter",
"Assignee": "Assignee",
"Value": "Valeur",
"Close Date": "Date de clôture",
"Tag": "Étiquette",
"Course": "Cours",
"Email": "Courriel",
"First Name": "First Name",
"Last Name": "Last Name",
"Phone Number": "Numéro de téléphone",
"Custom Attributes": "Attributs personnalisés",
"Search Query": "Requête de recherche",
"Method": "Méthode",
"Headers": "En-têtes",
"Query Parameters": "Paramètres de requête",
"Body": "Corps",
"Response is Binary ?": "La réponse est Binaire ?",
"No Error on Failure": "Aucune erreur en cas d'échec",
"Timeout (in seconds)": "Délai d'expiration (en secondes)",
"The name or title of the opportunity.": "Le nom ou le titre de l'opportunité.",
"Select the team": "Sélectionnez l'équipe",
"Select the workspace": "Sélectionnez l'espace de travail",
"Select a pipeline": "Sélectionnez un pipeline",
"Select a pipeline stage.": "Sélectionnez une étape de pipeline.",
"Select a contact": "Sélectionnez un contact",
"Select an assignee on your team": "Sélectionnez un cessionnaire dans votre équipe",
"The potential value of this opportunity in the default currency of the workspace": "La valeur potentielle de cette opportunité dans la monnaie par défaut de l'espace de travail",
"The expected close date for the opportunity.": "La date de clôture prévue pour l'occasion.",
"Select a tag to apply": "Sélectionnez un tag à appliquer",
"Select a tag": "Sélectionnez un tag",
"Select a course": "Sélectionnez un cours",
"The contact's email address. This is used to find and (update/create) the contact.": "L'adresse e-mail du contact. Ceci est utilisé pour trouver et (mettre à jour/créer) le contact.",
"Select tags to apply": "Sélectionnez les tags à appliquer",
"A key-value object for custom contact data. Keys that are default properties on the Contact resource or variations of it will result in an error. E.g., first_name, First Name, etc. are not valid inputs.": "Un objet clé-valeur pour les données de contact personnalisées. Les clés qui sont les propriétés par défaut de la ressource Contact ou des variations de celle-ci entraîneront une erreur. Par exemple, prénom, prénom, etc. ne sont pas des entrées valides.",
"Filter contacts by either email or id": "Filtrer les contacts par email ou id",
"Authorization headers are injected automatically from your connection.": "Les en-têtes d'autorisation sont injectés automatiquement à partir de votre connexion.",
"Enable for files like PDFs, images, etc..": "Activer pour les fichiers comme les PDFs, les images, etc.",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"Scheduled Appointment Event Created": "Événement de rendez-vous programmé créé",
"Course Enrollment Created for contact": "Inscriptions de cours créées pour le contact",
"Contact Submitted Form": "Formulaire de contact soumis",
"One-Time Order Paid": "Commande à usage unique payée",
"Subscription Invoice Paid": "Facture d'abonnement payée",
"Contact Completed Course": "Contacter le cours terminé",
"Contact Identified": "Contact identifié",
"Contact Suspended From Course": "Contact suspendu du cours",
"Triggers when a scheduled appointment event is created.": "Déclenche lorsqu'un événement de rendez-vous est créé.",
"Triggers when a course enrollment is created for a contact.": "Déclenche quand une inscription à un cours est créée pour un contact.",
"Triggers each time a contact submits a form (opt-in or order).": "Déclenche chaque fois qu'un contact soumet un formulaire (opt-in ou commande).",
"Triggers when a customer pays a one-time order.": "Déclenche lorsqu'un client paie une commande unique.",
"Triggers when a subscription invoice is paid.": "Déclenche quand une facture d'abonnement est payée.",
"Triggers when a contact completes a course.": "Déclenche lorsqu'un contact termine un cours.",
"Triggers when a new contact is identified by email/phone.": "Déclenche lorsqu'un nouveau contact est identifié par email/téléphone.",
"Triggers when a contact is suspended from a course.": "Déclenche lorsqu'un contact est suspendu à partir d'un cours."
}

View File

@@ -0,0 +1,85 @@
{
"Subdomain": "サブドメイン",
"API Key": "API キー",
"Your ClickFunnels subdomain (e.g., if your URL is https://mycompany.myclickfunnels.com, enter \"mycompany\").": "ClickFunnels サブドメイン例えば、URLが https://mycompany.myclickfunnels.com の場合は「mycompany」と入力します。",
"Your ClickFunnels API key. You can find this in your ClickFunnels account settings.": "ClickFunnels APIキー。ClickFunnelsアカウント設定で確認できます。",
"Enter your ClickFunnels subdomain and API key.": "ClickFunnels サブドメインと API キーを入力します。",
"Create Opportunity": "案件を作成",
"Apply Tag to Contact": "連絡先にタグを適用",
"Remove Tag From Contact": "連絡先からタグを削除",
"Enroll a Contact Into a Course": "連絡先をコースに登録",
"Update or Create Contact": "連絡先を更新または作成",
"Search Contacts": "連絡先を検索",
"Custom API Call": "カスタムAPI通話",
"Create a new opportunity for a contact.": "連絡先に新しい商談を作成します。",
"Apply a tag to a contact if it doesnt already exist.": "すでに存在しない場合は、連絡先にタグを適用します。",
"Remove a specific tag from a contact.": "コンタクトから特定のタグを削除します。",
"Create an enrollment for a contact in a course.": "コースで連絡先の登録を作成します。",
"Searches for a contact by email and updates it, or creates a new one if not found.": "連絡先を電子メールで検索して更新するか、見つからない場合は新しい連絡先を作成します。",
"Look up contacts by ID or email": "IDまたは電子メールで連絡先を検索",
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
"Opportunity Name": "商談名",
"Team": "Team",
"Workspace": "ワークスペース",
"Pipeline": "パイプライン",
"Pipeline Stage": "パイプラインステージ",
"Contact": "お問い合わせ",
"Assignee": "Assignee",
"Value": "値",
"Close Date": "終了日",
"Tag": "タグ",
"Course": "コース",
"Email": "Eメールアドレス",
"First Name": "名",
"Last Name": "姓",
"Phone Number": "電話番号",
"Custom Attributes": "カスタム属性",
"Search Query": "検索クエリ",
"Method": "方法",
"Headers": "ヘッダー",
"Query Parameters": "クエリパラメータ",
"Body": "本文",
"Response is Binary ?": "応答はバイナリですか?",
"No Error on Failure": "失敗時にエラーはありません",
"Timeout (in seconds)": "タイムアウト(秒)",
"The name or title of the opportunity.": "商談の名前またはタイトル",
"Select the team": "チームを選択",
"Select the workspace": "ワークスペースを選択",
"Select a pipeline": "パイプラインを選択",
"Select a pipeline stage.": "パイプラインステージを選択します。",
"Select a contact": "連絡先を選択",
"Select an assignee on your team": "担当者を選択してください",
"The potential value of this opportunity in the default currency of the workspace": "ワークスペースのデフォルト通貨におけるこの商談の潜在的な値",
"The expected close date for the opportunity.": "機会のための予想された近い日付。",
"Select a tag to apply": "適用するタグを選択してください",
"Select a tag": "タグを選択",
"Select a course": "コースを選択",
"The contact's email address. This is used to find and (update/create) the contact.": "連絡先のメールアドレス。連絡先の検索と(更新/作成)に使用されます。",
"Select tags to apply": "適用するタグを選択",
"A key-value object for custom contact data. Keys that are default properties on the Contact resource or variations of it will result in an error. E.g., first_name, First Name, etc. are not valid inputs.": "カスタム連絡先データのキー値オブジェクト。連絡先リソースまたはバリエーションのデフォルトのプロパティであるキーはエラーになります。 例えば、first_name、First Nameなどは無効な入力です。",
"Filter contacts by either email or id": "電子メールまたはIDで連絡先をフィルター",
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
"GET": "取得",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "削除",
"HEAD": "頭",
"Scheduled Appointment Event Created": "予定された予定の予定が作成されました",
"Course Enrollment Created for contact": "コース登録が連絡先のために作成されました",
"Contact Submitted Form": "お問い合わせフォーム",
"One-Time Order Paid": "一回限りの注文が支払われました",
"Subscription Invoice Paid": "サブスクリプション請求書の支払い済み",
"Contact Completed Course": "完了したコースに連絡する",
"Contact Identified": "同定された連絡先",
"Contact Suspended From Course": "コースからの連絡は保留されています",
"Triggers when a scheduled appointment event is created.": "予定された予定の予定イベントが作成されたときにトリガーします。",
"Triggers when a course enrollment is created for a contact.": "連絡先にコース登録が作成されたときにトリガーします。",
"Triggers each time a contact submits a form (opt-in or order).": "コンタクトがフォーム(オプトインまたはオーダー)を送信するたびにトリガーします。",
"Triggers when a customer pays a one-time order.": "顧客が一回限りの注文を支払ったときにトリガーします。",
"Triggers when a subscription invoice is paid.": "サブスクリプションの請求書が支払われたときに発生します。",
"Triggers when a contact completes a course.": "連絡先がコースを完了したときにトリガーします。",
"Triggers when a new contact is identified by email/phone.": "新しい連絡先が電子メール/電話で識別されたときにトリガーされます。",
"Triggers when a contact is suspended from a course.": "連絡先がコースから中断されたときに発生します。"
}

View File

@@ -0,0 +1,85 @@
{
"Subdomain": "Subdomein",
"API Key": "API Sleutel",
"Your ClickFunnels subdomain (e.g., if your URL is https://mycompany.myclickfunnels.com, enter \"mycompany\").": "Uw ClickFunnels subdomein (bijv. als uw URL https://mijnbedrijf.myclickfunnels.com, vul dan \"mijnbedrijf\" in.",
"Your ClickFunnels API key. You can find this in your ClickFunnels account settings.": "Je ClickFunnels API-sleutel. Je vindt dit in de instellingen van je ClickFunnels account.",
"Enter your ClickFunnels subdomain and API key.": "Voer uw ClickFunnels subdomein en API-sleutel in.",
"Create Opportunity": "Verkoopkans creëren",
"Apply Tag to Contact": "Tag op contactpersoon toepassen",
"Remove Tag From Contact": "Verwijder Tag Van Contact",
"Enroll a Contact Into a Course": "Inschrijven van een contactpersoon in een cursus",
"Update or Create Contact": "Bijwerken of aanmaken van contactpersoon",
"Search Contacts": "Contactpersonen zoeken",
"Custom API Call": "Custom API Call",
"Create a new opportunity for a contact.": "Maak een nieuwe kans voor een contact.",
"Apply a tag to a contact if it doesnt already exist.": "Een label toepassen op een contact als deze nog niet bestaat.",
"Remove a specific tag from a contact.": "Verwijder een specifieke tag uit een contactpersoon.",
"Create an enrollment for a contact in a course.": "Maak een inschrijving voor een contactpersoon in een cursus.",
"Searches for a contact by email and updates it, or creates a new one if not found.": "Zoekt naar een contactpersoon via e-mail en update deze of maakt een nieuwe aan als deze niet gevonden is.",
"Look up contacts by ID or email": "Contacten opzoeken via ID of e-mail",
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
"Opportunity Name": "Verkoopkans naam",
"Team": "Team",
"Workspace": "werkruimte",
"Pipeline": "Pijplijn",
"Pipeline Stage": "Pijplijn stadium",
"Contact": "Contactpersoon",
"Assignee": "Assignee",
"Value": "Waarde",
"Close Date": "Sluit datum",
"Tag": "Tagnaam",
"Course": "Cursus",
"Email": "E-mail",
"First Name": "Voornaam",
"Last Name": "Achternaam",
"Phone Number": "Telefoon nummer",
"Custom Attributes": "Aangepaste kenmerken",
"Search Query": "Zoek query",
"Method": "Methode",
"Headers": "Kopteksten",
"Query Parameters": "Query parameters",
"Body": "Lichaam",
"Response is Binary ?": "Antwoord is binair?",
"No Error on Failure": "Geen fout bij fout",
"Timeout (in seconds)": "Time-out (in seconden)",
"The name or title of the opportunity.": "De naam of titel van de mogelijkheid.",
"Select the team": "Selecteer het team",
"Select the workspace": "Selecteer de workspace",
"Select a pipeline": "Selecteer een pipeline",
"Select a pipeline stage.": "Selecteer een pijplijnfase.",
"Select a contact": "Selecteer een contactpersoon",
"Select an assignee on your team": "Selecteer een verantwoordelijke voor uw team",
"The potential value of this opportunity in the default currency of the workspace": "De potentiële waarde van deze kans in de standaard valuta van de werkruimte",
"The expected close date for the opportunity.": "De verwachte sluitingsdatum voor deze mogelijkheid.",
"Select a tag to apply": "Selecteer een tag om toe te passen",
"Select a tag": "Selecteer een tag",
"Select a course": "Selecteer een cursus",
"The contact's email address. This is used to find and (update/create) the contact.": "E-mailadres van de contactpersoon. Dit wordt gebruikt om de contactpersoon te vinden en (bijwerken/maken)",
"Select tags to apply": "Selecteer tags om toe te passen",
"A key-value object for custom contact data. Keys that are default properties on the Contact resource or variations of it will result in an error. E.g., first_name, First Name, etc. are not valid inputs.": "Een sleutel-waarde-object voor aangepaste contactgegevens. Sleutels die standaard eigenschappen zijn in de contactbron of variaties resulteren in een fout. Bijv. voornaam, voornaam, etc. zijn geen geldige invoer.",
"Filter contacts by either email or id": "Contactpersonen filteren op e-mail of id",
"Authorization headers are injected automatically from your connection.": "Autorisatie headers worden automatisch geïnjecteerd vanuit uw verbinding.",
"Enable for files like PDFs, images, etc..": "Inschakelen voor bestanden zoals PDF's, afbeeldingen etc..",
"GET": "KRIJG",
"POST": "POSTE",
"PATCH": "BEKIJK",
"PUT": "PUT",
"DELETE": "VERWIJDEREN",
"HEAD": "HOOFD",
"Scheduled Appointment Event Created": "Geplande Afspraak Afspraak Gemaakt",
"Course Enrollment Created for contact": "Inschrijving van cursus aangemaakt voor contact",
"Contact Submitted Form": "Contact verzonden formulier",
"One-Time Order Paid": "Eenmalige bestelling betaald",
"Subscription Invoice Paid": "Factuur abonnement betaald",
"Contact Completed Course": "Contact Afgeronde Cursus",
"Contact Identified": "Contactpersoon geïdentificeerd",
"Contact Suspended From Course": "Contact opgeschort uit cursus",
"Triggers when a scheduled appointment event is created.": "Triggers wanneer een geplande afspraak wordt gemaakt.",
"Triggers when a course enrollment is created for a contact.": "Activeert wanneer een cursus wordt aangemaakt voor een contact.",
"Triggers each time a contact submits a form (opt-in or order).": "Triggert elke keer als een contactpersoon een formulier verstuurt (opt-in of volgorde).",
"Triggers when a customer pays a one-time order.": "Triggert wanneer een klant een eenmalige bestelling betaalt.",
"Triggers when a subscription invoice is paid.": "Triggert wanneer een inschrijvingsfactuur wordt betaald.",
"Triggers when a contact completes a course.": "Triggert wanneer een contact een cursus voltooit.",
"Triggers when a new contact is identified by email/phone.": "Triggert wanneer een nieuwe contactpersoon wordt geïdentificeerd via e-mail/telefoon.",
"Triggers when a contact is suspended from a course.": "Activeert wanneer een contact wordt geschorst door een cursus."
}

View File

@@ -0,0 +1,85 @@
{
"Subdomain": "Subdomínio",
"API Key": "Chave de API",
"Your ClickFunnels subdomain (e.g., if your URL is https://mycompany.myclickfunnels.com, enter \"mycompany\").": "Seu subdomínio ClickFunnels (por exemplo, se sua URL é https://mycompany.myclickfunnels.com, enter \"minhaempresa\").",
"Your ClickFunnels API key. You can find this in your ClickFunnels account settings.": "Sua chave API ClickFunnels. Você pode encontrar isso nas suas configurações de conta ClickFunnels.",
"Enter your ClickFunnels subdomain and API key.": "Digite seu subdomínio ClickFunnels e chave da API.",
"Create Opportunity": "Criar Oportunidade",
"Apply Tag to Contact": "Aplicar Etiqueta ao Contato",
"Remove Tag From Contact": "Remover Tag do contato",
"Enroll a Contact Into a Course": "Inscrever um Contato em um Curso",
"Update or Create Contact": "Atualizar ou Criar Contato",
"Search Contacts": "Pesquisar contatos",
"Custom API Call": "Chamada de API personalizada",
"Create a new opportunity for a contact.": "Crie uma nova oportunidade para um contato.",
"Apply a tag to a contact if it doesnt already exist.": "Aplique uma etiqueta a um contato, caso ainda não exista.",
"Remove a specific tag from a contact.": "Remove uma tag específica de um contato.",
"Create an enrollment for a contact in a course.": "Crie uma inscrição para um contato em um curso.",
"Searches for a contact by email and updates it, or creates a new one if not found.": "Procura por um contato por email e atualiza-o, ou cria um novo, se não for encontrado.",
"Look up contacts by ID or email": "Procurar contatos por ID ou email",
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
"Opportunity Name": "Oportunidade Nome",
"Team": "Equipe",
"Workspace": "Workspace",
"Pipeline": "Pipeline",
"Pipeline Stage": "Estágio do pipeline",
"Contact": "contato",
"Assignee": "Assignee",
"Value": "Valor",
"Close Date": "Data de Fechamento",
"Tag": "Etiqueta",
"Course": "Curso",
"Email": "e-mail",
"First Name": "Nome",
"Last Name": "Sobrenome",
"Phone Number": "Número de telefone",
"Custom Attributes": "Atributos personalizados",
"Search Query": "Consulta de Pesquisa",
"Method": "Método",
"Headers": "Cabeçalhos",
"Query Parameters": "Parâmetros da consulta",
"Body": "Conteúdo",
"Response is Binary ?": "A resposta é binária ?",
"No Error on Failure": "Nenhum erro no Failure",
"Timeout (in seconds)": "Tempo limite (em segundos)",
"The name or title of the opportunity.": "O nome ou título da oportunidade.",
"Select the team": "Selecione o time",
"Select the workspace": "Selecionar Espaço",
"Select a pipeline": "Selecione um pipeline",
"Select a pipeline stage.": "Selecione um palco de pipeline.",
"Select a contact": "Selecione um contato",
"Select an assignee on your team": "Selecione um responsável na sua equipe",
"The potential value of this opportunity in the default currency of the workspace": "O valor potencial desta oportunidade na moeda padrão da área de trabalho",
"The expected close date for the opportunity.": "A esperada data de fechamento desta oportunidade.",
"Select a tag to apply": "Selecione uma marca para aplicar",
"Select a tag": "Selecione um marcador",
"Select a course": "Selecione um curso",
"The contact's email address. This is used to find and (update/create) the contact.": "O endereço de e-mail do contato. Isso é usado para localizar e (atualizar/criar) o contato.",
"Select tags to apply": "Selecione as etiquetas para aplicar",
"A key-value object for custom contact data. Keys that are default properties on the Contact resource or variations of it will result in an error. E.g., first_name, First Name, etc. are not valid inputs.": "Um objeto chave-valor para dados personalizados de contato. Chaves que são propriedades padrão no recurso de contato ou variações dele resultarão em um erro. Ex.: primeiro_nome, primeiro nome, primeiro nome, etc. não são entradas válidas.",
"Filter contacts by either email or id": "Filtrar contatos por e-mail ou id",
"Authorization headers are injected automatically from your connection.": "Os cabeçalhos de autorização são inseridos automaticamente a partir da sua conexão.",
"Enable for files like PDFs, images, etc..": "Habilitar para arquivos como PDFs, imagens, etc..",
"GET": "OBTER",
"POST": "POSTAR",
"PATCH": "COMPRAR",
"PUT": "COLOCAR",
"DELETE": "EXCLUIR",
"HEAD": "CABEÇA",
"Scheduled Appointment Event Created": "Evento de Compromisso Agendado Criado",
"Course Enrollment Created for contact": "Inscrição no Curso Criada para contato",
"Contact Submitted Form": "Formulário de Contato Enviado",
"One-Time Order Paid": "Pedido pago com um único tempo",
"Subscription Invoice Paid": "Fatura de assinatura paga",
"Contact Completed Course": "Contato concluído o curso",
"Contact Identified": "Contato identificado",
"Contact Suspended From Course": "Contato suspenso do curso",
"Triggers when a scheduled appointment event is created.": "Aciona quando um evento de agendamento é criado.",
"Triggers when a course enrollment is created for a contact.": "Dispara quando uma matrícula de curso for criada para um contato.",
"Triggers each time a contact submits a form (opt-in or order).": "Aciona cada vez que um contato envia um formulário (opt-in ou ordem).",
"Triggers when a customer pays a one-time order.": "Aciona quando um cliente paga um pedido único.",
"Triggers when a subscription invoice is paid.": "Aciona quando uma fatura de assinatura é paga.",
"Triggers when a contact completes a course.": "Aciona quando um contato completa um curso.",
"Triggers when a new contact is identified by email/phone.": "Aciona quando um novo contato é identificado por e-mail/telefone.",
"Triggers when a contact is suspended from a course.": "Dispara quando um contato é suspenso de um curso."
}

View File

@@ -0,0 +1,85 @@
{
"Subdomain": "Subdomain",
"API Key": "API Key",
"Your ClickFunnels subdomain (e.g., if your URL is https://mycompany.myclickfunnels.com, enter \"mycompany\").": "Your ClickFunnels subdomain (e.g., if your URL is https://mycompany.myclickfunnels.com, enter \"mycompany\").",
"Your ClickFunnels API key. You can find this in your ClickFunnels account settings.": "Your ClickFunnels API key. You can find this in your ClickFunnels account settings.",
"Enter your ClickFunnels subdomain and API key.": "Enter your ClickFunnels subdomain and API key.",
"Create Opportunity": "Create Opportunity",
"Apply Tag to Contact": "Apply Tag to Contact",
"Remove Tag From Contact": "Remove Tag From Contact",
"Enroll a Contact Into a Course": "Enroll a Contact Into a Course",
"Update or Create Contact": "Update or Create Contact",
"Search Contacts": "Search Contacts",
"Custom API Call": "Custom API Call",
"Create a new opportunity for a contact.": "Create a new opportunity for a contact.",
"Apply a tag to a contact if it doesnt already exist.": "Apply a tag to a contact if it doesnt already exist.",
"Remove a specific tag from a contact.": "Remove a specific tag from a contact.",
"Create an enrollment for a contact in a course.": "Create an enrollment for a contact in a course.",
"Searches for a contact by email and updates it, or creates a new one if not found.": "Searches for a contact by email and updates it, or creates a new one if not found.",
"Look up contacts by ID or email": "Look up contacts by ID or email",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Opportunity Name": "Opportunity Name",
"Team": "Team",
"Workspace": "Workspace",
"Pipeline": "Pipeline",
"Pipeline Stage": "Pipeline Stage",
"Contact": "Contact",
"Assignee": "Assignee",
"Value": "Value",
"Close Date": "Close Date",
"Tag": "Tag",
"Course": "Course",
"Email": "Email",
"First Name": "First Name",
"Last Name": "Last Name",
"Phone Number": "Phone Number",
"Custom Attributes": "Custom Attributes",
"Search Query": "Search Query",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"The name or title of the opportunity.": "The name or title of the opportunity.",
"Select the team": "Select the team",
"Select the workspace": "Select the workspace",
"Select a pipeline": "Select a pipeline",
"Select a pipeline stage.": "Select a pipeline stage.",
"Select a contact": "Select a contact",
"Select an assignee on your team": "Select an assignee on your team",
"The potential value of this opportunity in the default currency of the workspace": "The potential value of this opportunity in the default currency of the workspace",
"The expected close date for the opportunity.": "The expected close date for the opportunity.",
"Select a tag to apply": "Select a tag to apply",
"Select a tag": "Select a tag",
"Select a course": "Select a course",
"The contact's email address. This is used to find and (update/create) the contact.": "The contact's email address. This is used to find and (update/create) the contact.",
"Select tags to apply": "Select tags to apply",
"A key-value object for custom contact data. Keys that are default properties on the Contact resource or variations of it will result in an error. E.g., first_name, First Name, etc. are not valid inputs.": "A key-value object for custom contact data. Keys that are default properties on the Contact resource or variations of it will result in an error. E.g., first_name, First Name, etc. are not valid inputs.",
"Filter contacts by either email or id": "Filter contacts by either email or id",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"Scheduled Appointment Event Created": "Scheduled Appointment Event Created",
"Course Enrollment Created for contact": "Course Enrollment Created for contact",
"Contact Submitted Form": "Contact Submitted Form",
"One-Time Order Paid": "One-Time Order Paid",
"Subscription Invoice Paid": "Subscription Invoice Paid",
"Contact Completed Course": "Contact Completed Course",
"Contact Identified": "Contact Identified",
"Contact Suspended From Course": "Contact Suspended From Course",
"Triggers when a scheduled appointment event is created.": "Triggers when a scheduled appointment event is created.",
"Triggers when a course enrollment is created for a contact.": "Triggers when a course enrollment is created for a contact.",
"Triggers each time a contact submits a form (opt-in or order).": "Triggers each time a contact submits a form (opt-in or order).",
"Triggers when a customer pays a one-time order.": "Triggers when a customer pays a one-time order.",
"Triggers when a subscription invoice is paid.": "Triggers when a subscription invoice is paid.",
"Triggers when a contact completes a course.": "Triggers when a contact completes a course.",
"Triggers when a new contact is identified by email/phone.": "Triggers when a new contact is identified by email/phone.",
"Triggers when a contact is suspended from a course.": "Triggers when a contact is suspended from a course."
}

View File

@@ -0,0 +1,85 @@
{
"Subdomain": "Subdomain",
"API Key": "API 密钥",
"Your ClickFunnels subdomain (e.g., if your URL is https://mycompany.myclickfunnels.com, enter \"mycompany\").": "Your ClickFunnels subdomain (e.g., if your URL is https://mycompany.myclickfunnels.com, enter \"mycompany\").",
"Your ClickFunnels API key. You can find this in your ClickFunnels account settings.": "Your ClickFunnels API key. You can find this in your ClickFunnels account settings.",
"Enter your ClickFunnels subdomain and API key.": "Enter your ClickFunnels subdomain and API key.",
"Create Opportunity": "Create Opportunity",
"Apply Tag to Contact": "Apply Tag to Contact",
"Remove Tag From Contact": "Remove Tag From Contact",
"Enroll a Contact Into a Course": "Enroll a Contact Into a Course",
"Update or Create Contact": "Update or Create Contact",
"Search Contacts": "Search Contacts",
"Custom API Call": "自定义 API 呼叫",
"Create a new opportunity for a contact.": "Create a new opportunity for a contact.",
"Apply a tag to a contact if it doesnt already exist.": "Apply a tag to a contact if it doesnt already exist.",
"Remove a specific tag from a contact.": "Remove a specific tag from a contact.",
"Create an enrollment for a contact in a course.": "Create an enrollment for a contact in a course.",
"Searches for a contact by email and updates it, or creates a new one if not found.": "Searches for a contact by email and updates it, or creates a new one if not found.",
"Look up contacts by ID or email": "Look up contacts by ID or email",
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
"Opportunity Name": "Opportunity Name",
"Team": "Team",
"Workspace": "Workspace",
"Pipeline": "Pipeline",
"Pipeline Stage": "Pipeline Stage",
"Contact": "Contact",
"Assignee": "Assignee",
"Value": "值",
"Close Date": "Close Date",
"Tag": "标签",
"Course": "Course",
"Email": "电子邮件地址",
"First Name": "名字",
"Last Name": "名字",
"Phone Number": "Phone Number",
"Custom Attributes": "Custom Attributes",
"Search Query": "Search Query",
"Method": "方法",
"Headers": "信头",
"Query Parameters": "查询参数",
"Body": "正文内容",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "失败时没有错误",
"Timeout (in seconds)": "超时(秒)",
"The name or title of the opportunity.": "The name or title of the opportunity.",
"Select the team": "Select the team",
"Select the workspace": "Select the workspace",
"Select a pipeline": "Select a pipeline",
"Select a pipeline stage.": "Select a pipeline stage.",
"Select a contact": "Select a contact",
"Select an assignee on your team": "Select an assignee on your team",
"The potential value of this opportunity in the default currency of the workspace": "The potential value of this opportunity in the default currency of the workspace",
"The expected close date for the opportunity.": "The expected close date for the opportunity.",
"Select a tag to apply": "Select a tag to apply",
"Select a tag": "Select a tag",
"Select a course": "Select a course",
"The contact's email address. This is used to find and (update/create) the contact.": "The contact's email address. This is used to find and (update/create) the contact.",
"Select tags to apply": "Select tags to apply",
"A key-value object for custom contact data. Keys that are default properties on the Contact resource or variations of it will result in an error. E.g., first_name, First Name, etc. are not valid inputs.": "A key-value object for custom contact data. Keys that are default properties on the Contact resource or variations of it will result in an error. E.g., first_name, First Name, etc. are not valid inputs.",
"Filter contacts by either email or id": "Filter contacts by either email or id",
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"GET": "获取",
"POST": "帖子",
"PATCH": "PATCH",
"PUT": "弹出",
"DELETE": "删除",
"HEAD": "黑色",
"Scheduled Appointment Event Created": "Scheduled Appointment Event Created",
"Course Enrollment Created for contact": "Course Enrollment Created for contact",
"Contact Submitted Form": "Contact Submitted Form",
"One-Time Order Paid": "One-Time Order Paid",
"Subscription Invoice Paid": "Subscription Invoice Paid",
"Contact Completed Course": "Contact Completed Course",
"Contact Identified": "Contact Identified",
"Contact Suspended From Course": "Contact Suspended From Course",
"Triggers when a scheduled appointment event is created.": "Triggers when a scheduled appointment event is created.",
"Triggers when a course enrollment is created for a contact.": "Triggers when a course enrollment is created for a contact.",
"Triggers each time a contact submits a form (opt-in or order).": "Triggers each time a contact submits a form (opt-in or order).",
"Triggers when a customer pays a one-time order.": "Triggers when a customer pays a one-time order.",
"Triggers when a subscription invoice is paid.": "Triggers when a subscription invoice is paid.",
"Triggers when a contact completes a course.": "Triggers when a contact completes a course.",
"Triggers when a new contact is identified by email/phone.": "Triggers when a new contact is identified by email/phone.",
"Triggers when a contact is suspended from a course.": "Triggers when a contact is suspended from a course."
}

View File

@@ -0,0 +1,63 @@
import { createPiece, PieceAuth } from '@activepieces/pieces-framework';
import { scheduledAppointmentEventCreated } from './lib/triggers/scheduled-appointment-event-created';
import {
CLICKFUNNELS_APIKEY_AUTH,
CLICKFUNNELS_BASE_URL,
clickfunnelsAuth,
} from './lib/common/constants';
import { courseEnrollmentCreatedForContact } from './lib/triggers/course-enrollment-created-for-contact';
import { contactSubmittedForm } from './lib/triggers/contact-submitted-form';
import { oneTimeOrderPaid } from './lib/triggers/one-time-order-paid';
import { subscriptionInvoicePaid } from './lib/triggers/subscription-invoice-paid';
import { contactCompletedCourse } from './lib/triggers/contact-completed-course';
import { contactIdentified } from './lib/triggers/contact-identified';
import { contactSuspendedFromCourse } from './lib/triggers/contact-suspended-from-course';
import { createOpportunity } from './lib/actions/create-opportunity';
import { applyTagToContact } from './lib/actions/apply-tag-to-contact';
import { removeTagFromContact } from './lib/actions/remove-tag-from-contact';
import { enrollAContactIntoACourse } from './lib/actions/enroll-a-contact-into-a-course';
import { updateOrCreateContact } from './lib/actions/update-or-create-contact';
import { searchContacts } from './lib/actions/search-contacts';
import { PieceCategory } from '@activepieces/shared';
import { createCustomApiCallAction } from '@activepieces/pieces-common';
export const clickfunnels = createPiece({
displayName: 'ClickFunnels',
auth: clickfunnelsAuth,
minimumSupportedRelease: '0.36.1',
logoUrl: 'https://cdn.activepieces.com/pieces/clickfunnels.png',
categories: [PieceCategory.COMMUNICATION, PieceCategory.MARKETING],
authors: ['gs03dev'],
actions: [
createOpportunity,
applyTagToContact,
removeTagFromContact,
enrollAContactIntoACourse,
updateOrCreateContact,
enrollAContactIntoACourse,
searchContacts,
createCustomApiCallAction({
auth: clickfunnelsAuth,
baseUrl: (auth) => {
const authValue = auth?.props;
return CLICKFUNNELS_BASE_URL(authValue?.subdomain ?? '');
},
authMapping: async (auth) => {
const authValue = auth.props;
return {
Authorization: `Bearer ${authValue.apiKey}`,
};
},
}),
],
triggers: [
scheduledAppointmentEventCreated,
courseEnrollmentCreatedForContact,
contactSubmittedForm,
oneTimeOrderPaid,
subscriptionInvoicePaid,
contactCompletedCourse,
contactIdentified,
contactSuspendedFromCourse,
],
});

View File

@@ -0,0 +1,37 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { clickfunnelsAuth } from '../common/constants';
import {
contactsDropdown,
tagsDropdown,
teamsDropdown,
workspacesDropdown,
} from '../common/props';
import { clickfunnelsApiService } from '../common/requests';
export const applyTagToContact = createAction({
auth: clickfunnelsAuth,
name: 'applyTagToContact',
displayName: 'Apply Tag to Contact',
description: 'Apply a tag to a contact if it doesnt already exist.',
props: {
teamId: teamsDropdown(['auth']),
workspaceId: workspacesDropdown(['auth', 'teamId']),
contactId: contactsDropdown(['auth', 'workspaceId']),
tagId: tagsDropdown(['auth', 'workspaceId']),
},
async run({auth, propsValue}) {
const payload = {
contacts_applied_tag: {
tag_id: propsValue.tagId
},
};
const response = await clickfunnelsApiService.createAppliedTag(
auth.props,
propsValue.contactId as string,
payload
);
return response;
},
});

View File

@@ -0,0 +1,67 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { clickfunnelsAuth } from '../common/constants';
import {
contactsDropdown,
pipelinesDropdown,
pipelineStagesDropdown,
teamMembershipsDropdown,
teamsDropdown,
workspacesDropdown,
} from '../common/props';
import { clickfunnelsApiService } from '../common/requests';
export const createOpportunity = createAction({
auth: clickfunnelsAuth,
name: 'createOpportunity',
displayName: 'Create Opportunity',
description:
'Create a new opportunity for a contact.',
props: {
name: Property.ShortText({
displayName: 'Opportunity Name',
description: 'The name or title of the opportunity.',
required: true,
}),
teamId: teamsDropdown(['auth']),
workspaceId: workspacesDropdown(['auth', 'teamId']),
pipelineId: pipelinesDropdown(['auth', 'workspaceId']),
pipelineStageId: pipelineStagesDropdown(['auth', 'pipelineId']),
contactId: contactsDropdown(['auth', 'workspaceId']),
assigneeId: teamMembershipsDropdown(['auth', 'teamId'], false),
value: Property.Number({
displayName: 'Value',
description:
'The potential value of this opportunity in the default currency of the workspace',
required: false,
}),
closedAt: Property.DateTime({
displayName: 'Close Date',
description: 'The expected close date for the opportunity.',
required: false,
}),
},
async run({ auth, propsValue }) {
const payload = {
name: propsValue.name,
pipelines_stage_id: propsValue.pipelineStageId,
primary_contact_id: propsValue.contactId,
...(propsValue.value && {
value: propsValue.value,
}),
...(propsValue.closedAt && {
closed_at: new Date(propsValue.closedAt as string).toISOString(),
}),
assignee_id: propsValue.assigneeId,
};
const response = await clickfunnelsApiService.createOpportunity(
auth.props,
propsValue.workspaceId as string,
{
sales_opportunity: payload,
}
);
return response;
},
});

View File

@@ -0,0 +1,28 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { contactsDropdown, coursesDropdown, teamsDropdown, workspacesDropdown } from '../common/props';
import { clickfunnelsApiService } from '../common/requests';
import { clickfunnelsAuth } from '../common/constants';
export const enrollAContactIntoACourse = createAction({
auth: clickfunnelsAuth,
name: 'enrollAContactIntoACourse',
displayName: 'Enroll a Contact Into a Course',
description: 'Create an enrollment for a contact in a course.',
props: {
teamId: teamsDropdown(['auth']),
workspaceId: workspacesDropdown(['auth', 'teamId']),
courseId: coursesDropdown(['auth', 'workspaceId']),
contactId: contactsDropdown(['auth', 'workspaceId']),
},
async run({auth, propsValue}) {
const payload = {
courses_enrollment: {
contact_id: propsValue.contactId
},
};
const response = await clickfunnelsApiService.createCourseEnrollment(auth.props, propsValue.courseId as string, payload);
return response;
},
});

View File

@@ -0,0 +1,28 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import {
appliedTagsDropdown,
contactsDropdown,
teamsDropdown,
workspacesDropdown,
} from '../common/props';
import { clickfunnelsAuth } from '../common/constants';
import { clickfunnelsApiService } from '../common/requests';
export const removeTagFromContact = createAction({
auth: clickfunnelsAuth,
name: 'removeTagFromContact',
displayName: 'Remove Tag From Contact',
description: 'Remove a specific tag from a contact.',
props: {
teamId: teamsDropdown(['auth']),
workspaceId: workspacesDropdown(['auth', 'teamId']),
contactId: contactsDropdown(['auth', 'workspaceId']),
tagId: appliedTagsDropdown(['auth', 'contactId']),
},
async run({auth, propsValue}) {
await clickfunnelsApiService.removeAppliedTags(auth.props, propsValue.tagId as string);
return {
message: "Tag removed"
}
},
});

View File

@@ -0,0 +1,29 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { clickfunnelsAuth } from '../common/constants';
import { teamsDropdown, workspacesDropdown } from '../common/props';
import { clickfunnelsApiService } from '../common/requests';
export const searchContacts = createAction({
auth: clickfunnelsAuth,
name: 'searchContacts',
displayName: 'Search Contacts',
description: 'Look up contacts by ID or email',
props: {
teamId: teamsDropdown(['auth']),
workspaceId: workspacesDropdown(['auth', 'teamId']),
searchTerm: Property.ShortText({
displayName: 'Search Query',
description: 'Filter contacts by either email or id',
required: true,
}),
},
async run({ auth, propsValue }) {
const response = await clickfunnelsApiService.fetchContactByEmailSearch(
auth.props,
propsValue.workspaceId as string,
propsValue.searchTerm as string
);
return response;
},
});

View File

@@ -0,0 +1,56 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { clickfunnelsAuth } from '../common/constants';
import { multiTagsDropdown, teamsDropdown, workspacesDropdown } from '../common/props';
import { clickfunnelsApiService } from '../common/requests';
export const updateOrCreateContact = createAction({
auth: clickfunnelsAuth,
name: 'updateOrCreateContact',
displayName: 'Update or Create Contact',
description:
'Searches for a contact by email and updates it, or creates a new one if not found.',
props: {
teamId: teamsDropdown(['auth']),
workspaceId: workspacesDropdown(['auth', 'teamId']),
emailAddress: Property.ShortText({
displayName: 'Email',
description:
"The contact's email address. This is used to find and (update/create) the contact.",
required: true,
}),
firstName: Property.ShortText({
displayName: 'First Name',
required: false,
}),
lastName: Property.ShortText({
displayName: 'Last Name',
required: false,
}),
phoneNumber: Property.ShortText({
displayName: 'Phone Number',
required: false,
}),
tagIds: multiTagsDropdown(['auth', 'workspaceId']),
customAttributes: Property.Object({
displayName: 'Custom Attributes',
description: 'A key-value object for custom contact data. Keys that are default properties on the Contact resource or variations of it will result in an error. E.g., first_name, First Name, etc. are not valid inputs.',
required: false,
}),
},
async run({auth, propsValue}) {
const payload = {
contact: {
email_address: propsValue.emailAddress,
first_name: propsValue.firstName,
last_name: propsValue.lastName,
phone_number: propsValue.phoneNumber,
tag_ids: propsValue.tagIds,
custom_attributes: propsValue.customAttributes
},
};
const response = await clickfunnelsApiService.upsertContact(auth.props, propsValue.workspaceId as string, payload);
return response
},
});

View File

@@ -0,0 +1,56 @@
import { PieceAuth, Property } from "@activepieces/pieces-framework";
import { clickfunnelsApiService } from "./requests";
export const CLICKFUNNELS_BASE_URL = (subdomain: string) => `https://${subdomain}.myclickfunnels.com/api/v2`;
export const API_ENDPOINTS = {
ME: '/me',
TEAMS: '/teams',
WORKSPACES: '/workspaces',
PIPELINES: '/sales/pipelines',
CONTACTS: '/contacts',
COURSES: '/courses',
TAGS: '/tags',
};
export type CLICKFUNNELS_APIKEY_AUTH = {
subdomain: string;
apiKey: string;
};
export const clickfunnelsAuth = PieceAuth.CustomAuth({
description: 'Enter your ClickFunnels subdomain and API key.',
required: true,
props: {
subdomain: Property.ShortText({
displayName: 'Subdomain',
description:
'Your ClickFunnels subdomain (e.g., if your URL is https://mycompany.myclickfunnels.com, enter "mycompany").',
required: true,
}),
apiKey: PieceAuth.SecretText({
displayName: 'API Key',
description:
'Your ClickFunnels API key. You can find this in your ClickFunnels account settings.',
required: true,
}),
},
validate: async ({ auth }) => {
try {
await clickfunnelsApiService.fetchCurrentlyLoggedInUser(auth).catch((err) => {
throw new Error("something went wrong. Please check your username and API key and try again.")
})
return {
valid: true,
};
} catch (error) {
return {
valid: false,
error: `Connection failed: ${
error instanceof Error ? error.message : 'Unknown error'
}`,
};
}
},
});

View File

@@ -0,0 +1,474 @@
import { Property } from '@activepieces/pieces-framework';
import { clickfunnelsApiService } from './requests';
import { clickfunnelsAuth } from './constants';
export const teamsDropdown = (refreshers: string[]) =>
Property.Dropdown({
displayName: 'Team',
description: 'Select the team',
required: true,
refreshers,
auth: clickfunnelsAuth,
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please connect your ClickFunnels account first',
};
}
try {
const response = await clickfunnelsApiService.fetchTeams(auth.props);
return {
options: response.map((team: any) => ({
label: team.name,
value: team.id,
})),
};
} catch (error) {
return {
disabled: true,
options: [],
placeholder:
'Failed to load teams. Please check your authentication.',
};
}
},
});
export const coursesDropdown = (refreshers: string[]) =>
Property.Dropdown({
auth: clickfunnelsAuth,
displayName: 'Course',
description: 'Select a course',
required: true,
refreshers,
options: async ({ auth, workspaceId }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please connect your ClickFunnels account first',
};
}
if (!workspaceId) {
return {
disabled: true,
options: [],
placeholder: 'Please select a workspace first',
};
}
try {
const courses = await clickfunnelsApiService.fetchCourses(
auth.props,
workspaceId as string
);
return {
options: courses.map((course: any) => ({
label: course.title,
value: course.id,
})),
};
} catch (error) {
return {
disabled: true,
options: [],
placeholder:
'Failed to load teams. Please check your authentication.',
};
}
},
});
export const teamMembershipsDropdown = (
refreshers: string[],
required = true
) =>
Property.Dropdown({
auth: clickfunnelsAuth,
displayName: 'Assignee',
description: 'Select an assignee on your team',
required,
refreshers,
options: async ({ auth, teamId }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please connect your ClickFunnels account first',
};
}
if (!teamId) {
return {
disabled: true,
options: [],
placeholder: 'Please select a team first',
};
}
try {
const response = await clickfunnelsApiService.fetchTeam(auth.props, teamId as string);
return {
options: [
{ label: 'Leave Unassigned', value: null },
...response.memberships,
].map((membership) => {
if (membership.label) {
return {
label: membership.label,
value: membership.value,
};
}
return {
label: `${membership.user.first_name} ${membership.user.last_name}`,
value: membership.id,
};
}),
};
} catch (error) {
return {
disabled: true,
options: [],
placeholder:
'Failed to load team members. Please check your authentication.',
};
}
},
});
export const workspacesDropdown = (refreshers: string[]) =>
Property.Dropdown({
auth: clickfunnelsAuth,
displayName: 'Workspace',
description: 'Select the workspace',
required: true,
refreshers,
options: async ({ auth, teamId }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please connect your ClickFunnels account first',
};
}
if (!teamId) {
return {
disabled: true,
options: [],
placeholder: 'Please select a team first',
};
}
try {
const workspaces = await clickfunnelsApiService.fetchWorkspaces(
auth.props,
teamId as string
);
return {
options: workspaces.map((workspace: any) => ({
label: workspace.name,
value: workspace.id,
})),
};
} catch (error) {
return {
disabled: true,
options: [],
placeholder:
'Failed to load workspaces. Please check your authentication.',
};
}
},
});
export const pipelinesDropdown = (refreshers: string[]) =>
Property.Dropdown({
auth: clickfunnelsAuth,
displayName: 'Pipeline',
description: 'Select a pipeline',
required: true,
refreshers,
options: async ({ auth, workspaceId }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please connect your ClickFunnels account first',
};
}
if (!workspaceId) {
return {
disabled: true,
options: [],
placeholder: 'Please select a workspace first',
};
}
try {
const pipelines = await clickfunnelsApiService.fetchPipelines(
auth.props,
workspaceId as string
);
return {
options: pipelines.map((pipeline: any) => ({
label: pipeline.name,
value: pipeline.id,
})),
};
} catch (error) {
return {
disabled: true,
options: [],
placeholder:
'Failed to load pipelines. Please check your authentication.',
};
}
},
});
export const pipelineStagesDropdown = (refreshers: string[]) =>
Property.Dropdown({
auth: clickfunnelsAuth,
displayName: 'Pipeline Stage',
description: 'Select a pipeline stage.',
required: true,
refreshers,
options: async ({ auth, pipelineId }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please connect your ClickFunnels account first',
};
}
if (!pipelineId) {
return {
disabled: true,
options: [],
placeholder: 'Please select a pipeline first',
};
}
try {
const pipelineStages = await clickfunnelsApiService.fetchPipelineStages(
auth.props,
pipelineId as string
);
return {
options: pipelineStages.map((pipelineStage: any) => ({
label: pipelineStage.name,
value: pipelineStage.id,
})),
};
} catch (error) {
return {
disabled: true,
options: [],
placeholder:
'Failed to load pipeline stages. Please check your authentication.',
};
}
},
});
export const contactsDropdown = (refreshers: string[]) =>
Property.Dropdown({
auth: clickfunnelsAuth,
displayName: 'Contact',
description: 'Select a contact',
required: true,
refreshers,
options: async ({ auth, workspaceId }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please connect your ClickFunnels account first',
};
}
if (!workspaceId) {
return {
disabled: true,
options: [],
placeholder: 'Please select a workspace first',
};
}
try {
const contacts = await clickfunnelsApiService.fetchContacts(
auth.props,
workspaceId as string
);
return {
options: contacts.map((contact: any) => ({
label: (() => {
const firstName = contact.first_name || '';
const lastName = contact.last_name || '';
const fullName = `${firstName} ${lastName}`.trim();
return (
fullName ||
contact.email_address ||
contact.phone_number ||
'Unknown Contact'
);
})(),
value: contact.id,
})),
};
} catch (error) {
return {
disabled: true,
options: [],
placeholder:
'Failed to load contacts. Please check your authentication.',
};
}
},
});
export const tagsDropdown = (refreshers: string[]) =>
Property.Dropdown({
auth: clickfunnelsAuth,
displayName: 'Tag',
description: 'Select a tag to apply',
required: true,
refreshers,
options: async ({ auth, workspaceId }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please connect your ClickFunnels account first',
};
}
if (!workspaceId) {
return {
disabled: true,
options: [],
placeholder: 'Please select a workspace first',
};
}
try {
const tags = await clickfunnelsApiService.fetchTags(auth.props, workspaceId as string);
return {
options: tags.map((tag: any) => ({
label: tag.name,
value: tag.id,
})),
};
} catch (error) {
return {
disabled: true,
options: [],
placeholder: 'Failed to load tags. Please check your authentication.',
};
}
},
});
export const multiTagsDropdown = (refreshers: string[]) =>
Property.MultiSelectDropdown({
auth: clickfunnelsAuth,
displayName: 'Tag',
description: 'Select tags to apply',
required: false,
refreshers,
options: async ({ auth, workspaceId }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please connect your ClickFunnels account first',
};
}
if (!workspaceId) {
return {
disabled: true,
options: [],
placeholder: 'Please select a workspace first',
};
}
try {
const tags = await clickfunnelsApiService.fetchTags(auth.props, workspaceId as string);
return {
options: tags.map((tag: any) => ({
label: tag.name,
value: tag.id,
})),
};
} catch (error) {
return {
disabled: true,
options: [],
placeholder: 'Failed to load tags. Please check your authentication.',
};
}
},
});
export const appliedTagsDropdown = (refreshers: string[]) =>
Property.Dropdown({
auth: clickfunnelsAuth,
displayName: 'Tag',
description: 'Select a tag',
required: true,
refreshers,
options: async ({ auth, contactId }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please connect your ClickFunnels account first',
};
}
if (!contactId) {
return {
disabled: true,
options: [],
placeholder: 'Please select a contact first',
};
}
try {
const tags = await clickfunnelsApiService.fetchAppliedTags(
auth.props,
contactId as string
);
return {
options: tags.map((tag: any) => ({
label: tag.tag.name,
value: tag.id,
})),
};
} catch (error) {
return {
disabled: true,
options: [],
placeholder: 'Failed to load tags. Please check your authentication.',
};
}
},
});

View File

@@ -0,0 +1,245 @@
import { HttpMethod, httpClient } from '@activepieces/pieces-common';
import {
API_ENDPOINTS,
CLICKFUNNELS_BASE_URL,
CLICKFUNNELS_APIKEY_AUTH,
} from './constants';
async function fireHttpRequest<T>({
method,
auth,
path,
body,
}: {
auth: CLICKFUNNELS_APIKEY_AUTH;
method: HttpMethod;
path: string;
body?: unknown;
}) {
const BASE_URL = CLICKFUNNELS_BASE_URL(auth.subdomain);
return await httpClient
.sendRequest({
method,
url: `${BASE_URL}${path}`,
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
Authorization: `Bearer ${auth.apiKey}`,
},
body,
})
.then((res) => res.body);
}
export const clickfunnelsApiService = {
fetchCurrentlyLoggedInUser: async (auth: CLICKFUNNELS_APIKEY_AUTH) => {
const response = await fireHttpRequest({
method: HttpMethod.GET,
auth,
path: API_ENDPOINTS.ME,
});
return response;
},
fetchTeams: async (auth: CLICKFUNNELS_APIKEY_AUTH) => {
const response = await fireHttpRequest({
method: HttpMethod.GET,
auth,
path: API_ENDPOINTS.TEAMS,
});
return response;
},
fetchTeam: async (auth: CLICKFUNNELS_APIKEY_AUTH, teamId: string) => {
const response = await fireHttpRequest({
method: HttpMethod.GET,
auth,
path: `${API_ENDPOINTS.TEAMS}/${teamId}`,
});
return response;
},
fetchWorkspaces: async (auth: CLICKFUNNELS_APIKEY_AUTH, teamId: string) => {
const response = await fireHttpRequest({
method: HttpMethod.GET,
auth,
path: `${API_ENDPOINTS.TEAMS}/${teamId}${API_ENDPOINTS.WORKSPACES}`,
});
return response;
},
fetchContacts: async (
auth: CLICKFUNNELS_APIKEY_AUTH,
workspaceId: string
) => {
const response = await fireHttpRequest({
method: HttpMethod.GET,
auth,
path: `${API_ENDPOINTS.WORKSPACES}/${workspaceId}${API_ENDPOINTS.CONTACTS}`,
});
return response;
},
fetchContactByEmailSearch: async (
auth: CLICKFUNNELS_APIKEY_AUTH,
workspaceId: string,
filterQuery: string
) => {
const isEmail = filterQuery.includes('@');
const filterParam = isEmail
? `filter[email_address]=${encodeURIComponent(filterQuery)}`
: `filter[id]=${encodeURIComponent(filterQuery)}`;
const response = await fireHttpRequest({
method: HttpMethod.GET,
auth,
path: `${API_ENDPOINTS.WORKSPACES}/${workspaceId}${API_ENDPOINTS.CONTACTS}?${filterParam}`,
});
return response;
},
upsertContact: async (
auth: CLICKFUNNELS_APIKEY_AUTH,
workspaceId: string,
payload: any
) => {
const response = await fireHttpRequest({
method: HttpMethod.POST,
auth,
path: `${API_ENDPOINTS.WORKSPACES}/${workspaceId}${API_ENDPOINTS.CONTACTS}/upsert`,
body: payload,
});
return response;
},
fetchTags: async (auth: CLICKFUNNELS_APIKEY_AUTH, workspaceId: string) => {
const response = await fireHttpRequest({
method: HttpMethod.GET,
auth,
path: `${API_ENDPOINTS.WORKSPACES}/${workspaceId}${API_ENDPOINTS.CONTACTS}${API_ENDPOINTS.TAGS}`,
});
return response;
},
fetchCourses: async (auth: CLICKFUNNELS_APIKEY_AUTH, workspaceId: string) => {
const response = await fireHttpRequest({
method: HttpMethod.GET,
auth,
path: `${API_ENDPOINTS.WORKSPACES}/${workspaceId}${API_ENDPOINTS.COURSES}`,
});
return response;
},
createCourseEnrollment: async (
auth: CLICKFUNNELS_APIKEY_AUTH,
courseId: string,
payload: any
) => {
const response = await fireHttpRequest({
method: HttpMethod.POST,
auth,
path: `${API_ENDPOINTS.COURSES}/${courseId}/enrollments`,
body: payload
});
return response;
},
fetchAppliedTags: async (
auth: CLICKFUNNELS_APIKEY_AUTH,
contactId: string
) => {
const response = await fireHttpRequest({
method: HttpMethod.GET,
auth,
path: `${API_ENDPOINTS.CONTACTS}/${contactId}/applied_tags`,
});
return response;
},
removeAppliedTags: async (auth: CLICKFUNNELS_APIKEY_AUTH, tagId: string) => {
const response = await fireHttpRequest({
method: HttpMethod.DELETE,
auth,
path: `${API_ENDPOINTS.CONTACTS}/applied_tags/${tagId}`,
});
return response;
},
fetchPipelines: async (
auth: CLICKFUNNELS_APIKEY_AUTH,
workspaceId: string
) => {
const response = await fireHttpRequest({
method: HttpMethod.GET,
auth,
path: `${API_ENDPOINTS.WORKSPACES}/${workspaceId}${API_ENDPOINTS.PIPELINES}`,
});
return response;
},
fetchPipelineStages: async (
auth: CLICKFUNNELS_APIKEY_AUTH,
pipelineId: string
) => {
const response = await fireHttpRequest({
method: HttpMethod.GET,
auth,
path: `${API_ENDPOINTS.PIPELINES}/${pipelineId}/stages`,
});
return response;
},
createOpportunity: async (
auth: CLICKFUNNELS_APIKEY_AUTH,
workspaceId: string,
payload: any
) => {
const response = await fireHttpRequest({
method: HttpMethod.POST,
auth,
path: `${API_ENDPOINTS.WORKSPACES}/${workspaceId}/sales/opportunities`,
body: payload,
});
return response;
},
createAppliedTag: async (
auth: CLICKFUNNELS_APIKEY_AUTH,
contactId: string,
payload: any
) => {
const response = await fireHttpRequest({
method: HttpMethod.POST,
auth,
path: `${API_ENDPOINTS.CONTACTS}/${contactId}/applied_tags`,
body: payload,
});
return response;
},
createWebhook: async (
auth: CLICKFUNNELS_APIKEY_AUTH,
workspaceId: string,
payload: any
) => {
const response = await fireHttpRequest({
method: HttpMethod.POST,
auth,
path: `${API_ENDPOINTS.WORKSPACES}/${workspaceId}/webhooks/outgoing/endpoints`,
body: payload,
});
return response;
},
deleteWebhook: async (auth: CLICKFUNNELS_APIKEY_AUTH, webhookId: string) => {
const response = await fireHttpRequest({
method: HttpMethod.DELETE,
auth,
path: `/webhooks/outgoing/endpoints/${webhookId}`,
});
return response;
},
};

View File

@@ -0,0 +1,64 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { clickfunnelsAuth } from '../common/constants';
import { teamsDropdown, workspacesDropdown } from '../common/props';
import { clickfunnelsApiService } from '../common/requests';
const CACHE_KEY = 'clickfunnels_contact_completed_course_trigger';
const MODULE_NAME = 'Contact Completed Course';
export const contactCompletedCourse = createTrigger({
auth: clickfunnelsAuth,
name: 'contactCompletedCourse',
displayName: MODULE_NAME,
description: 'Triggers when a contact completes a course.',
props: {
teamId: teamsDropdown(['auth']),
workspaceId: workspacesDropdown(['auth', 'teamId']),
},
sampleData: {},
type: TriggerStrategy.WEBHOOK,
async onEnable({ auth, webhookUrl, propsValue: { workspaceId }, store }) {
if (!workspaceId) {
throw new Error('Workspace ID is required. Please select a workspace.');
}
try {
const response: any = await clickfunnelsApiService.createWebhook(
auth.props,
workspaceId as string,
{
webhooks_outgoing_endpoint: {
url: webhookUrl,
name: `ActivePieces ${MODULE_NAME} Webhook - ${Date.now()}`,
event_type_ids: ['courses/enrollment.course_completed'],
},
}
);
const webhookId = response.id;
await store.put(CACHE_KEY, { webhookId });
} catch (error) {
console.error('Failed to create ClickFunnels webhook:', error);
throw new Error(
`Failed to create webhook: ${
error instanceof Error ? error.message : 'Unknown error'
}`
);
}
},
async onDisable({ auth, store }) {
const cachedData = (await store.get(CACHE_KEY)) as any;
if (cachedData) {
await clickfunnelsApiService
.deleteWebhook(auth.props, cachedData.webhookId)
.then(async () => {
await store.delete(CACHE_KEY);
});
}
},
async run(context) {
return [context.payload.body];
},
});

View File

@@ -0,0 +1,64 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { clickfunnelsAuth } from '../common/constants';
import { teamsDropdown, workspacesDropdown } from '../common/props';
import { clickfunnelsApiService } from '../common/requests';
const CACHE_KEY = 'clickfunnels_contact_identified_trigger';
const MODULE_NAME = 'Contact Identified';
export const contactIdentified = createTrigger({
auth: clickfunnelsAuth,
name: 'contactIdentified',
displayName: MODULE_NAME,
description: 'Triggers when a new contact is identified by email/phone.',
props: {
teamId: teamsDropdown(['auth']),
workspaceId: workspacesDropdown(['auth', 'teamId']),
},
sampleData: {},
type: TriggerStrategy.WEBHOOK,
async onEnable({ auth, webhookUrl, propsValue: { workspaceId }, store }) {
if (!workspaceId) {
throw new Error('Workspace ID is required. Please select a workspace.');
}
try {
const response: any = await clickfunnelsApiService.createWebhook(
auth.props,
workspaceId as string,
{
webhooks_outgoing_endpoint: {
url: webhookUrl,
name: `ActivePieces ${MODULE_NAME} Webhook - ${Date.now()}`,
event_type_ids: ['contact.identified'],
},
}
);
const webhookId = response.id;
await store.put(CACHE_KEY, { webhookId });
} catch (error) {
console.error('Failed to create ClickFunnels webhook:', error);
throw new Error(
`Failed to create webhook: ${
error instanceof Error ? error.message : 'Unknown error'
}`
);
}
},
async onDisable({ auth, store }) {
const cachedData = (await store.get(CACHE_KEY)) as any;
if (cachedData) {
await clickfunnelsApiService
.deleteWebhook(auth.props, cachedData.webhookId)
.then(async () => {
await store.delete(CACHE_KEY);
});
}
},
async run(context) {
return [context.payload.body];
},
});

View File

@@ -0,0 +1,64 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { clickfunnelsAuth } from '../common/constants';
import { teamsDropdown, workspacesDropdown } from '../common/props';
import { clickfunnelsApiService } from '../common/requests';
const CACHE_KEY = 'clickfunnels_contact_submitted_form_trigger';
const MODULE_NAME = 'Contact Submitted Form';
export const contactSubmittedForm = createTrigger({
auth: clickfunnelsAuth,
name: 'contactSubmittedForm',
displayName: MODULE_NAME,
description: 'Triggers each time a contact submits a form (opt-in or order).',
props: {
teamId: teamsDropdown(['auth']),
workspaceId: workspacesDropdown(['auth', 'teamId']),
},
sampleData: {},
type: TriggerStrategy.WEBHOOK,
async onEnable({ auth, webhookUrl, propsValue: { workspaceId }, store }) {
if (!workspaceId) {
throw new Error('Workspace ID is required. Please select a workspace.');
}
try {
const response: any = await clickfunnelsApiService.createWebhook(
auth.props,
workspaceId as string,
{
webhooks_outgoing_endpoint: {
url: webhookUrl,
name: `ActivePieces ${MODULE_NAME} Webhook - ${Date.now()}`,
event_type_ids: ['form_submission.created'],
},
}
);
const webhookId = response.id;
await store.put(CACHE_KEY, { webhookId });
} catch (error) {
console.error('Failed to create ClickFunnels webhook:', error);
throw new Error(
`Failed to create webhook: ${
error instanceof Error ? error.message : 'Unknown error'
}`
);
}
},
async onDisable({ auth, store }) {
const cachedData = (await store.get(CACHE_KEY)) as any;
if (cachedData) {
await clickfunnelsApiService
.deleteWebhook(auth.props, cachedData.webhookId)
.then(async () => {
await store.delete(CACHE_KEY);
});
}
},
async run(context) {
return [context.payload.body];
},
});

View File

@@ -0,0 +1,64 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { clickfunnelsAuth } from '../common/constants';
import { teamsDropdown, workspacesDropdown } from '../common/props';
import { clickfunnelsApiService } from '../common/requests';
const CACHE_KEY = 'clickfunnels_contact_suspended_from_course_trigger';
const MODULE_NAME = 'Contact Suspended';
export const contactSuspendedFromCourse = createTrigger({
auth: clickfunnelsAuth,
name: 'contactSuspendedFromCourse',
displayName: `${MODULE_NAME} From Course`,
description: 'Triggers when a contact is suspended from a course.',
props: {
teamId: teamsDropdown(['auth']),
workspaceId: workspacesDropdown(['auth', 'teamId']),
},
sampleData: {},
type: TriggerStrategy.WEBHOOK,
async onEnable({ auth, webhookUrl, propsValue: { workspaceId }, store }) {
if (!workspaceId) {
throw new Error('Workspace ID is required. Please select a workspace.');
}
try {
const response: any = await clickfunnelsApiService.createWebhook(
auth.props,
workspaceId as string,
{
webhooks_outgoing_endpoint: {
url: webhookUrl,
name: `ActivePieces ${MODULE_NAME} Webhook - ${Date.now()}`,
event_type_ids: ['courses/enrollment.suspended'],
},
}
);
const webhookId = response.id;
await store.put(CACHE_KEY, { webhookId });
} catch (error) {
console.error('Failed to create ClickFunnels webhook:', error);
throw new Error(
`Failed to create webhook: ${
error instanceof Error ? error.message : 'Unknown error'
}`
);
}
},
async onDisable({ auth, store }) {
const cachedData = (await store.get(CACHE_KEY)) as any;
if (cachedData) {
await clickfunnelsApiService
.deleteWebhook(auth.props, cachedData.webhookId)
.then(async () => {
await store.delete(CACHE_KEY);
});
}
},
async run(context) {
return [context.payload.body];
},
});

View File

@@ -0,0 +1,64 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { clickfunnelsAuth } from '../common/constants';
import { teamsDropdown, workspacesDropdown } from '../common/props';
import { clickfunnelsApiService } from '../common/requests';
const CACHE_KEY = 'clickfunnels_course_enrollment_created_for_contact_trigger';
const MODULE_NAME = 'Course Enrollment Created';
export const courseEnrollmentCreatedForContact = createTrigger({
auth: clickfunnelsAuth,
name: 'courseEnrollmentCreatedForContact',
displayName: `${MODULE_NAME} for contact`,
description: 'Triggers when a course enrollment is created for a contact.',
props: {
teamId: teamsDropdown(['auth']),
workspaceId: workspacesDropdown(['auth', 'teamId']),
},
sampleData: {},
type: TriggerStrategy.WEBHOOK,
async onEnable({ auth, webhookUrl, propsValue: { workspaceId }, store }) {
if (!workspaceId) {
throw new Error('Workspace ID is required. Please select a workspace.');
}
try {
const response: any = await clickfunnelsApiService.createWebhook(
auth.props,
workspaceId as string,
{
webhooks_outgoing_endpoint: {
url: webhookUrl,
name: `ActivePieces ${MODULE_NAME} Webhook - ${Date.now()}`,
event_type_ids: ['courses/enrollment.created'],
},
}
);
const webhookId = response.id;
await store.put(CACHE_KEY, { webhookId });
} catch (error) {
console.error('Failed to create ClickFunnels webhook:', error);
throw new Error(
`Failed to create webhook: ${
error instanceof Error ? error.message : 'Unknown error'
}`
);
}
},
async onDisable({ auth, store }) {
const cachedData = (await store.get(CACHE_KEY)) as any;
if (cachedData) {
await clickfunnelsApiService
.deleteWebhook(auth.props, cachedData.webhookId)
.then(async () => {
await store.delete(CACHE_KEY);
});
}
},
async run(context) {
return [context.payload.body];
},
});

View File

@@ -0,0 +1,64 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { clickfunnelsAuth } from '../common/constants';
import { teamsDropdown, workspacesDropdown } from '../common/props';
import { clickfunnelsApiService } from '../common/requests';
const CACHE_KEY = 'clickfunnels_onetime_order_paid_trigger';
const MODULE_NAME = 'One-Time Order Paid';
export const oneTimeOrderPaid = createTrigger({
auth: clickfunnelsAuth,
name: 'OneTimeOrderPaid',
displayName: MODULE_NAME,
description: 'Triggers when a customer pays a one-time order.',
props: {
teamId: teamsDropdown(['auth']),
workspaceId: workspacesDropdown(['auth', 'teamId']),
},
sampleData: {},
type: TriggerStrategy.WEBHOOK,
async onEnable({ auth, webhookUrl, propsValue: { workspaceId }, store }) {
if (!workspaceId) {
throw new Error('Workspace ID is required. Please select a workspace.');
}
try {
const response: any = await clickfunnelsApiService.createWebhook(
auth.props,
workspaceId as string,
{
webhooks_outgoing_endpoint: {
url: webhookUrl,
name: `ActivePieces ${MODULE_NAME} Webhook - ${Date.now()}`,
event_type_ids: ['one-time-order.completed'],
},
}
);
const webhookId = response.id;
await store.put(CACHE_KEY, { webhookId });
} catch (error) {
console.error('Failed to create ClickFunnels webhook:', error);
throw new Error(
`Failed to create webhook: ${
error instanceof Error ? error.message : 'Unknown error'
}`
);
}
},
async onDisable({ auth, store }) {
const cachedData = (await store.get(CACHE_KEY)) as any;
if (cachedData) {
await clickfunnelsApiService
.deleteWebhook(auth.props, cachedData.webhookId)
.then(async () => {
await store.delete(CACHE_KEY);
});
}
},
async run(context) {
return [context.payload.body];
},
});

View File

@@ -0,0 +1,64 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { clickfunnelsAuth } from '../common/constants';
import { teamsDropdown, workspacesDropdown } from '../common/props';
import { clickfunnelsApiService } from '../common/requests';
const CACHE_KEY = 'clickfunnels_scheduled_appointment_event_created_trigger';
const MODULE_NAME = 'Scheduled Appointment Event';
export const scheduledAppointmentEventCreated = createTrigger({
auth: clickfunnelsAuth,
name: 'scheduledAppointmentEventCreated',
displayName: `${MODULE_NAME} Created`,
description: 'Triggers when a scheduled appointment event is created.',
props: {
teamId: teamsDropdown(['auth']),
workspaceId: workspacesDropdown(['auth', 'teamId']),
},
sampleData: {},
type: TriggerStrategy.WEBHOOK,
async onEnable({ auth, webhookUrl, propsValue: { workspaceId }, store }) {
if (!workspaceId) {
throw new Error('Workspace ID is required. Please select a workspace.');
}
try {
const response: any = await clickfunnelsApiService.createWebhook(
auth.props,
workspaceId as string,
{
webhooks_outgoing_endpoint: {
url: webhookUrl,
name: `ActivePieces ${MODULE_NAME} Webhook - ${Date.now()}`,
event_type_ids: ['appointments/scheduled_event.created'],
},
}
);
const webhookId = response.id;
await store.put(CACHE_KEY, { webhookId });
} catch (error) {
console.error('Failed to create ClickFunnels webhook:', error);
throw new Error(
`Failed to create webhook: ${
error instanceof Error ? error.message : 'Unknown error'
}`
);
}
},
async onDisable({ auth, store }) {
const cachedData = (await store.get(CACHE_KEY)) as any;
if (cachedData) {
await clickfunnelsApiService
.deleteWebhook(auth.props, cachedData.webhookId)
.then(async () => {
await store.delete(CACHE_KEY);
});
}
},
async run(context) {
return [context.payload.body];
},
});

View File

@@ -0,0 +1,64 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { clickfunnelsAuth } from '../common/constants';
import { teamsDropdown, workspacesDropdown } from '../common/props';
import { clickfunnelsApiService } from '../common/requests';
const CACHE_KEY = 'clickfunnels_subscription_invoice_paid_trigger';
const MODULE_NAME = 'Subscription Invoice Paid';
export const subscriptionInvoicePaid = createTrigger({
auth: clickfunnelsAuth,
name: 'subscriptionInvoicePaid',
displayName: MODULE_NAME,
description: 'Triggers when a subscription invoice is paid.',
props: {
teamId: teamsDropdown(['auth']),
workspaceId: workspacesDropdown(['auth', 'teamId']),
},
sampleData: {},
type: TriggerStrategy.WEBHOOK,
async onEnable({ auth, webhookUrl, propsValue: { workspaceId }, store }) {
if (!workspaceId) {
throw new Error('Workspace ID is required. Please select a workspace.');
}
try {
const response: any = await clickfunnelsApiService.createWebhook(
auth.props,
workspaceId as string,
{
webhooks_outgoing_endpoint: {
url: webhookUrl,
name: `ActivePieces ${MODULE_NAME} Webhook - ${Date.now()}`,
event_type_ids: ['subscription.invoice.paid'],
},
}
);
const webhookId = response.id;
await store.put(CACHE_KEY, { webhookId });
} catch (error) {
console.error('Failed to create ClickFunnels webhook:', error);
throw new Error(
`Failed to create webhook: ${
error instanceof Error ? error.message : 'Unknown error'
}`
);
}
},
async onDisable({ auth, store }) {
const cachedData = (await store.get(CACHE_KEY)) as any;
if (cachedData) {
await clickfunnelsApiService
.deleteWebhook(auth.props, cachedData.webhookId)
.then(async () => {
await 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"]
}