Add Activepieces integration for workflow automation

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

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

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

View File

@@ -0,0 +1,80 @@
{
"Systeme.io is a CRM platform that allows you to manage your contacts, sales, and marketing campaigns.": "Systeme.io ist eine CRM-Plattform, mit der Sie Ihre Kontakte, Verkäufe und Marketing-Kampagnen verwalten können.",
"Your Systeme.io API key. You can find this in your Systeme.io dashboard under Profile Settings > Public API Keys.": "Ihr Systeme.io API-Schlüssel. Diesen finden Sie in Ihrem System-Dashboard unter Profileinstellungen > Öffentliche API-Schlüssel.",
"Create Contact": "Kontakt erstellen",
"Add Tag to Contact": "Tag zu Kontakt hinzufügen",
"Remove Tag from Contact": "Tag vom Kontakt entfernen",
"Find Contact by Email": "Kontakt per E-Mail finden",
"Update Contact": "Kontakt aktualisieren",
"Create a new contact with email and contact fields from your Systeme.io account, with optional tags": "Erstellen Sie einen neuen Kontakt mit E-Mail und Kontaktfeldern aus Ihrem Systeme.io Konto mit optionalen Tags",
"Assign a tag to an existing contact - select an existing tag or create a new one": "Ein Schlagwort einem bestehenden Kontakt zuweisen - Wählen Sie ein bestehendes Schlagwort oder erstellen Sie ein neues Schlagwort",
"Remove a tag that is currently assigned to an existing contact": "Entfernen Sie ein Schlagwort, das derzeit einem bestehenden Kontakt zugewiesen ist",
"Locate an existing contact by email address": "Einen bestehenden Kontakt per E-Mail-Adresse suchen",
"Update fields (name, phone, custom fields) of an existing contact using fields from your Systeme.io account": "Felder (Name, Telefon, benutzerdefinierte Felder) eines bestehenden Kontakts mit den Feldern Ihres Systeme.io Kontos aktualisieren",
"Email": "E-Mail",
"Language": "Sprache",
"Contact Fields": "Kontaktfelder",
"Custom Contact Fields": "Eigene Kontaktfelder",
"Tag Source": "Tag-Quelle",
"Existing Tags": "Vorhandene Tags",
"New Tag Names": "Neue Tag-Namen",
"Contact ID": "Kontakt-ID",
"Existing Tag": "Bestehendes Tag",
"New Tag Name": "Neuer Tag-Name",
"Tag to Remove": "Tag zum Entfernen",
"Custom Fields (Manual Entry)": "Benutzerdefinierte Felder (Manuelle Eintragung)",
"Contact email address": "Kontaktadresse",
"Contact preferred language": "Bevorzugte Sprache kontaktieren",
"Set contact fields from your Systeme.io account": "Legen Sie Kontaktfelder von Ihrem Systeme.io Konto fest",
"Add custom contact field values (e.g., country, company, etc.)": "Fügen Sie benutzerdefinierte Kontaktfelder hinzu (z.B. Land, Unternehmen, etc.)",
"Choose how to handle tags for this contact": "Wählen Sie, wie Tags für diesen Kontakt behandelt werden sollen",
"Select existing tags to assign": "Vorhandene Tags zum Zuweisen auswählen",
"Enter names for new tags to create and assign (only used when \"Create New Tags\" is selected)": "Geben Sie Namen für neue Tags zum Erstellen und Zuweisen ein (wird nur verwendet, wenn \"Neue Tags erstellen\" ausgewählt ist)",
"Select a contact by ID": "Kontakt per ID auswählen",
"Choose whether to use an existing tag or create a new one": "Wählen Sie, ob ein bestehendes Schlagwort verwendet oder ein neues erstellt werden soll",
"Select an existing tag": "Vorhandenen Tag auswählen",
"Enter the name for the new tag (only used when \"Create New Tag\" is selected)": "Geben Sie den Namen für das neue Tag ein (wird nur verwendet, wenn \"Neues Tag erstellen\" ausgewählt ist)",
"Select a tag currently assigned to this contact": "Wählen Sie ein Schlagwort, das derzeit diesem Kontakt zugewiesen ist",
"The email address to search for": "Die zu suchende E-Mail-Adresse",
"Select which contact fields to update": "Wählen Sie die zu aktualisierenden Kontaktfelder",
"Add or update custom fields with manual slug entry (use empty value to clear field)": "Füge benutzerdefinierte Felder mit manuellem Slug hinzu oder aktualisiere (leerer Wert zum Löschen des Feldes)",
"English": "Englisch",
"French": "Französisch",
"Spanish": "Spanisch",
"Italian": "Italienisch",
"Portuguese": "Portugiesisch",
"German": "Deutsch",
"Dutch": "Niederländisch",
"Russian": "Russisch",
"Japanese": "Japanisch",
"Turkish": "Türkisch",
"Arabic": "Arabisch",
"Chinese": "Chinesisch",
"Swedish": "Schwedisch",
"Romanian": "Rumänisch",
"Czech": "Tschechisch",
"Hungarian": "Ungarisch",
"Slovak": "Slowakisch",
"Danish": "Dänisch",
"Indonesian": "Indonesisch",
"Polish": "Polnisch",
"Greek": "Griechisch",
"Serbian": "Serbisch",
"Hindi": "Hannah",
"Norwegian": "Norwegisch",
"Thai": "Thailändisch",
"Albanian": "Albanisch",
"Slovenian": "Slovenian",
"Ukrainian": "Ukrainische",
"No Tags": "Keine Tags",
"Use Existing Tags": "Vorhandene Tags verwenden",
"Create New Tags": "Neue Tags erstellen",
"Use Existing Tag": "Bestehendes Tag verwenden",
"Create New Tag": "Neues Tag erstellen",
"New Contact": "Neuer Kontakt",
"New Sale": "Neuer Verkauf",
"New Tag Added to Contact": "Neuer Tag zum Kontakt hinzugefügt",
"Fires when a new contact is created": "Feuer wenn ein neuer Kontakt erstellt wird",
"Fires when a new purchase is made within a funnel": "Feuert ab, wenn ein neuer Kauf innerhalb eines Trichters gemacht wird",
"Fires when a specific tag is assigned to a contact": "Feuer, wenn ein bestimmtes Tag einem Kontakt zugewiesen wird"
}

View File

@@ -0,0 +1,80 @@
{
"Systeme.io is a CRM platform that allows you to manage your contacts, sales, and marketing campaigns.": "Systeme.io es una plataforma CRM que le permite gestionar sus campañas de contacto, ventas y marketing.",
"Your Systeme.io API key. You can find this in your Systeme.io dashboard under Profile Settings > Public API Keys.": "Su clave API Systeme.io. Puede encontrar esto en su panel de control de Systeme.io en Configuración del perfil > Claves API públicas.",
"Create Contact": "Crear contacto",
"Add Tag to Contact": "Añadir etiqueta al contacto",
"Remove Tag from Contact": "Eliminar etiqueta del contacto",
"Find Contact by Email": "Buscar contacto por email",
"Update Contact": "Actualizar contacto",
"Create a new contact with email and contact fields from your Systeme.io account, with optional tags": "Crear un nuevo contacto con correo electrónico y campos de contacto desde su cuenta de Systeme.io, con etiquetas opcionales",
"Assign a tag to an existing contact - select an existing tag or create a new one": "Asignar una etiqueta a un contacto existente - seleccione una etiqueta existente o cree una nueva",
"Remove a tag that is currently assigned to an existing contact": "Eliminar una etiqueta que actualmente está asignada a un contacto existente",
"Locate an existing contact by email address": "Localizar un contacto existente por dirección de correo electrónico",
"Update fields (name, phone, custom fields) of an existing contact using fields from your Systeme.io account": "Actualizar campos (nombre, teléfono, campos personalizados) de un contacto existente usando campos de su cuenta de Systeme.io",
"Email": "E-mail",
"Language": "Idioma",
"Contact Fields": "Campos de contacto",
"Custom Contact Fields": "Campos de contacto personalizados",
"Tag Source": "Origen de etiqueta",
"Existing Tags": "Etiquetas existentes",
"New Tag Names": "Nombres de nueva etiqueta",
"Contact ID": "ID de contacto",
"Existing Tag": "Etiqueta existente",
"New Tag Name": "Nuevo nombre de etiqueta",
"Tag to Remove": "Etiqueta a eliminar",
"Custom Fields (Manual Entry)": "Campos personalizados (Entrada manual)",
"Contact email address": "Correo electrónico de contacto",
"Contact preferred language": "Idioma preferido de contacto",
"Set contact fields from your Systeme.io account": "Establecer campos de contacto desde su cuenta de Systeme.io",
"Add custom contact field values (e.g., country, company, etc.)": "Añadir valores de campos de contacto personalizados (por ejemplo, país, empresa, etc.)",
"Choose how to handle tags for this contact": "Elija cómo manejar las etiquetas para este contacto",
"Select existing tags to assign": "Seleccionar etiquetas existentes para asignar",
"Enter names for new tags to create and assign (only used when \"Create New Tags\" is selected)": "Introduzca los nombres de las nuevas etiquetas para crear y asignar (sólo se utiliza cuando se selecciona \"Crear nuevas etiquetas\")",
"Select a contact by ID": "Seleccione un contacto por ID",
"Choose whether to use an existing tag or create a new one": "Elija si desea utilizar una etiqueta existente o crear una nueva",
"Select an existing tag": "Seleccione una etiqueta existente",
"Enter the name for the new tag (only used when \"Create New Tag\" is selected)": "Introduzca el nombre de la nueva etiqueta (sólo se utiliza cuando se selecciona \"Crear Nuevo Etiqueta\")",
"Select a tag currently assigned to this contact": "Seleccione una etiqueta actualmente asignada a este contacto",
"The email address to search for": "La dirección de correo electrónico a buscar",
"Select which contact fields to update": "Seleccione qué campos de contacto actualizar",
"Add or update custom fields with manual slug entry (use empty value to clear field)": "Añadir o actualizar campos personalizados con entrada de slug manual (usar valor vacío para borrar campo)",
"English": "Inglés",
"French": "Francés",
"Spanish": "Español",
"Italian": "Italiano",
"Portuguese": "Portugués",
"German": "Alemán",
"Dutch": "Holandés",
"Russian": "Ruso",
"Japanese": "Japonés",
"Turkish": "Turco",
"Arabic": "Árabe",
"Chinese": "Chino",
"Swedish": "Sueco",
"Romanian": "Rumano",
"Czech": "Checo",
"Hungarian": "Húngaro",
"Slovak": "Eslovaco",
"Danish": "Danés",
"Indonesian": "Indonesio/a",
"Polish": "Polaco",
"Greek": "Griego",
"Serbian": "Serbio",
"Hindi": "Hindú",
"Norwegian": "Noruego",
"Thai": "Tailandés",
"Albanian": "Albanés",
"Slovenian": "Slovenian",
"Ukrainian": "Ucraniano",
"No Tags": "Sin Etiquetas",
"Use Existing Tags": "Usar etiquetas existentes",
"Create New Tags": "Crear nuevas etiquetas",
"Use Existing Tag": "Usar etiqueta existente",
"Create New Tag": "Crear nueva etiqueta",
"New Contact": "Nuevo contacto",
"New Sale": "Nueva venta",
"New Tag Added to Contact": "Nueva etiqueta añadida al contacto",
"Fires when a new contact is created": "Dispara cuando se crea un nuevo contacto",
"Fires when a new purchase is made within a funnel": "Dispara cuando una nueva compra se hace dentro de un embudo",
"Fires when a specific tag is assigned to a contact": "Dispara cuando una etiqueta específica es asignada a un contacto"
}

