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:
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"extends": [
|
||||
"../../../../.eslintrc.base.json"
|
||||
],
|
||||
"ignorePatterns": [
|
||||
"!**/*"
|
||||
],
|
||||
"overrides": [
|
||||
{
|
||||
"files": [
|
||||
"*.ts",
|
||||
"*.tsx",
|
||||
"*.js",
|
||||
"*.jsx"
|
||||
],
|
||||
"rules": {}
|
||||
},
|
||||
{
|
||||
"files": [
|
||||
"*.ts",
|
||||
"*.tsx"
|
||||
],
|
||||
"rules": {}
|
||||
},
|
||||
{
|
||||
"files": [
|
||||
"*.js",
|
||||
"*.jsx"
|
||||
],
|
||||
"rules": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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.
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 doesn’t 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."
|
||||
}
|
||||
@@ -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 doesn’t 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."
|
||||
}
|
||||
@@ -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 doesn’t 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."
|
||||
}
|
||||
@@ -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 doesn’t 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.": "連絡先がコースから中断されたときに発生します。"
|
||||
}
|
||||
@@ -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 doesn’t 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."
|
||||
}
|
||||
@@ -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 doesn’t 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."
|
||||
}
|
||||
@@ -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 doesn’t already exist.": "Apply a tag to a contact if it doesn’t 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."
|
||||
}
|
||||
@@ -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 doesn’t already exist.": "Apply a tag to a contact if it doesn’t 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."
|
||||
}
|
||||
@@ -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,
|
||||
],
|
||||
});
|
||||
@@ -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 doesn’t 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;
|
||||
},
|
||||
});
|
||||
@@ -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;
|
||||
},
|
||||
});
|
||||
@@ -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;
|
||||
},
|
||||
});
|
||||
@@ -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"
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -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;
|
||||
},
|
||||
});
|
||||
@@ -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
|
||||
},
|
||||
});
|
||||
@@ -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'
|
||||
}`,
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -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.',
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -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;
|
||||
},
|
||||
};
|
||||
@@ -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];
|
||||
},
|
||||
});
|
||||
@@ -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];
|
||||
},
|
||||
});
|
||||
@@ -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];
|
||||
},
|
||||
});
|
||||
@@ -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];
|
||||
},
|
||||
});
|
||||
@@ -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];
|
||||
},
|
||||
});
|
||||
@@ -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];
|
||||
},
|
||||
});
|
||||
@@ -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];
|
||||
},
|
||||
});
|
||||
@@ -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];
|
||||
},
|
||||
});
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"extends": "./tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "../../../../dist/out-tsc",
|
||||
"declaration": true,
|
||||
"types": ["node"]
|
||||
},
|
||||
"include": ["src/**/*.ts"]
|
||||
}
|
||||
Reference in New Issue
Block a user