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,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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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": "特定のタグが連絡先に割り当てられたときに発行されます"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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": "Стреляет при назначении контакту определенного тега"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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,
|
||||
],
|
||||
});
|
||||
@@ -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,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -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,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -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}`,
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -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,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -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,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -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.`,
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -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,
|
||||
});
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,3 @@
|
||||
export { systemeIoAuth } from './auth';
|
||||
export { systemeIoCommon } from './client';
|
||||
export { systemeIoProps } from './props';
|
||||
@@ -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: [],
|
||||
};
|
||||
}
|
||||
},
|
||||
}),
|
||||
};
|
||||
@@ -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];
|
||||
}
|
||||
});
|
||||
@@ -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];
|
||||
}
|
||||
});
|
||||
@@ -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];
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user