View File

@@ -0,0 +1,80 @@
{
"Systeme.io is a CRM platform that allows you to manage your contacts, sales, and marketing campaigns.": "Systeme.io est une plateforme CRM qui vous permet de gérer vos contacts, ventes et campagnes marketing.",
"Your Systeme.io API key. You can find this in your Systeme.io dashboard under Profile Settings > Public API Keys.": "Votre clé API Systeme.io. Vous pouvez la trouver dans votre tableau de bord Systeme.io sous Paramètres de profil > Clés API publiques.",
"Create Contact": "Créer un contact",
"Add Tag to Contact": "Ajouter un tag au contact",
"Remove Tag from Contact": "Retirer le tag du contact",
"Find Contact by Email": "Trouver un contact par e-mail",
"Update Contact": "Mettre à jour le contact",
"Create a new contact with email and contact fields from your Systeme.io account, with optional tags": "Créez un nouveau contact avec les champs e-mail et de contact de votre compte Systeme.io, avec des tags optionnels",
"Assign a tag to an existing contact - select an existing tag or create a new one": "Assigner un tag à un contact existant - sélectionner un tag existant ou en créer un nouveau",
"Remove a tag that is currently assigned to an existing contact": "Supprimer un tag qui est actuellement assigné à un contact existant",
"Locate an existing contact by email address": "Localiser un contact existant par adresse e-mail",
"Update fields (name, phone, custom fields) of an existing contact using fields from your Systeme.io account": "Mettre à jour les champs (nom, téléphone, champs personnalisés) d'un contact existant en utilisant les champs de votre compte Systeme.io",
"Email": "Courriel",
"Language": "Langue",
"Contact Fields": "Champs de contact",
"Custom Contact Fields": "Champs de contact personnalisés",
"Tag Source": "Source du tag",
"Existing Tags": "Tags existants",
"New Tag Names": "Nouveaux noms d'étiquette",
"Contact ID": "ID du contact",
"Existing Tag": "Étiquette existante",
"New Tag Name": "Nouveau nom d'étiquette",
"Tag to Remove": "Tag à supprimer",
"Custom Fields (Manual Entry)": "Champs personnalisés (entrée manuelle)",
"Contact email address": "Adresse e-mail du contact",
"Contact preferred language": "Langue préférée du contact",
"Set contact fields from your Systeme.io account": "Définir les champs de contact de votre compte Systeme.io",
"Add custom contact field values (e.g., country, company, etc.)": "Ajouter des valeurs de champs de contact personnalisés (par exemple, pays, entreprise, etc.)",
"Choose how to handle tags for this contact": "Choisir comment gérer les tags pour ce contact",
"Select existing tags to assign": "Sélectionnez les tags existants à assigner",
"Enter names for new tags to create and assign (only used when \"Create New Tags\" is selected)": "Entrez les noms des nouveaux tags à créer et à assigner (utilisé uniquement lorsque \"Créer de nouveaux tags\" est sélectionné)",
"Select a contact by ID": "Sélectionnez un contact par ID",
"Choose whether to use an existing tag or create a new one": "Choisissez si vous souhaitez utiliser un tag existant ou en créer un nouveau",
"Select an existing tag": "Sélectionnez un tag existant",
"Enter the name for the new tag (only used when \"Create New Tag\" is selected)": "Entrez le nom du nouveau tag (utilisé uniquement lorsque \"Créer un nouveau tag\" est sélectionné)",
"Select a tag currently assigned to this contact": "Sélectionnez un tag actuellement assigné à ce contact",
"The email address to search for": "L'adresse e-mail à rechercher",
"Select which contact fields to update": "Sélectionnez les champs de contact à mettre à jour",
"Add or update custom fields with manual slug entry (use empty value to clear field)": "Ajouter ou mettre à jour des champs personnalisés avec l'entrée manuelle du slug (utiliser une valeur vide pour effacer le champ)",
"English": "Anglais",
"French": "Français",
"Spanish": "Espagnol",
"Italian": "Italien",
"Portuguese": "Portugais",
"German": "Allemand",
"Dutch": "Néerlandais",
"Russian": "Russe",
"Japanese": "Japonais",
"Turkish": "Turc",
"Arabic": "Arabe",
"Chinese": "Chinois",
"Swedish": "Suédois",
"Romanian": "Roumain",
"Czech": "Tchèque",
"Hungarian": "Hongrois",
"Slovak": "Slovaque",
"Danish": "Danois",
"Indonesian": "Indonésien",
"Polish": "Polonais",
"Greek": "Grecque",
"Serbian": "Serbe",
"Hindi": "Hindi",
"Norwegian": "Norvégien",
"Thai": "Thaï",
"Albanian": "Albanais",
"Slovenian": "Slovenian",
"Ukrainian": "Ukrainien",
"No Tags": "Aucun tag",
"Use Existing Tags": "Utiliser les balises existantes",
"Create New Tags": "Créer de nouvelles balises",
"Use Existing Tag": "Utiliser la balise existante",
"Create New Tag": "Créer un nouveau tag",
"New Contact": "Nouveau contact",
"New Sale": "Nouvelle vente",
"New Tag Added to Contact": "Nouveau tag ajouté au contact",
"Fires when a new contact is created": "Tire quand un nouveau contact est créé",
"Fires when a new purchase is made within a funnel": "Tire quand un nouvel achat est effectué dans un entonnoir",
"Fires when a specific tag is assigned to a contact": "Tire lorsqu'un tag spécifique est assigné à un contact"
}

View File

@@ -0,0 +1,80 @@
{
"Systeme.io is a CRM platform that allows you to manage your contacts, sales, and marketing campaigns.": "Systeme.ioはCRMプラットフォームで、連絡先、販売、マーケティングキャンペーンを管理できます。",
"Your Systeme.io API key. You can find this in your Systeme.io dashboard under Profile Settings > Public API Keys.": "Systeme.io APIキー。Systeme.ioダッシュボードのプロフィール設定 > パブリックAPIキーで確認できます。",
"Create Contact": "連絡先を作成",
"Add Tag to Contact": "連絡先にタグを追加",
"Remove Tag from Contact": "連絡先からタグを削除",
"Find Contact by Email": "電子メールで連絡先を検索",
"Update Contact": "連絡先を更新",
"Create a new contact with email and contact fields from your Systeme.io account, with optional tags": "Systeme.ioアカウントから電子メールと連絡先項目を含む新しい連絡先を、任意のタグ付きで作成します",
"Assign a tag to an existing contact - select an existing tag or create a new one": "既存の連絡先にタグを割り当てる - 既存のタグを選択するか、新しいタグを作成します",
"Remove a tag that is currently assigned to an existing contact": "既存の連絡先に割り当てられているタグを削除",
"Locate an existing contact by email address": "電子メールアドレスで既存の連絡先を見つけます",
"Update fields (name, phone, custom fields) of an existing contact using fields from your Systeme.io account": "Systeme.ioアカウントのフィールドを使用して既存の連絡先のフィールド名前、電話番号、カスタムフィールドを更新",
"Email": "Eメールアドレス",
"Language": "言語",
"Contact Fields": "連絡先フィールド",
"Custom Contact Fields": "カスタム連絡先フィールド",
"Tag Source": "タグソース",
"Existing Tags": "既存のタグ",
"New Tag Names": "新しいタグ名",
"Contact ID": "連絡先ID",
"Existing Tag": "既存のタグ",
"New Tag Name": "新規タグ名",
"Tag to Remove": "削除するタグ",
"Custom Fields (Manual Entry)": "カスタムフィールド(手動入力)",
"Contact email address": "連絡先メールアドレス",
"Contact preferred language": "連絡先の優先言語",
"Set contact fields from your Systeme.io account": "Systeme.ioアカウントから連絡先フィールドを設定",
"Add custom contact field values (e.g., country, company, etc.)": "カスタム連絡先項目の値(例、国、会社など)を追加",
"Choose how to handle tags for this contact": "この連絡先のタグを扱う方法を選択してください",
"Select existing tags to assign": "割り当てる既存のタグを選択",
"Enter names for new tags to create and assign (only used when \"Create New Tags\" is selected)": "新規タグの名前を入力してください(「新規タグの作成」が選択されている場合のみ使用されます)",
"Select a contact by ID": "IDで連絡先を選択",
"Choose whether to use an existing tag or create a new one": "既存のタグを使用するか、新しいタグを作成するかを選択します",
"Select an existing tag": "既存のタグを選択",
"Enter the name for the new tag (only used when \"Create New Tag\" is selected)": "新しいタグの名前を入力します(「新規タグの作成」が選択されている場合のみ使用されます)",
"Select a tag currently assigned to this contact": "この連絡先に現在割り当てられているタグを選択します",
"The email address to search for": "検索するメールアドレス",
"Select which contact fields to update": "更新する連絡先フィールドを選択してください",
"Add or update custom fields with manual slug entry (use empty value to clear field)": "手動スラグエントリでカスタムフィールドを追加または更新します (空の値を使用してフィールドをクリアします)",
"English": "日本語",
"French": "フランス語",
"Spanish": "スペイン語",
"Italian": "イタリア語",
"Portuguese": "ポルトガル語",
"German": "ドイツ語",
"Dutch": "オランダ語",
"Russian": "ロシア語",
"Japanese": "日本語",
"Turkish": "トルコ語",
"Arabic": "アラビア文字",
"Chinese": "中国語",
"Swedish": "スウェーデン語",
"Romanian": "ルーマニア語",
"Czech": "チェコ語",
"Hungarian": "ハンガリー語",
"Slovak": "スロバキア語",
"Danish": "デンマーク語",
"Indonesian": "インドネシア語",
"Polish": "ポーランド語",
"Greek": "ギリシア語",
"Serbian": "セルビア語",
"Hindi": "ヒンディー語",
"Norwegian": "ノルウェー語",
"Thai": "タイ語",
"Albanian": "アルバニア語",
"Slovenian": "Slovenian",
"Ukrainian": "ウクライナ語",
"No Tags": "タグなし",
"Use Existing Tags": "既存のタグを使用",
"Create New Tags": "新しいタグを作成",
"Use Existing Tag": "既存のタグを使用",
"Create New Tag": "新しいタグを作成",
"New Contact": "新しい連絡先",
"New Sale": "新しいセール",
"New Tag Added to Contact": "連絡先に新しいタグが追加されました",
"Fires when a new contact is created": "新しい連絡先が作成されたときに発生します。",
"Fires when a new purchase is made within a funnel": "ファネル内で新しい購入が行われたときに発火します",
"Fires when a specific tag is assigned to a contact": "特定のタグが連絡先に割り当てられたときに発行されます"
}

View File

@@ -0,0 +1,80 @@
{
"Systeme.io is a CRM platform that allows you to manage your contacts, sales, and marketing campaigns.": "Systeme.io is een CRM-platform waarmee u uw contacten, verkoop en marketing campagnes kunt beheren.",
"Your Systeme.io API key. You can find this in your Systeme.io dashboard under Profile Settings > Public API Keys.": "Uw Systeme.io API-sleutel. U kunt dit vinden in uw Systeme.io dashboard onder Profielinstellingen > Publieke API-sleutels.",
"Create Contact": "Contactpersoon aanmaken",
"Add Tag to Contact": "Tag aan contactpersoon toevoegen",
"Remove Tag from Contact": "Verwijder Tag uit Contactpersoon",
"Find Contact by Email": "Zoek contact per e-mail",
"Update Contact": "Contactpersoon bijwerken",
"Create a new contact with email and contact fields from your Systeme.io account, with optional tags": "Maak een nieuw contact met e-mail en contactvelden van je Systeme.io account, met optionele tags",
"Assign a tag to an existing contact - select an existing tag or create a new one": "Wijs een label toe aan een bestaande contactpersoon - selecteer een bestaande tag of maak een nieuwe",
"Remove a tag that is currently assigned to an existing contact": "Verwijder een tag die momenteel is toegewezen aan een bestaande contactpersoon",
"Locate an existing contact by email address": "Zoek een bestaand contact op basis van e-mailadres",
"Update fields (name, phone, custom fields) of an existing contact using fields from your Systeme.io account": "Update velden (naam, telefoon, aangepaste velden) van een bestaande contactpersoon met behulp van velden van uw Systeme.io account",
"Email": "E-mail",
"Language": "Taal",
"Contact Fields": "Contact velden",
"Custom Contact Fields": "Aangepaste contactvelden",
"Tag Source": "Tag bron",
"Existing Tags": "Bestaande Tags",
"New Tag Names": "Nieuwe labelnamen",
"Contact ID": "Contact ID",
"Existing Tag": "Bestaande Tag",
"New Tag Name": "Nieuwe Tag-naam",
"Tag to Remove": "Tag om te verwijderen",
"Custom Fields (Manual Entry)": "Aangepaste velden (handmatige invoer)",
"Contact email address": "Contact e-mailadres",
"Contact preferred language": "Contact voorkeurstaal",
"Set contact fields from your Systeme.io account": "Stel contactvelden in vanaf je Systeme.io account",
"Add custom contact field values (e.g., country, company, etc.)": "Voeg aangepaste contactveld waarden toe (bijv. land, bedrijf, etc.)",
"Choose how to handle tags for this contact": "Kies hoe met tags moet worden omgegaan voor dit contact",
"Select existing tags to assign": "Selecteer bestaande tags om toe te wijzen",
"Enter names for new tags to create and assign (only used when \"Create New Tags\" is selected)": "Voer namen in voor nieuwe tags om aan te maken en toe te wijzen (alleen gebruikt wanneer \"Nieuwe tags aanmaken\" is geselecteerd)",
"Select a contact by ID": "Selecteer een contactpersoon op ID",
"Choose whether to use an existing tag or create a new one": "Kies of een bestaande tag moet worden gebruikt of maak een nieuwe",
"Select an existing tag": "Selecteer een bestaande tag",
"Enter the name for the new tag (only used when \"Create New Tag\" is selected)": "Voer de naam van de nieuwe tag in (wordt alleen gebruikt wanneer \"Nieuwe tag aanmaken\" is geselecteerd)",
"Select a tag currently assigned to this contact": "Selecteer een tag die momenteel is toegewezen aan deze contactpersoon",
"The email address to search for": "Het e-mailadres om naar te zoeken",
"Select which contact fields to update": "Selecteer welke contactvelden bij te werken",
"Add or update custom fields with manual slug entry (use empty value to clear field)": "Toevoegen of bijwerken van aangepaste velden met handmatige slug invoer (gebruik lege waarde om het veld te wissen)",
"English": "Nederlands",
"French": "Frans",
"Spanish": "Spaans",
"Italian": "Italiaans",
"Portuguese": "Portugees",
"German": "Duits",
"Dutch": "Nederlands",
"Russian": "Russisch",
"Japanese": "Afrikaans",
"Turkish": "Turks",
"Arabic": "Arabisch",
"Chinese": "Chinees",
"Swedish": "Zweeds",
"Romanian": "Roemeens",
"Czech": "Tsjechisch",
"Hungarian": "Hongaars",
"Slovak": "Slowaaks",
"Danish": "Deens",
"Indonesian": "Indonesisch",
"Polish": "Pools",
"Greek": "Grieks",
"Serbian": "Servisch",
"Hindi": "Hindoestani",
"Norwegian": "Noors",
"Thai": "Thaise",
"Albanian": "Albanees",
"Slovenian": "Slovenian",
"Ukrainian": "Oekraïens",
"No Tags": "Geen tags",
"Use Existing Tags": "Gebruik bestaande tags",
"Create New Tags": "Nieuwe tags maken",
"Use Existing Tag": "Bestaande tag gebruiken",
"Create New Tag": "Nieuwe tag maken",
"New Contact": "Nieuw contactpersoon",
"New Sale": "Nieuwe verkoop",
"New Tag Added to Contact": "Nieuwe tag toegevoegd aan contact",
"Fires when a new contact is created": "Vuurt wanneer een nieuw contact wordt gemaakt",
"Fires when a new purchase is made within a funnel": "Vuurt wanneer een nieuwe aankoop wordt gedaan binnen een trechter",
"Fires when a specific tag is assigned to a contact": "Vuurt wanneer een specifieke tag is toegewezen aan een contactpersoon"
}

View File

@@ -0,0 +1,80 @@
{
"Systeme.io is a CRM platform that allows you to manage your contacts, sales, and marketing campaigns.": "Systeme.io é uma plataforma CRM que permite gerenciar seus contatos, vendas e campanhas de marketing.",
"Your Systeme.io API key. You can find this in your Systeme.io dashboard under Profile Settings > Public API Keys.": "Sua chave API Systeme.io. Você pode encontrar isso no seu painel Systeme.io em Configurações de Perfil > Chaves de API pública.",
"Create Contact": "Criar contato",
"Add Tag to Contact": "Adicionar Tag ao Contato",
"Remove Tag from Contact": "Remover Etiqueta do Contato",
"Find Contact by Email": "Localizar contato por e-mail",
"Update Contact": "Atualizar contato",
"Create a new contact with email and contact fields from your Systeme.io account, with optional tags": "Criar um novo contato com os campos de e-mail e contato da sua conta Systeme.io com tags opcionais",
"Assign a tag to an existing contact - select an existing tag or create a new one": "Atribuir uma etiqueta a um contato existente - selecione uma etiqueta existente ou crie uma nova",
"Remove a tag that is currently assigned to an existing contact": "Remover uma tag que está atualmente atribuída a um contato existente",
"Locate an existing contact by email address": "Localizar um contato existente por endereço de e-mail",
"Update fields (name, phone, custom fields) of an existing contact using fields from your Systeme.io account": "Atualizar campos (nome, telefone, campos personalizados) de um contato existente usando campos da sua conta Systeme.io",
"Email": "e-mail",
"Language": "IDIOMA",
"Contact Fields": "Campos de contato",
"Custom Contact Fields": "Campos de contato personalizados",
"Tag Source": "Fonte da Tag",
"Existing Tags": "Tags existentes",
"New Tag Names": "Novos Nomes das Etiquetas",
"Contact ID": "ID do contato",
"Existing Tag": "Etiqueta existente",
"New Tag Name": "Novo Nome de Etiqueta",
"Tag to Remove": "Tag para Remover",
"Custom Fields (Manual Entry)": "Campos personalizados (Entrada manual)",
"Contact email address": "Endereço de e-mail",
"Contact preferred language": "Idioma de contato preferido",
"Set contact fields from your Systeme.io account": "Definir campos de contato da sua conta Systeme.io",
"Add custom contact field values (e.g., country, company, etc.)": "Adicionar valores de campo de contato personalizado (por exemplo, país, empresa, etc.)",
"Choose how to handle tags for this contact": "Escolha como lidar com tags para este contato",
"Select existing tags to assign": "Selecione tags existentes para atribuir",
"Enter names for new tags to create and assign (only used when \"Create New Tags\" is selected)": "Digite nomes para novas tags para criar e atribuir (usado apenas quando \"Criar Nova Tags\" é selecionado)",
"Select a contact by ID": "Selecione um contato por ID",
"Choose whether to use an existing tag or create a new one": "Escolha se deseja usar uma tag existente ou criar uma nova",
"Select an existing tag": "Selecione uma tag existente",
"Enter the name for the new tag (only used when \"Create New Tag\" is selected)": "Digite o nome para a nova tag (usada apenas quando \"Criar Nova Tag\" é selecionada)",
"Select a tag currently assigned to this contact": "Selecione uma tag atualmente atribuída a este contato",
"The email address to search for": "O endereço de e-mail para procurar",
"Select which contact fields to update": "Selecione quais campos de contato serão atualizados",
"Add or update custom fields with manual slug entry (use empty value to clear field)": "Adicionar ou atualizar campos personalizados com entrada de slug manual (use valor vazio para limpar o campo)",
"English": "Portuguese-Brazil",
"French": "francês",
"Spanish": "espanhol",
"Italian": "italiano",
"Portuguese": "Português",
"German": "alemão",
"Dutch": "Neerlandês",
"Russian": "Russo",
"Japanese": "japonês",
"Turkish": "Turco",
"Arabic": "Arábico",
"Chinese": "chinês",
"Swedish": "sueco",
"Romanian": "romeno",
"Czech": "tcheco",
"Hungarian": "Húngaro",
"Slovak": "Eslovaco",
"Danish": "Dinamarquês",
"Indonesian": "indonésio",
"Polish": "Polonês",
"Greek": "Grego",
"Serbian": "Sérvio",
"Hindi": "hindi",
"Norwegian": "norueguês",
"Thai": "Tailandês",
"Albanian": "albanês",
"Slovenian": "Slovenian",
"Ukrainian": "ucraniano",
"No Tags": "Sem Etiquetas",
"Use Existing Tags": "Usar Tags Existentes",
"Create New Tags": "Criar Novas Etiquetas",
"Use Existing Tag": "Usar Tag Existente",
"Create New Tag": "Criar Nova Tag",
"New Contact": "Novo Contato",
"New Sale": "Nova Venda",
"New Tag Added to Contact": "Nova tag adicionada ao contato",
"Fires when a new contact is created": "Atira quando um novo contato é criado",
"Fires when a new purchase is made within a funnel": "Atira quando uma nova compra é feita dentro de um funil",
"Fires when a specific tag is assigned to a contact": "Atira quando uma etiqueta específica é atribuída a um contato"
}

View File

@@ -0,0 +1,81 @@
{
"Systeme.io": "Systeme.io",
"Systeme.io is a CRM platform that allows you to manage your contacts, sales, and marketing campaigns.": "Systeme.io это CRM-платформа, которая позволяет управлять контактами, продажами и маркетинговыми кампаниями.",
"Your Systeme.io API key. You can find this in your Systeme.io dashboard under Profile Settings > Public API Keys.": "API-ключ Systeme.io вашего API. Вы можете найти его в Systeme.io приборной панели в меню Настройки > Публичные API Keys.",
"Create Contact": "Создать контакт",
"Add Tag to Contact": "Добавить тег в контакт",
"Remove Tag from Contact": "Удалить тег из контакта",
"Find Contact by Email": "Найти контакт по электронной почте",
"Update Contact": "Обновить контакт",
"Create a new contact with email and contact fields from your Systeme.io account, with optional tags": "Создайте новый контакт с полями электронной почты и контактов из вашей учетной записи Systeme.io с необязательными тэгами",
"Assign a tag to an existing contact - select an existing tag or create a new one": "Назначить тег существующему контакту - выбрать существующий тег или создать новый",
"Remove a tag that is currently assigned to an existing contact": "Удалить тег, который в настоящее время назначен для существующего контакта",
"Locate an existing contact by email address": "Найти существующий контакт по адресу электронной почты",
"Update fields (name, phone, custom fields) of an existing contact using fields from your Systeme.io account": "Обновить поля (имя, телефон, настраиваемые поля) существующего контакта, используя поля из вашей учетной записи Systeme.io",
"Email": "Почта",
"Language": "Язык",
"Contact Fields": "Поля контактов",
"Custom Contact Fields": "Пользовательские поля контактов",
"Tag Source": "Источник тегов",
"Existing Tags": "Существующие теги",
"New Tag Names": "Новые имена тегов",
"Contact ID": "ID контакта",
"Existing Tag": "Существующий тег",
"New Tag Name": "Новое имя тега",
"Tag to Remove": "Метка для удаления",
"Custom Fields (Manual Entry)": "Пользовательские поля (запись вручную)",
"Contact email address": "Адрес электронной почты",
"Contact preferred language": "Предпочтительный язык",
"Set contact fields from your Systeme.io account": "Задайте поля контактов из вашей учетной записи Systeme.io",
"Add custom contact field values (e.g., country, company, etc.)": "Добавить значения полей контакта (например, страна, компания и т. д.)",
"Choose how to handle tags for this contact": "Выберите, как обрабатывать теги для этого контакта",
"Select existing tags to assign": "Выберите существующие теги для назначения",
"Enter names for new tags to create and assign (only used when \"Create New Tags\" is selected)": "Введите имена для новых тегов для создания и назначения (используется только для выбора \"Создать новые теги\")",
"Select a contact by ID": "Выберите контакт по ID",
"Choose whether to use an existing tag or create a new one": "Выберите, использовать ли существующий тег или создать новый тег",
"Select an existing tag": "Выберите существующий тег",
"Enter the name for the new tag (only used when \"Create New Tag\" is selected)": "Введите имя для нового тега (используется только при выборе \"Создать новый тег\")",
"Select a tag currently assigned to this contact": "Выберите тег, назначенный этому контакту",
"The email address to search for": "Адрес электронной почты для поиска",
"Select which contact fields to update": "Выберите поля контакта для обновления",
"Add or update custom fields with manual slug entry (use empty value to clear field)": "Добавление или обновление пользовательских полей с ручной slug записи (используйте пустое значение для очистки поля)",
"English": "Russian",
"French": "Французский",
"Spanish": "Испанский",
"Italian": "Итальянский",
"Portuguese": "Португальский",
"German": "Немецкий",
"Dutch": "Голландский",
"Russian": "Русский",
"Japanese": "Японский",
"Turkish": "Турецкий",
"Arabic": "Арабский",
"Chinese": "Китайский",
"Swedish": "Шведский",
"Romanian": "Румынский",
"Czech": "Чешский",
"Hungarian": "Венгерский",
"Slovak": "Словацкий",
"Danish": "Датский",
"Indonesian": "Индонезийский",
"Polish": "Польский",
"Greek": "Греческий",
"Serbian": "Сербский",
"Hindi": "Хинди",
"Norwegian": "Норвежский",
"Thai": "Тайский",
"Albanian": "Албанский",
"Slovenian": "Slovenian",
"Ukrainian": "Украинский",
"No Tags": "Нет тегов",
"Use Existing Tags": "Использовать существующие теги",
"Create New Tags": "Создать новые теги",
"Use Existing Tag": "Использовать существующий тег",
"Create New Tag": "Создать новый тег",
"New Contact": "Новый контакт",
"New Sale": "Новая распродажа",
"New Tag Added to Contact": "Новый тег добавлен в контакт",
"Fires when a new contact is created": "Стреляет при создании нового контакта",
"Fires when a new purchase is made within a funnel": "Стреляет при совершении новых покупок в воронке",
"Fires when a specific tag is assigned to a contact": "Стреляет при назначении контакту определенного тега"
}

View File

@@ -0,0 +1,80 @@
{
"Systeme.io is a CRM platform that allows you to manage your contacts, sales, and marketing campaigns.": "Systeme.io is a CRM platform that allows you to manage your contacts, sales, and marketing campaigns.",
"Your Systeme.io API key. You can find this in your Systeme.io dashboard under Profile Settings > Public API Keys.": "Your Systeme.io API key. You can find this in your Systeme.io dashboard under Profile Settings > Public API Keys.",
"Create Contact": "Create Contact",
"Add Tag to Contact": "Add Tag to Contact",
"Remove Tag from Contact": "Remove Tag from Contact",
"Find Contact by Email": "Find Contact by Email",
"Update Contact": "Update Contact",
"Create a new contact with email and contact fields from your Systeme.io account, with optional tags": "Create a new contact with email and contact fields from your Systeme.io account, with optional tags",
"Assign a tag to an existing contact - select an existing tag or create a new one": "Assign a tag to an existing contact - select an existing tag or create a new one",
"Remove a tag that is currently assigned to an existing contact": "Remove a tag that is currently assigned to an existing contact",
"Locate an existing contact by email address": "Locate an existing contact by email address",
"Update fields (name, phone, custom fields) of an existing contact using fields from your Systeme.io account": "Update fields (name, phone, custom fields) of an existing contact using fields from your Systeme.io account",
"Email": "Email",
"Language": "Language",
"Contact Fields": "Contact Fields",
"Custom Contact Fields": "Custom Contact Fields",
"Tag Source": "Tag Source",
"Existing Tags": "Existing Tags",
"New Tag Names": "New Tag Names",
"Contact ID": "Contact ID",
"Existing Tag": "Existing Tag",
"New Tag Name": "New Tag Name",
"Tag to Remove": "Tag to Remove",
"Custom Fields (Manual Entry)": "Custom Fields (Manual Entry)",
"Contact email address": "Contact email address",
"Contact preferred language": "Contact preferred language",
"Set contact fields from your Systeme.io account": "Set contact fields from your Systeme.io account",
"Add custom contact field values (e.g., country, company, etc.)": "Add custom contact field values (e.g., country, company, etc.)",
"Choose how to handle tags for this contact": "Choose how to handle tags for this contact",
"Select existing tags to assign": "Select existing tags to assign",
"Enter names for new tags to create and assign (only used when \"Create New Tags\" is selected)": "Enter names for new tags to create and assign (only used when \"Create New Tags\" is selected)",
"Select a contact by ID": "Select a contact by ID",
"Choose whether to use an existing tag or create a new one": "Choose whether to use an existing tag or create a new one",
"Select an existing tag": "Select an existing tag",
"Enter the name for the new tag (only used when \"Create New Tag\" is selected)": "Enter the name for the new tag (only used when \"Create New Tag\" is selected)",
"Select a tag currently assigned to this contact": "Select a tag currently assigned to this contact",
"The email address to search for": "The email address to search for",
"Select which contact fields to update": "Select which contact fields to update",
"Add or update custom fields with manual slug entry (use empty value to clear field)": "Add or update custom fields with manual slug entry (use empty value to clear field)",
"English": "English",
"French": "French",
"Spanish": "Spanish",
"Italian": "Italian",
"Portuguese": "Portuguese",
"German": "German",
"Dutch": "Dutch",
"Russian": "Russian",
"Japanese": "Japanese",
"Turkish": "Turkish",
"Arabic": "Arabic",
"Chinese": "Chinese",
"Swedish": "Swedish",
"Romanian": "Romanian",
"Czech": "Czech",
"Hungarian": "Hungarian",
"Slovak": "Slovak",
"Danish": "Danish",
"Indonesian": "Indonesian",
"Polish": "Polish",
"Greek": "Greek",
"Serbian": "Serbian",
"Hindi": "Hindi",
"Norwegian": "Norwegian",
"Thai": "Thai",
"Albanian": "Albanian",
"Slovenian": "Slovenian",
"Ukrainian": "Ukrainian",
"No Tags": "No Tags",
"Use Existing Tags": "Use Existing Tags",
"Create New Tags": "Create New Tags",
"Use Existing Tag": "Use Existing Tag",
"Create New Tag": "Create New Tag",
"New Contact": "New Contact",
"New Sale": "New Sale",
"New Tag Added to Contact": "New Tag Added to Contact",
"Fires when a new contact is created": "Fires when a new contact is created",
"Fires when a new purchase is made within a funnel": "Fires when a new purchase is made within a funnel",
"Fires when a specific tag is assigned to a contact": "Fires when a specific tag is assigned to a contact"
}

View File

@@ -0,0 +1,81 @@
{
"Systeme.io": "Systeme.io",
"Systeme.io is a CRM platform that allows you to manage your contacts, sales, and marketing campaigns.": "Systeme.io is a CRM platform that allows you to manage your contacts, sales, and marketing campaigns.",
"Your Systeme.io API key. You can find this in your Systeme.io dashboard under Profile Settings > Public API Keys.": "Your Systeme.io API key. You can find this in your Systeme.io dashboard under Profile Settings > Public API Keys.",
"Create Contact": "Create Contact",
"Add Tag to Contact": "Add Tag to Contact",
"Remove Tag from Contact": "Remove Tag from Contact",
"Find Contact by Email": "Find Contact by Email",
"Update Contact": "Update Contact",
"Create a new contact with email and contact fields from your Systeme.io account, with optional tags": "Create a new contact with email and contact fields from your Systeme.io account, with optional tags",
"Assign a tag to an existing contact - select an existing tag or create a new one": "Assign a tag to an existing contact - select an existing tag or create a new one",
"Remove a tag that is currently assigned to an existing contact": "Remove a tag that is currently assigned to an existing contact",
"Locate an existing contact by email address": "Locate an existing contact by email address",
"Update fields (name, phone, custom fields) of an existing contact using fields from your Systeme.io account": "Update fields (name, phone, custom fields) of an existing contact using fields from your Systeme.io account",
"Email": "Email",
"Language": "Language",
"Contact Fields": "Contact Fields",
"Custom Contact Fields": "Custom Contact Fields",
"Tag Source": "Tag Source",
"Existing Tags": "Existing Tags",
"New Tag Names": "New Tag Names",
"Contact ID": "Contact ID",
"Existing Tag": "Existing Tag",
"New Tag Name": "New Tag Name",
"Tag to Remove": "Tag to Remove",
"Custom Fields (Manual Entry)": "Custom Fields (Manual Entry)",
"Contact email address": "Contact email address",
"Contact preferred language": "Contact preferred language",
"Set contact fields from your Systeme.io account": "Set contact fields from your Systeme.io account",
"Add custom contact field values (e.g., country, company, etc.)": "Add custom contact field values (e.g., country, company, etc.)",
"Choose how to handle tags for this contact": "Choose how to handle tags for this contact",
"Select existing tags to assign": "Select existing tags to assign",
"Enter names for new tags to create and assign (only used when \"Create New Tags\" is selected)": "Enter names for new tags to create and assign (only used when \"Create New Tags\" is selected)",
"Select a contact by ID": "Select a contact by ID",
"Choose whether to use an existing tag or create a new one": "Choose whether to use an existing tag or create a new one",
"Select an existing tag": "Select an existing tag",
"Enter the name for the new tag (only used when \"Create New Tag\" is selected)": "Enter the name for the new tag (only used when \"Create New Tag\" is selected)",
"Select a tag currently assigned to this contact": "Select a tag currently assigned to this contact",
"The email address to search for": "The email address to search for",
"Select which contact fields to update": "Select which contact fields to update",
"Add or update custom fields with manual slug entry (use empty value to clear field)": "Add or update custom fields with manual slug entry (use empty value to clear field)",
"English": "English",
"French": "French",
"Spanish": "Spanish",
"Italian": "Italian",
"Portuguese": "Portuguese",
"German": "German",
"Dutch": "Dutch",
"Russian": "Russian",
"Japanese": "Japanese",
"Turkish": "Turkish",
"Arabic": "Arabic",
"Chinese": "Chinese",
"Swedish": "Swedish",
"Romanian": "Romanian",
"Czech": "Czech",
"Hungarian": "Hungarian",
"Slovak": "Slovak",
"Danish": "Danish",
"Indonesian": "Indonesian",
"Polish": "Polish",
"Greek": "Greek",
"Serbian": "Serbian",
"Hindi": "Hindi",
"Norwegian": "Norwegian",
"Thai": "Thai",
"Albanian": "Albanian",
"Slovenian": "Slovenian",
"Ukrainian": "Ukrainian",
"No Tags": "No Tags",
"Use Existing Tags": "Use Existing Tags",
"Create New Tags": "Create New Tags",
"Use Existing Tag": "Use Existing Tag",
"Create New Tag": "Create New Tag",
"New Contact": "New Contact",
"New Sale": "New Sale",
"New Tag Added to Contact": "New Tag Added to Contact",
"Fires when a new contact is created": "Fires when a new contact is created",
"Fires when a new purchase is made within a funnel": "Fires when a new purchase is made within a funnel",
"Fires when a specific tag is assigned to a contact": "Fires when a specific tag is assigned to a contact"
}

View File

@@ -0,0 +1,80 @@
{
"Systeme.io is a CRM platform that allows you to manage your contacts, sales, and marketing campaigns.": "Systeme.io is a CRM platform that allows you to manage your contacts, sales, and marketing campaigns.",
"Your Systeme.io API key. You can find this in your Systeme.io dashboard under Profile Settings > Public API Keys.": "Your Systeme.io API key. You can find this in your Systeme.io dashboard under Profile Settings > Public API Keys.",
"Create Contact": "Create Contact",
"Add Tag to Contact": "Add Tag to Contact",
"Remove Tag from Contact": "Remove Tag from Contact",
"Find Contact by Email": "Find Contact by Email",
"Update Contact": "Update Contact",
"Create a new contact with email and contact fields from your Systeme.io account, with optional tags": "Create a new contact with email and contact fields from your Systeme.io account, with optional tags",
"Assign a tag to an existing contact - select an existing tag or create a new one": "Assign a tag to an existing contact - select an existing tag or create a new one",
"Remove a tag that is currently assigned to an existing contact": "Remove a tag that is currently assigned to an existing contact",
"Locate an existing contact by email address": "Locate an existing contact by email address",
"Update fields (name, phone, custom fields) of an existing contact using fields from your Systeme.io account": "Update fields (name, phone, custom fields) of an existing contact using fields from your Systeme.io account",
"Email": "电子邮件地址",
"Language": "Language",
"Contact Fields": "Contact Fields",
"Custom Contact Fields": "Custom Contact Fields",
"Tag Source": "Tag Source",
"Existing Tags": "Existing Tags",
"New Tag Names": "New Tag Names",
"Contact ID": "Contact ID",
"Existing Tag": "Existing Tag",
"New Tag Name": "New Tag Name",
"Tag to Remove": "Tag to Remove",
"Custom Fields (Manual Entry)": "Custom Fields (Manual Entry)",
"Contact email address": "Contact email address",
"Contact preferred language": "Contact preferred language",
"Set contact fields from your Systeme.io account": "Set contact fields from your Systeme.io account",
"Add custom contact field values (e.g., country, company, etc.)": "Add custom contact field values (e.g., country, company, etc.)",
"Choose how to handle tags for this contact": "Choose how to handle tags for this contact",
"Select existing tags to assign": "Select existing tags to assign",
"Enter names for new tags to create and assign (only used when \"Create New Tags\" is selected)": "Enter names for new tags to create and assign (only used when \"Create New Tags\" is selected)",
"Select a contact by ID": "Select a contact by ID",
"Choose whether to use an existing tag or create a new one": "Choose whether to use an existing tag or create a new one",
"Select an existing tag": "Select an existing tag",
"Enter the name for the new tag (only used when \"Create New Tag\" is selected)": "Enter the name for the new tag (only used when \"Create New Tag\" is selected)",
"Select a tag currently assigned to this contact": "Select a tag currently assigned to this contact",
"The email address to search for": "The email address to search for",
"Select which contact fields to update": "Select which contact fields to update",
"Add or update custom fields with manual slug entry (use empty value to clear field)": "Add or update custom fields with manual slug entry (use empty value to clear field)",
"English": "English",
"French": "French",
"Spanish": "Spanish",
"Italian": "Italian",
"Portuguese": "Portuguese",
"German": "German",
"Dutch": "Dutch",
"Russian": "Russian",
"Japanese": "Japanese",
"Turkish": "Turkish",
"Arabic": "Arabic",
"Chinese": "Chinese",
"Swedish": "Swedish",
"Romanian": "Romanian",
"Czech": "Czech",
"Hungarian": "Hungarian",
"Slovak": "Slovak",
"Danish": "Danish",
"Indonesian": "Indonesian",
"Polish": "Polish",
"Greek": "Greek",
"Serbian": "Serbian",
"Hindi": "Hindi",
"Norwegian": "Norwegian",
"Thai": "Thai",
"Albanian": "Albanian",
"Slovenian": "Slovenian",
"Ukrainian": "Ukrainian",
"No Tags": "No Tags",
"Use Existing Tags": "Use Existing Tags",
"Create New Tags": "Create New Tags",
"Use Existing Tag": "Use Existing Tag",
"Create New Tag": "Create New Tag",
"New Contact": "New Contact",
"New Sale": "New Sale",
"New Tag Added to Contact": "New Tag Added to Contact",
"Fires when a new contact is created": "Fires when a new contact is created",
"Fires when a new purchase is made within a funnel": "Fires when a new purchase is made within a funnel",
"Fires when a specific tag is assigned to a contact": "Fires when a specific tag is assigned to a contact"
}

View File

@@ -0,0 +1,35 @@
import { createPiece } from "@activepieces/pieces-framework";
import { systemeIoAuth } from "./lib/common/auth"
import { newContact } from "./lib/triggers/new-contact";
import { newSale } from "./lib/triggers/new-sale";
import { newTagAddedToContact } from "./lib/triggers/new-tag-added-to-contact"
import { createContact } from "./lib/actions/create-contact";
import { addTagToContact } from "./lib/actions/add-tag-to-contact";
import { removeTagFromContact } from "./lib/actions/remove-tag-from-contact";
import { findContactByEmail } from "./lib/actions/find-contact-by-email";
import { updateContact } from "./lib/actions/update-contact"
import { PieceCategory } from "@activepieces/shared";
export const systemeIo = createPiece({
displayName: "Systeme.io",
auth: systemeIoAuth,
minimumSupportedRelease: '0.36.1',
categories: [PieceCategory.MARKETING],
description: "Systeme.io is a CRM platform that allows you to manage your contacts, sales, and marketing campaigns.",
logoUrl: "https://cdn.activepieces.com/pieces/systeme-io.png",
authors: ['ezhil56x', 'onyedikachi-david'],
actions: [
createContact,
addTagToContact,
removeTagFromContact,
findContactByEmail,
updateContact,
],
triggers: [
newContact,
newSale,
newTagAddedToContact,
],
});

View File

@@ -0,0 +1,142 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { systemeIoAuth } from '../common/auth';
import { systemeIoCommon } from '../common/client';
import { systemeIoProps } from '../common/props';
export const addTagToContact = createAction({
auth: systemeIoAuth,
name: 'addTagToContact',
displayName: 'Add Tag to Contact',
description: 'Assign a tag to an existing contact - select an existing tag or create a new one',
props: {
contactId: systemeIoProps.contactIdDropdown,
tagSource: Property.StaticDropdown({
displayName: 'Tag Source',
description: 'Choose whether to use an existing tag or create a new one',
required: true,
defaultValue: 'existing',
options: {
disabled: false,
options: [
{ label: 'Use Existing Tag', value: 'existing' },
{ label: 'Create New Tag', value: 'new' },
],
},
}),
existingTagId: Property.Dropdown({
auth: systemeIoAuth,
displayName: 'Existing Tag',
description: 'Select an existing tag',
required: false,
refreshers: ['tagSource'],
options: async ({ auth, tagSource }) => {
if (!auth || tagSource !== 'existing') {
return {
disabled: true,
placeholder: tagSource === 'new' ? 'Not needed when creating new tag' : 'Please connect your account first',
options: [],
};
}
try {
const response = await systemeIoCommon.getTags({
auth: auth.secret_text,
});
let tags: any[] = [];
if (Array.isArray(response)) {
tags = response;
} else if (response && typeof response === 'object' && response !== null) {
const responseAny = response as any;
if (responseAny.items && Array.isArray(responseAny.items)) {
tags = responseAny.items;
}
}
if (tags.length > 0) {
return {
disabled: false,
options: tags.map((tag: any) => ({
label: tag.name,
value: tag.id,
})),
};
}
return {
disabled: true,
placeholder: 'No tags found',
options: [],
};
} catch (error) {
console.error('Error fetching tags:', error);
return {
disabled: true,
placeholder: 'Error loading tags',
options: [],
};
}
},
}),
newTagName: Property.ShortText({
displayName: 'New Tag Name',
description: 'Enter the name for the new tag (only used when "Create New Tag" is selected)',
required: false,
}),
},
async run(context) {
const { contactId, tagSource, existingTagId, newTagName } = context.propsValue;
let tagId: string | number;
let tagCreated = false;
if (tagSource === 'new') {
if (!newTagName || newTagName.trim() === '') {
throw new Error('New Tag Name is required when "Create New Tag" is selected');
}
try {
const newTag = await systemeIoCommon.apiCall<{ id: number }>({
method: HttpMethod.POST,
url: '/tags',
body: {
name: newTagName.trim(),
},
auth: context.auth.secret_text,
});
tagId = newTag.id;
tagCreated = true;
} catch (error: any) {
throw new Error(`Failed to create tag: ${error.message}`);
}
} else {
if (!existingTagId) {
throw new Error('Please select an existing tag when "Use Existing Tag" is selected');
}
tagId = existingTagId;
}
const response = await systemeIoCommon.apiCall({
method: HttpMethod.POST,
url: `/contacts/${contactId}/tags`,
body: {
tagId: tagId,
},
auth: context.auth.secret_text,
});
return {
success: true,
contactId,
tagId,
tagCreated,
tagName: tagSource === 'new' ? newTagName : undefined,
message: tagCreated
? `New tag "${newTagName}" created and assigned to contact`
: 'Existing tag successfully assigned to contact',
response,
};
},
});

View File

@@ -0,0 +1,331 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { systemeIoAuth } from '../common/auth';
import { systemeIoCommon } from '../common/client';
import { systemeIoProps } from '../common/props';
interface ContactField {
field: string;
value: string;
}
interface TagName {
name: string;
}
export const createContact = createAction({
auth: systemeIoAuth,
name: 'createContact',
displayName: 'Create Contact',
description: 'Create a new contact with email and contact fields from your Systeme.io account, with optional tags',
props: {
email: Property.ShortText({
displayName: 'Email',
description: 'Contact email address',
required: true,
}),
locale: Property.StaticDropdown({
displayName: 'Language',
description: 'Contact preferred language',
required: false,
defaultValue: 'en',
options: {
disabled: false,
options: [
{ label: 'English', value: 'en' },
{ label: 'French', value: 'fr' },
{ label: 'Spanish', value: 'es' },
{ label: 'Italian', value: 'it' },
{ label: 'Portuguese', value: 'pt' },
{ label: 'German', value: 'de' },
{ label: 'Dutch', value: 'nl' },
{ label: 'Russian', value: 'ru' },
{ label: 'Japanese', value: 'jp' },
{ label: 'Turkish', value: 'tr' },
{ label: 'Arabic', value: 'ar' },
{ label: 'Chinese', value: 'zh' },
{ label: 'Swedish', value: 'sv' },
{ label: 'Romanian', value: 'ro' },
{ label: 'Czech', value: 'cs' },
{ label: 'Hungarian', value: 'hu' },
{ label: 'Slovak', value: 'sk' },
{ label: 'Danish', value: 'dk' },
{ label: 'Indonesian', value: 'id' },
{ label: 'Polish', value: 'pl' },
{ label: 'Greek', value: 'el' },
{ label: 'Serbian', value: 'sr' },
{ label: 'Hindi', value: 'hi' },
{ label: 'Norwegian', value: 'no' },
{ label: 'Thai', value: 'th' },
{ label: 'Albanian', value: 'sq' },
{ label: 'Slovenian', value: 'sl' },
{ label: 'Ukrainian', value: 'ua' },
],
},
}),
dynamicContactFields: Property.DynamicProperties({
auth: systemeIoAuth,
displayName: 'Contact Fields',
description: 'Set contact fields from your Systeme.io account',
required: false,
refreshers: [],
props: async ({ auth }) => {
if (!auth) {
return {};
}
try {
const response = await systemeIoCommon.getContactFields({
auth: auth.secret_text,
});
let fields: any[] = [];
if (Array.isArray(response)) {
fields = response;
} else if (response && typeof response === 'object' && response !== null) {
const responseAny = response as any;
if (responseAny.items && Array.isArray(responseAny.items)) {
fields = responseAny.items;
}
}
const dynamicProps: any = {};
for (const field of fields) {
dynamicProps[field.slug] = Property.ShortText({
displayName: field.fieldName || field.slug,
description: `Set ${field.fieldName || field.slug} for the new contact`,
required: false,
});
}
return dynamicProps;
} catch (error) {
console.error('Error fetching contact fields:', error);
return {};
}
},
}),
customFields: systemeIoProps.contactFields,
tagSource: Property.StaticDropdown({
displayName: 'Tag Source',
description: 'Choose how to handle tags for this contact',
required: false,
defaultValue: 'none',
options: {
disabled: false,
options: [
{ label: 'No Tags', value: 'none' },
{ label: 'Use Existing Tags', value: 'existing' },
{ label: 'Create New Tags', value: 'new' },
],
},
}),
existingTags: Property.MultiSelectDropdown({
auth: systemeIoAuth,
displayName: 'Existing Tags',
description: 'Select existing tags to assign',
required: false,
refreshers: ['tagSource'],
options: async ({ auth, tagSource }) => {
if (!auth || tagSource !== 'existing') {
return {
disabled: true,
placeholder: tagSource === 'new' ? 'Not needed when creating new tags' :
tagSource === 'none' ? 'Not needed when no tags selected' :
'Please connect your account first',
options: [],
};
}
try {
const response = await systemeIoCommon.getTags({
auth: auth.secret_text,
});
let tags: any[] = [];
if (Array.isArray(response)) {
tags = response;
} else if (response && typeof response === 'object' && response !== null) {
const responseAny = response as any;
if (responseAny.items && Array.isArray(responseAny.items)) {
tags = responseAny.items;
}
}
if (tags.length > 0) {
return {
disabled: false,
options: tags.map((tag: any) => ({
label: tag.name || tag.id,
value: tag.id,
})),
};
}
return {
disabled: true,
placeholder: 'No tags found',
options: [],
};
} catch (error) {
console.error('Error fetching tags:', error);
return {
disabled: true,
placeholder: 'Error loading tags',
options: [],
};
}
},
}),
newTagNames: Property.Array({
displayName: 'New Tag Names',
description: 'Enter names for new tags to create and assign (only used when "Create New Tags" is selected)',
required: false,
properties: {
name: Property.ShortText({
displayName: 'Tag Name',
description: 'Enter the tag name',
required: true,
}),
},
}),
},
async run(context) {
const {
email,
locale,
dynamicContactFields,
customFields,
tagSource,
existingTags,
newTagNames
} = context.propsValue;
const fields: any[] = [];
if (dynamicContactFields && typeof dynamicContactFields === 'object') {
const fieldsObj = dynamicContactFields as Record<string, any>;
for (const key in fieldsObj) {
if (Object.prototype.hasOwnProperty.call(fieldsObj, key)) {
const value = fieldsObj[key];
if (value !== undefined && value !== null && value !== '') {
fields.push({
slug: key,
value: String(value)
});
}
}
}
}
if (customFields && Array.isArray(customFields)) {
for (const field of customFields as ContactField[]) {
if (field.field && field.value) {
fields.push({
slug: field.field,
value: field.value
});
}
}
}
const contactData: any = {
email,
};
if (locale) contactData.locale = locale;
if (fields.length > 0) contactData.fields = fields;
const contact = await systemeIoCommon.apiCall<{ id: number }>({
method: HttpMethod.POST,
url: '/contacts',
body: contactData,
auth: context.auth.secret_text,
});
const tagResults = [];
if (tagSource === 'existing' && existingTags && existingTags.length > 0 && contact.id) {
for (const tagId of existingTags) {
try {
const tagResponse = await systemeIoCommon.apiCall({
method: HttpMethod.POST,
url: `/contacts/${contact.id}/tags`,
body: {
tagId: tagId,
},
auth: context.auth.secret_text,
});
tagResults.push({
tagId,
success: true,
response: tagResponse,
});
} catch (error) {
tagResults.push({
tagId,
success: false,
error: error instanceof Error ? error.message : 'Unknown error',
});
}
}
} else if (tagSource === 'new' && newTagNames && Array.isArray(newTagNames)) {
for (const tagNameObj of newTagNames as TagName[]) {
const tagName = tagNameObj.name;
if (!tagName || tagName.trim() === '') continue;
try {
const tagResponse = await systemeIoCommon.apiCall<{ id: number }>({
method: HttpMethod.POST,
url: '/tags',
body: {
name: tagName.trim(),
},
auth: context.auth.secret_text,
});
if (tagResponse.id) {
const tagAssignResponse = await systemeIoCommon.apiCall({
method: HttpMethod.POST,
url: `/contacts/${contact.id}/tags`,
body: {
tagId: tagResponse.id,
},
auth: context.auth.secret_text,
});
tagResults.push({
tagId: tagResponse.id,
tagName: tagName,
success: true,
response: tagAssignResponse,
});
}
} catch (error) {
tagResults.push({
tagId: tagName,
tagName: tagName,
success: false,
error: error instanceof Error ? error.message : 'Unknown error',
});
}
}
}
return {
contact,
tagResults,
tagSource,
totalTagsAssigned: tagResults.filter(t => t.success).length,
dynamicFieldsProcessed: dynamicContactFields ? Object.keys(dynamicContactFields).filter(key =>
dynamicContactFields[key] !== undefined &&
dynamicContactFields[key] !== null &&
dynamicContactFields[key] !== ''
).length : 0,
customFieldsProcessed: customFields ? customFields.length : 0,
newTagsCreated: tagSource === 'new' ? tagResults.filter(t => t.success).length : 0,
};
},
});

View File

@@ -0,0 +1,72 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { systemeIoAuth } from '../common/auth';
import { systemeIoCommon } from '../common/client';
export const findContactByEmail = createAction({
auth: systemeIoAuth,
name: 'findContactByEmail',
displayName: 'Find Contact by Email',
description: 'Locate an existing contact by email address',
props: {
email: Property.ShortText({
displayName: 'Email',
description: 'The email address to search for',
required: true,
}),
},
async run(context) {
const { email } = context.propsValue;
const searchEmail = email.toLowerCase().trim();
const allContacts: any[] = [];
let hasMore = true;
let startingAfter: string | undefined;
while (hasMore) {
const response = await systemeIoCommon.getContacts({
auth: context.auth.secret_text,
limit: 100,
startingAfter,
});
let contacts: any[] = [];
let nextHasMore = false;
if (Array.isArray(response)) {
contacts = response;
} else if (response && typeof response === 'object' && response !== null) {
const responseAny = response as any;
if (responseAny.items && Array.isArray(responseAny.items)) {
contacts = responseAny.items;
}
nextHasMore = responseAny.hasMore || false;
}
allContacts.push(...contacts);
if (nextHasMore && contacts.length > 0) {
startingAfter = contacts[contacts.length - 1].id?.toString();
} else {
hasMore = false;
}
}
const foundContact = allContacts.find(contact =>
contact.email && contact.email.toLowerCase().trim() === searchEmail
);
if (foundContact) {
return {
success: true,
contact: foundContact,
message: 'Contact found successfully',
};
} else {
return {
success: false,
contact: null,
message: `No contact found with email: ${email}`,
};
}
},
});

View File

@@ -0,0 +1,110 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { systemeIoAuth } from '../common/auth';
import { systemeIoCommon } from '../common/client';
import { systemeIoProps } from '../common/props';
export const removeTagFromContact = createAction({
auth: systemeIoAuth,
name: 'removeTagFromContact',
displayName: 'Remove Tag from Contact',
description: 'Remove a tag that is currently assigned to an existing contact',
props: {
contactId: systemeIoProps.contactIdDropdown,
tagId: Property.Dropdown({
auth: systemeIoAuth,
displayName: 'Tag to Remove',
description: 'Select a tag currently assigned to this contact',
required: true,
refreshers: ['contactId'],
options: async ({ auth, contactId }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Please connect your account first',
options: [],
};
}
if (!contactId) {
return {
disabled: true,
placeholder: 'Please select a contact first',
options: [],
};
}
try {
const contact = await systemeIoCommon.getContact({
contactId: contactId as string,
auth: auth.secret_text,
});
let contactTags: any[] = [];
if (contact && typeof contact === 'object' && (contact as any).tags) {
contactTags = (contact as any).tags;
}
if (contactTags.length > 0) {
return {
disabled: false,
options: contactTags.map((tag: any) => ({
label: tag.name,
value: tag.id,
})),
};
}
return {
disabled: true,
placeholder: 'This contact has no tags to remove',
options: [],
};
} catch (error) {
console.error('Error fetching contact tags:', error);
return {
disabled: true,
placeholder: 'Error loading contact tags',
options: [],
};
}
},
}),
},
async run(context) {
const { contactId, tagId } = context.propsValue;
let tagName = 'Unknown Tag';
try {
const contact = await systemeIoCommon.getContact({
contactId: contactId as string,
auth: context.auth.secret_text,
});
if (contact && typeof contact === 'object' && (contact as any).tags) {
const contactTags = (contact as any).tags;
const foundTag = contactTags.find((tag: any) => tag.id == tagId);
if (foundTag) {
tagName = foundTag.name;
}
}
} catch (error) {
console.warn('Could not fetch contact details for tag name:', error);
}
const response = await systemeIoCommon.apiCall({
method: HttpMethod.DELETE,
url: `/contacts/${contactId}/tags/${tagId}`,
auth: context.auth.secret_text,
});
return {
success: true,
contactId,
tagId,
tagName,
message: `Tag "${tagName}" successfully removed from contact`,
response,
};
},
});

View File

@@ -0,0 +1,149 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { systemeIoAuth } from '../common/auth';
import { systemeIoCommon } from '../common/client';
import { systemeIoProps } from '../common/props';
interface ContactFieldUpdate {
field: string;
value: string;
}
export const updateContact = createAction({
auth: systemeIoAuth,
name: 'updateContact',
displayName: 'Update Contact',
description: 'Update fields (name, phone, custom fields) of an existing contact using fields from your Systeme.io account',
props: {
contactId: systemeIoProps.contactIdDropdown,
dynamicContactFields: Property.DynamicProperties({
auth: systemeIoAuth,
displayName: 'Contact Fields',
description: 'Select which contact fields to update',
required: false,
refreshers: ['contactId'],
props: async ({ auth, contactId }) => {
if (!auth) {
return {};
}
try {
const response = await systemeIoCommon.getContactFields({
auth: auth.secret_text,
});
let fields: any[] = [];
if (Array.isArray(response)) {
fields = response;
} else if (response && typeof response === 'object' && response !== null) {
const responseAny = response as any;
if (responseAny.items && Array.isArray(responseAny.items)) {
fields = responseAny.items;
}
}
const dynamicProps: any = {};
for (const field of fields) {
dynamicProps[field.slug] = Property.ShortText({
displayName: field.fieldName || field.slug,
description: `Update ${field.fieldName || field.slug} (leave empty to keep current value)`,
required: false,
});
}
return dynamicProps;
} catch (error) {
console.error('Error fetching contact fields:', error);
return {};
}
},
}),
customFields: Property.Array({
displayName: 'Custom Fields (Manual Entry)',
description: 'Add or update custom fields with manual slug entry (use empty value to clear field)',
required: false,
properties: {
fieldSlug: Property.ShortText({
displayName: 'Field Slug',
description: 'The unique identifier for this field (e.g., custom_field_1, my_field)',
required: true,
}),
fieldValue: Property.ShortText({
displayName: 'Field Value',
description: 'The value for this field (leave empty to clear the field)',
required: false,
}),
},
}),
},
async run(context) {
const {
contactId,
dynamicContactFields,
customFields
} = context.propsValue;
const fields: any[] = [];
if (dynamicContactFields && typeof dynamicContactFields === 'object') {
const fieldsObj = dynamicContactFields as Record<string, any>;
for (const key in fieldsObj) {
if (Object.prototype.hasOwnProperty.call(fieldsObj, key)) {
const value = fieldsObj[key];
if (value !== undefined && value !== null && value !== '') {
fields.push({
slug: key,
value: String(value)
});
}
}
}
}
if (customFields && Array.isArray(customFields)) {
for (const customField of customFields as any[]) {
if (customField.fieldSlug) {
fields.push({
slug: customField.fieldSlug,
value: customField.fieldValue || null
});
}
}
}
const updateData: any = {};
if (fields.length > 0) updateData.fields = fields;
if (Object.keys(updateData).length === 0) {
return {
success: false,
message: 'No fields provided to update',
contactId,
};
}
const response = await systemeIoCommon.apiCall({
method: HttpMethod.PATCH,
url: `/contacts/${contactId}`,
body: updateData,
auth: context.auth.secret_text,
headers: {
'Content-Type': 'application/merge-patch+json',
},
});
return {
success: true,
contactId,
updatedFields: fields,
customFieldsProcessed: customFields ? customFields.length : 0,
dynamicFieldsProcessed: dynamicContactFields ? Object.keys(dynamicContactFields).filter(key =>
dynamicContactFields[key] !== undefined &&
dynamicContactFields[key] !== null &&
dynamicContactFields[key] !== ''
).length : 0,
response,
};
},
});

View File

@@ -0,0 +1,35 @@
import { PieceAuth } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { systemeIoCommon } from './client';
export const systemeIoAuth = PieceAuth.SecretText({
displayName: 'API Key',
description: 'Your Systeme.io API key. You can find this in your Systeme.io dashboard under Profile Settings > Public API Keys.',
required: true,
validate: async ({ auth }) => {
try {
await systemeIoCommon.apiCall({
method: HttpMethod.GET,
url: '/tags',
auth: { apiKey: auth },
});
return {
valid: true,
message: 'API key validated successfully. Connected to Systeme.io.'
};
} catch (error: any) {
if (error.message.includes('401') || error.message.includes('403')) {
return {
valid: false,
error: 'Invalid API key. Please check your API key and try again.',
};
}
return {
valid: false,
error: `Authentication failed: ${error.message}. Please verify your API key is correct.`,
};
}
},
});

View File

@@ -0,0 +1,158 @@
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
import crypto from 'crypto';
export const systemeIoCommon = {
baseUrl: 'https://api.systeme.io/api',
async apiCall<T>({
method,
url,
body,
auth,
headers,
}: {
method: HttpMethod;
url: string;
body?: any;
auth: string | { apiKey: string };
headers?: Record<string, string>;
}): Promise<T> {
const apiKey = typeof auth === 'string' ? auth : auth.apiKey;
const response = await httpClient.sendRequest<T>({
method,
url: `${this.baseUrl}${url}`,
headers: {
'X-API-Key': apiKey,
'Content-Type': 'application/json',
...headers,
},
body,
});
if (response.status >= 400) {
throw new Error(`Systeme.io API error: ${response.status}`);
}
return response.body;
},
verifyWebhookSignature: (
webhookSecret?: string,
webhookSignatureHeader?: string,
webhookRawBody?: any,
): boolean => {
if (!webhookSecret || !webhookSignatureHeader || !webhookRawBody) {
return false;
}
try {
const hmac = crypto.createHmac('sha256', webhookSecret);
hmac.update(webhookRawBody);
const expectedSignature = hmac.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(webhookSignatureHeader, 'hex'),
Buffer.from(expectedSignature, 'hex'),
);
} catch (error) {
return false;
}
},
async createWebhook({
eventType,
webhookUrl,
auth,
secret,
}: {
eventType: string;
webhookUrl: string;
auth: string | { apiKey: string };
secret: string;
}) {
return this.apiCall<{ id: string }>({
method: HttpMethod.POST,
url: '/webhooks',
body: {
name: `Activepieces Webhook - ${eventType}`,
url: webhookUrl,
subscriptions: [eventType],
secret: secret,
},
auth,
});
},
async deleteWebhook({
webhookId,
auth,
}: {
webhookId: string;
auth: string | { apiKey: string };
}) {
return this.apiCall({
method: HttpMethod.DELETE,
url: `/webhooks/${webhookId}`,
auth,
});
},
async getContacts({
auth,
limit = 50,
startingAfter,
}: {
auth: string | { apiKey: string };
limit?: number;
startingAfter?: string;
}) {
const params = new URLSearchParams();
if (limit) params.append('limit', limit.toString());
if (startingAfter) params.append('startingAfter', startingAfter);
return this.apiCall({
method: HttpMethod.GET,
url: `/contacts?${params.toString()}`,
auth,
});
},
async getContact({
contactId,
auth,
}: {
contactId: string;
auth: string | { apiKey: string };
}) {
return this.apiCall({
method: HttpMethod.GET,
url: `/contacts/${contactId}`,
auth,
});
},
async getTags({
auth,
}: {
auth: string | { apiKey: string };
}) {
return this.apiCall({
method: HttpMethod.GET,
url: '/tags',
auth,
});
},
async getContactFields({
auth,
}: {
auth: string | { apiKey: string };
}) {
return this.apiCall({
method: HttpMethod.GET,
url: '/contact_fields',
auth,
});
},
};

View File

@@ -0,0 +1,3 @@
export { systemeIoAuth } from './auth';
export { systemeIoCommon } from './client';
export { systemeIoProps } from './props';

View File

@@ -0,0 +1,361 @@
import { Property } from '@activepieces/pieces-framework';
import { systemeIoCommon } from './client';
import { systemeIoAuth } from './auth';
export const systemeIoProps = {
contactDropdown: Property.Dropdown({
auth: systemeIoAuth,
displayName: 'Contact',
description: 'Select a contact',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Please connect your account first',
options: [],
};
}
try {
const response = await systemeIoCommon.getContacts({
auth: auth.secret_text,
limit: 100,
});
let contacts: any[] = [];
if (Array.isArray(response)) {
contacts = response;
} else if (response && typeof response === 'object' && response !== null) {
const responseAny = response as any;
if (responseAny.items && Array.isArray(responseAny.items)) {
contacts = responseAny.items;
}
}
if (contacts.length > 0) {
return {
disabled: false,
options: contacts.map((contact: any) => ({
label: `${contact.first_name || ''} ${contact.last_name || ''} (${contact.email})`.trim(),
value: contact.id,
})),
};
}
return {
disabled: true,
placeholder: 'No contacts found',
options: [],
};
} catch (error) {
console.error('Error fetching contacts:', error);
return {
disabled: true,
placeholder: 'Error loading contacts',
options: [],
};
}
},
}),
tagDropdown: Property.Dropdown({
auth: systemeIoAuth,
displayName: 'Tag',
description: 'Select a tag',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Please connect your account first',
options: [],
};
}
try {
const response = await systemeIoCommon.getTags({
auth: auth.secret_text,
});
let tags: any[] = [];
if (Array.isArray(response)) {
tags = response;
} else if (response && typeof response === 'object' && response !== null) {
const responseAny = response as any;
if (responseAny.items && Array.isArray(responseAny.items)) {
tags = responseAny.items;
}
}
if (tags.length > 0) {
return {
disabled: false,
options: tags.map((tag: any) => ({
label: tag.name,
value: tag.id,
})),
};
}
return {
disabled: true,
placeholder: 'No tags found',
options: [],
};
} catch (error) {
console.error('Error fetching tags:', error);
return {
disabled: true,
placeholder: 'Error loading tags',
options: [],
};
}
},
}),
tagsMultiSelectDropdown: Property.MultiSelectDropdown({
auth: systemeIoAuth,
displayName: 'Tags',
description: 'Select tags to assign to the contact',
required: false,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Please connect your account first',
options: [],
};
}
try {
const response = await systemeIoCommon.getTags({
auth: auth.secret_text,
});
let tags: any[] = [];
if (Array.isArray(response)) {
tags = response;
} else if (response && typeof response === 'object' && response !== null) {
const responseAny = response as any;
if (responseAny.items && Array.isArray(responseAny.items)) {
tags = responseAny.items;
}
}
if (tags.length > 0) {
return {
disabled: false,
options: tags.map((tag: any) => ({
label: tag.name || tag.id,
value: tag.id,
})),
};
}
return {
disabled: true,
placeholder: 'No tags found',
options: [],
};
} catch (error) {
console.error('Error fetching tags:', error);
return {
disabled: true,
placeholder: 'Error loading tags',
options: [],
};
}
},
}),
contactIdDropdown: Property.Dropdown({
auth: systemeIoAuth,
displayName: 'Contact ID',
description: 'Select a contact by ID',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Please connect your account first',
options: [],
};
}
try {
const response = await systemeIoCommon.getContacts({
auth: auth.secret_text,
limit: 100,
});
let contacts: any[] = [];
if (Array.isArray(response)) {
contacts = response;
} else if (response && typeof response === 'object' && response !== null) {
const responseAny = response as any;
if (responseAny.items && Array.isArray(responseAny.items)) {
contacts = responseAny.items;
}
}
if (contacts.length > 0) {
return {
disabled: false,
options: contacts.map((contact: any) => ({
label: `ID: ${contact.id} - ${contact.first_name || ''} ${contact.last_name || ''} (${contact.email})`.trim(),
value: contact.id,
})),
};
}
return {
disabled: true,
placeholder: 'No contacts found',
options: [],
};
} catch (error) {
console.error('Error fetching contacts:', error);
return {
disabled: true,
placeholder: 'Error loading contacts',
options: [],
};
}
},
}),
tagNameDropdown: Property.Dropdown({
auth: systemeIoAuth,
displayName: 'Tag Name',
description: 'Select a tag by name',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Please connect your account first',
options: [],
};
}
try {
const response = await systemeIoCommon.getTags({
auth: auth.secret_text,
});
let tags: any[] = [];
if (Array.isArray(response)) {
tags = response;
} else if (response && typeof response === 'object' && response !== null) {
const responseAny = response as any;
if (responseAny.items && Array.isArray(responseAny.items)) {
tags = responseAny.items;
}
}
if (tags.length > 0) {
return {
disabled: false,
options: tags.map((tag: any) => ({
label: tag.name,
value: tag.name,
})),
};
}
return {
disabled: true,
placeholder: 'No tags found',
options: [],
};
} catch (error) {
console.error('Error fetching tags:', error);
return {
disabled: true,
placeholder: 'Error loading tags',
options: [],
};
}
},
}),
contactFields: Property.Array({
displayName: 'Custom Contact Fields',
description: 'Add custom contact field values (e.g., country, company, etc.)',
required: false,
properties: {
field: Property.ShortText({
displayName: 'Field Slug',
description: 'Enter the field slug (e.g., country, company, custom1)',
required: true,
}),
value: Property.ShortText({
displayName: 'Value',
description: 'Enter the field value',
required: false,
}),
},
}),
contactFieldDropdown: Property.Dropdown({
auth: systemeIoAuth,
displayName: 'Contact Field',
description: 'Select a contact field',
required: false,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Please connect your account first',
options: [],
};
}
try {
const response = await systemeIoCommon.getContactFields({
auth: auth.secret_text,
});
let fields: any[] = [];
if (Array.isArray(response)) {
fields = response;
} else if (response && typeof response === 'object' && response !== null) {
const responseAny = response as any;
if (responseAny.items && Array.isArray(responseAny.items)) {
fields = responseAny.items;
}
}
if (fields.length > 0) {
return {
disabled: false,
options: fields.map((field: any) => ({
label: field.fieldName || field.slug,
value: field.slug,
})),
};
}
return {
disabled: true,
placeholder: 'No contact fields found',
options: [],
};
} catch (error) {
console.error('Error fetching contact fields:', error);
return {
disabled: true,
placeholder: 'Error loading contact fields',
options: [],
};
}
},
}),
};

View File

@@ -0,0 +1,88 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { systemeIoAuth } from '../common/auth';
import { systemeIoCommon } from '../common/client';
import { randomBytes } from 'crypto';
export const newContact = createTrigger({
auth: systemeIoAuth,
name: 'newContact',
displayName: 'New Contact',
description: 'Fires when a new contact is created',
props: {},
sampleData: {
contact: {
id: 12345,
email: "email@example.com",
registeredAt: "2024-01-01T00:00:00+00:00",
locale: "en",
sourceURL: null,
unsubscribed: false,
bounced: false,
needsConfirmation: false,
fields: [
{
fieldName: "first_name",
slug: "first_name",
value: "John"
},
{
fieldName: "last_name",
slug: "last_name",
value: "Doe"
},
{
fieldName: "phone_number",
slug: "phone_number",
value: "+1234567890"
}
],
tags: [
{
id: 1,
name: "new_customer"
},
{
id: 2,
name: "email_subscriber"
}
]
}
},
type: TriggerStrategy.WEBHOOK,
async onEnable(context) {
const secret = randomBytes(32).toString('hex');
const response = await systemeIoCommon.createWebhook({
eventType: 'CONTACT_CREATED',
webhookUrl: context.webhookUrl,
auth: context.auth.secret_text,
secret: secret,
});
await context.store.put('new_contact_webhook_id', response.id);
await context.store.put('new_contact_webhook_secret', secret);
},
async onDisable(context) {
const webhookId = await context.store.get<string>('new_contact_webhook_id');
if (webhookId) {
await systemeIoCommon.deleteWebhook({
webhookId,
auth: context.auth.secret_text,
});
await context.store.put('new_contact_webhook_id', null);
await context.store.put('new_contact_webhook_secret', null);
}
},
async run(context) {
const webhookSecret = await context.store.get<string>('new_contact_webhook_secret');
const webhookSignatureHeader = context.payload.headers['x-webhook-signature'];
const rawBody = context.payload.rawBody;
if (!systemeIoCommon.verifyWebhookSignature(webhookSecret || undefined, webhookSignatureHeader, rawBody)) {
console.warn('Systeme.io webhook signature verification failed');
return [];
}
const payload = context.payload.body as any;
return [payload.contact || payload];
}
});

View File

@@ -0,0 +1,84 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { systemeIoAuth } from '../common/auth';
import { systemeIoCommon } from '../common/client';
import { randomBytes } from 'crypto';
export const newSale = createTrigger({
auth: systemeIoAuth,
name: 'newSale',
displayName: 'New Sale',
description: 'Fires when a new purchase is made within a funnel',
props: {},
sampleData: {
sale: {
id: 67890,
amount: 99.99,
currency: "USD",
status: "completed",
createdAt: "2024-01-01T00:00:00+00:00",
updatedAt: "2024-01-01T00:00:00+00:00",
product: {
id: 123,
name: "Premium Course",
type: "digital_product"
},
funnel: {
id: 456,
name: "Sales Funnel",
step: "checkout"
},
contact: {
id: 12345,
email: "customer@example.com",
firstName: "John",
lastName: "Doe"
},
payment: {
method: "stripe",
transactionId: "txn_1234567890",
gateway: "stripe"
},
affiliate: {
id: null,
commission: null
}
}
},
type: TriggerStrategy.WEBHOOK,
async onEnable(context) {
const secret = randomBytes(32).toString('hex');
const response = await systemeIoCommon.createWebhook({
eventType: 'SALE_NEW',
webhookUrl: context.webhookUrl,
auth: context.auth.secret_text,
secret: secret,
});
await context.store.put('new_sale_webhook_id', response.id);
await context.store.put('new_sale_webhook_secret', secret);
},
async onDisable(context) {
const webhookId = await context.store.get<string>('new_sale_webhook_id');
if (webhookId) {
await systemeIoCommon.deleteWebhook({
webhookId,
auth: context.auth.secret_text,
});
await context.store.put('new_sale_webhook_id', null);
await context.store.put('new_sale_webhook_secret', null);
}
},
async run(context) {
const webhookSecret = await context.store.get<string>('new_sale_webhook_secret');
const webhookSignatureHeader = context.payload.headers['x-webhook-signature'];
const rawBody = context.payload.rawBody;
if (!systemeIoCommon.verifyWebhookSignature(webhookSecret || undefined, webhookSignatureHeader, rawBody)) {
console.warn('Systeme.io webhook signature verification failed');
return [];
}
const payload = context.payload.body as any;
return [payload.sale || payload];
}
});

View File

@@ -0,0 +1,93 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { systemeIoAuth } from '../common/auth';
import { systemeIoCommon } from '../common/client';
import { randomBytes } from 'crypto';
export const newTagAddedToContact = createTrigger({
auth: systemeIoAuth,
name: 'newTagAddedToContact',
displayName: 'New Tag Added to Contact',
description: 'Fires when a specific tag is assigned to a contact',
props: {},
sampleData: {
contact: {
id: 12345,
email: "customer@example.com",
registeredAt: "2024-01-01T00:00:00+00:00",
locale: "en",
sourceURL: null,
unsubscribed: false,
bounced: false,
needsConfirmation: false,
fields: [
{
fieldName: "first_name",
slug: "first_name",
value: "John"
},
{
fieldName: "last_name",
slug: "last_name",
value: "Doe"
},
{
fieldName: "phone_number",
slug: "phone_number",
value: "+1234567890"
}
],
tags: [
{
id: 1,
name: "existing_customer"
},
{
id: 2,
name: "VIP Customer"
}
]
},
tag: {
id: 2,
name: "VIP Customer"
},
addedAt: "2024-01-01T10:30:00+00:00"
},
type: TriggerStrategy.WEBHOOK,
async onEnable(context) {
const secret = randomBytes(32).toString('hex');
const response = await systemeIoCommon.createWebhook({
eventType: 'CONTACT_TAG_ADDED',
webhookUrl: context.webhookUrl,
auth: context.auth.secret_text ,
secret: secret,
});
await context.store.put('new_tag_added_webhook_id', response.id);
await context.store.put('new_tag_added_webhook_secret', secret);
},
async onDisable(context) {
const webhookId = await context.store.get<string>('new_tag_added_webhook_id');
if (webhookId) {
await systemeIoCommon.deleteWebhook({
webhookId,
auth: context.auth.secret_text,
});
await context.store.put('new_tag_added_webhook_id', null);
await context.store.put('new_tag_added_webhook_secret', null);
}
},
async run(context) {
const webhookSecret = await context.store.get<string>('new_tag_added_webhook_secret');
const webhookSignatureHeader = context.payload.headers['x-webhook-signature'];
const rawBody = context.payload.rawBody;
if (!systemeIoCommon.verifyWebhookSignature(webhookSecret || undefined, webhookSignatureHeader, rawBody)) {
console.warn('Systeme.io webhook signature verification failed');
return [];
}
const payload = context.payload.body as any;
return [payload];
}
});