Add Activepieces integration for workflow automation

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

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

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

View File

@@ -0,0 +1,110 @@
{
"Zoho Campaigns is an email marketing platform for managing mailing lists, sending campaigns, tracking engagement, and automating subscriber workflows.": "Zoho Campaigns ist eine E-Mail-Marketing-Plattform für das Verwalten von Mailinglisten, das Versenden von Kampagnen, das Tracking von Engagements und die Automatisierung von Abonnentenworkflows.",
"Data Center": "Rechenzentrum",
"The data center location of your Zoho Campaigns account": "Der Standort des Rechenzentrums Ihres Zoho Kampagnen-Kontos",
"zoho.com (United States)": "zoho.com (Vereinigte Staaten)",
"zoho.eu (Europe)": "zoho.eu (Europa)",
"zoho.in (India)": "zoho.in (Indien)",
"zoho.com.au (Australia)": "zoho.com.au (Australien)",
"zoho.jp (Japan)": "zoho.jp (Japan)",
"zoho.com.cn (China)": "zoho.com.cn (China)",
"Connect your Zoho Campaigns account using OAuth2": "Verbinden Sie Ihr Zoho Kampagnen-Konto mit OAuth2",
"Create Campaign": "Kampagne erstellen",
"Clone Campaign": "Kampagne klonen",
"Send Campaign": "Kampagne senden",
"Add/Update Contact": "Kontakt hinzufügen/aktualisieren",
"Add Tag to Contact": "Tag zu Kontakt hinzufügen",
"Remove Tag": "Tag entfernen",
"Unsubscribe Contact": "Kontakt abbestellen",
"Add Contact to Mailing List": "Kontakt zur Mailingliste hinzufügen",
"Find Contact": "Kontakt finden",
"Find Campaign": "Kampagne suchen",
"Create a new campaign with campaign name, subject, topic, sender name/address, and mailing list.": "Erstellen Sie eine neue Kampagne mit Kampagnenname, Betreff, Thema, Absendername/Adresse und Mailingliste.",
"Clone an existing campaign, optionally renaming.": "Klonen Sie eine bestehende Kampagne, optional umbenennen.",
"Send a campaign that has been created or cloned.": "Senden Sie eine Kampagne, die erstellt oder geklont wurde.",
"Add a new contact or update an existing one. Confirmation email sent based on mailing list settings.": "Fügen Sie einen neuen Kontakt hinzu oder aktualisieren Sie einen existierenden Kontakt. Bestätigungs-E-Mail basierend auf den Einstellungen der Mailingliste.",
"Apply a tag to a contact by email. Creates the tag if it doesn't exist.": "Fügen Sie ein Schlagwort auf einen Kontakt per E-Mail zu. Erstellt das Schlagwort, wenn es nicht existiert.",
"Remove a tag from a contact.": "Ein Tag von einem Kontakt entfernen.",
"Remove a contact from a mailing list.": "Entferne einen Kontakt aus einer Mailingliste.",
"Add contacts to your mailing lists.": "Kontakte zu Ihren Mailinglisten hinzufügen.",
"Look up an existing contact by email address.": "Suchen Sie einen vorhandenen Kontakt per E-Mail-Adresse.",
"Locate an existing campaign by campaign name.": "Suchen Sie eine bestehende Kampagne nach Kampagnennamen.",
"Campaign Name": "Kampagnenname",
"From Email": "Absender-E-Mail",
"Subject": "Betreff",
"Mailing Lists": "Mailinglisten",
"Content URL": "Inhalts-URL",
"Topic": "Thema",
"Campaign": "Kampagne",
"From Name": "Absendername",
"Reply-To Email": "Antwort-An E-Mail",
"Encoding Type": "Kodierungstyp",
"Mailing List": "Mailingliste",
"Contact Information": "Kontaktinformationen",
"Source": "Quelle",
"Tag": "Markierung",
"Contact Email": "Kontakt-E-Mail",
"Emails": "E-Mails",
"Contact Status": "Kontaktstatus",
"Sort Order": "Sortierung",
"From Index": "Von Index",
"Range": "Range",
"Campaign Status": "Kampagnen-Status",
"A name to your campaign": "Ein Name für Ihre Kampagne",
"Sender email address for the campaign": "Absender-E-Mail-Adresse für die Kampagne",
"The subject line of the campaign": "Die Betreffzeile der Kampagne",
"Select the mailing lists": "Wählen Sie die Mailinglisten",
"Public URL containing the HTML content for your campaign": "Öffentliche URL, die den HTML-Inhalt Ihrer Kampagne enthält",
"Select the topic": "Thema auswählen",
"Select the campaign": "Wählen Sie die Kampagne",
"New name for the cloned campaign": "Neuer Name für die geklonte Kampagne",
"New subject line for the cloned campaign": "Neue Betreffzeile für die geklonte Kampagne",
"Sender name for the cloned campaign": "Absendername für die geklonte Kampagne",
"Sender email address for the cloned campaign": "Absender-E-Mail-Adresse für die geklonte Kampagne",
"Reply-to email address for the cloned campaign": "Antwort-E-Mail-Adresse für die geklonte Kampagne",
"Email encoding type (e.g., UTF-8)": "E-Mail-Verschlüsselungstyp (z. B. UTF-8)",
"Select the mailing list": "Mailingliste auswählen",
"Information about the contact": "Informationen über den Kontakt",
"Contact source can be added.": "Kontaktquelle kann hinzugefügt werden.",
"Select the tag to associate with the contact": "Wählen Sie das Schlagwort für die Verbindung mit dem Kontakt",
"Email address of the contact to tag": "E-Mail-Adresse des zu markierenden Kontakts",
"Email address of the contact to remove the tag from": "E-Mail-Adresse des Kontakts zum Entfernen des Tags",
"Contacts email addresses to be added to the mailing list (maximum 10 emails)": "Kontakte E-Mail-Adressen, die zur Mailingliste hinzugefügt werden sollen (maximal 10 E-Mails)",
"Email of the contact to be found (partial matches supported)": "E-Mail des gesuchten Kontakts (Partielle Treffer unterstützt)",
"Filter contacts by status (optional)": "Kontakte nach Status filtern (optional)",
"Sort order for results (optional)": "Sortierreihenfolge für Ergebnisse (optional)",
"Starting index for pagination (optional, default: 1)": "Start-Index für Seitennavigation (optional, Standard: 1)",
"Number of contacts to retrieve (optional, default: all)": "Anzahl der abzurufenden Kontakte (optional, Standard: alle)",
"Name of the campaign to be found (partial matches supported)": "Name der zu findenden Kampagne (Partielle Treffer unterstützt)",
"Filter campaigns by status (optional)": "Kampagnen nach Status filtern (optional)",
"Number of campaigns to retrieve (optional, default: 5)": "Anzahl der abzurufenden Kampagnen (optional, Standard: 5)",
"Active": "Aktiv",
"Recent": "Neueste",
"Most Recent": "Neueste",
"Unsubscribed": "Abgemeldet",
"Bounced": "Geprallt",
"Ascending": "Aufsteigend",
"Descending": "Absteigend",
"All": "Alle",
"All Campaigns": "Alle Kampagnen",
"Drafts": "Entwürfe",
"Scheduled": "Geplant",
"In Progress": "In Bearbeitung",
"Sent": "Gesendet",
"Stopped": "Stoppt",
"Canceled": "Abgebrochen",
"To Be Reviewed": "Zu überprüfen",
"Reviewed": "Überprüft",
"Paused": "Pausiert",
"In Testing": "In Testen",
"New Contact": "Neuer Kontakt",
"Unsubscribe": "Abmelden",
"New Campaign": "Neue Kampagne",
"Fires when a new contact is added to a selected mailing list.": "Löscht ab, wenn ein neuer Kontakt einer ausgewählten Mailingliste hinzugefügt wird.",
"Fires when a contact is removed from a mailing list or unsubscribed.": "Löst ab, wenn ein Kontakt von einer Mailingliste entfernt oder abgemeldet wird.",
"Fires when a new campaign is created.": "Feuert ab, wenn eine neue Kampagne erstellt wird.",
"Unsubscribe Type": "Abmeldeart",
"Filter contacts by status (default: active)": "Kontakte nach Status filtern (Standard: aktiv)",
"Sort order for contacts (default: descending)": "Reihenfolge nach Kontakten sortieren (Standard: absteigend)",
"Type of contact removal to monitor (default: unsubscribed)": "Art der zu überwachenden Kontaktentfernung (Standard: abbestellen)"
}

View File

@@ -0,0 +1,110 @@
{
"Zoho Campaigns is an email marketing platform for managing mailing lists, sending campaigns, tracking engagement, and automating subscriber workflows.": "La campaña Zoho es una plataforma de marketing por correo electrónico para la gestión de listas de correo, el envío de campañas, la participación en el seguimiento y la automatización de los flujos de trabajo de suscriptores.",
"Data Center": "Centro de Datos",
"The data center location of your Zoho Campaigns account": "La ubicación del centro de datos de tu cuenta de la Campaña Zoho",
"zoho.com (United States)": "zoho.com (Estados Unidos)",
"zoho.eu (Europe)": "zoho.eu (Europa)",
"zoho.in (India)": "zoho.in (India)",
"zoho.com.au (Australia)": "zoho.com.au (Tamaño)",
"zoho.jp (Japan)": "zoho.jp (Japón)",
"zoho.com.cn (China)": "zoho.com.cn (China)",
"Connect your Zoho Campaigns account using OAuth2": "Conecte su cuenta de la Campaña Zoho usando OAuth2",
"Create Campaign": "Crear Campaña",
"Clone Campaign": "Clonar campaña",
"Send Campaign": "Enviar Campaña",
"Add/Update Contact": "Añadir/Actualizar contacto",
"Add Tag to Contact": "Añadir etiqueta al contacto",
"Remove Tag": "Eliminar etiqueta",
"Unsubscribe Contact": "Desuscribirse Contacto",
"Add Contact to Mailing List": "Añadir contacto a la lista de correo",
"Find Contact": "Encontrar contacto",
"Find Campaign": "Buscar campaña",
"Create a new campaign with campaign name, subject, topic, sender name/address, and mailing list.": "Crear una nueva campaña con nombre de campaña, tema, tema, nombre del remitente, dirección y lista de correo.",
"Clone an existing campaign, optionally renaming.": "Clonar una campaña existente, opcionalmente renombrar.",
"Send a campaign that has been created or cloned.": "Enviar una campaña que ha sido creada o clonada.",
"Add a new contact or update an existing one. Confirmation email sent based on mailing list settings.": "Añadir un nuevo contacto o actualizar uno existente. Correo electrónico de confirmación enviado basándose en la configuración de la lista de correo.",
"Apply a tag to a contact by email. Creates the tag if it doesn't exist.": "Aplicar una etiqueta a un contacto por correo electrónico. Crea la etiqueta si no existe.",
"Remove a tag from a contact.": "Eliminar una etiqueta de un contacto.",
"Remove a contact from a mailing list.": "Eliminar un contacto de una lista de correo.",
"Add contacts to your mailing lists.": "Añadir contactos a sus listas de correo.",
"Look up an existing contact by email address.": "Buscar un contacto existente por dirección de correo electrónico.",
"Locate an existing campaign by campaign name.": "Localice una campaña existente por nombre de campaña.",
"Campaign Name": "Nombre de Campaña",
"From Email": "Desde Email",
"Subject": "Asunto",
"Mailing Lists": "Listas de correo",
"Content URL": "URL de contenido",
"Topic": "Tema",
"Campaign": "Campaña",
"From Name": "De nombre",
"Reply-To Email": "Responder a Email",
"Encoding Type": "Tipo de codificación",
"Mailing List": "Lista de correo",
"Contact Information": "Información de contacto",
"Source": "Fuente",
"Tag": "Etiqueta",
"Contact Email": "Email de contacto",
"Emails": "Correos",
"Contact Status": "Estado del Contacto",
"Sort Order": "Ordenar",
"From Index": "Desde el índice",
"Range": "Range",
"Campaign Status": "Estado de la campaña",
"A name to your campaign": "Un nombre para tu campaña",
"Sender email address for the campaign": "Dirección de correo electrónico del remitente para la campaña",
"The subject line of the campaign": "La línea temática de la campaña",
"Select the mailing lists": "Seleccione las listas de correo",
"Public URL containing the HTML content for your campaign": "URL pública que contiene el contenido HTML de tu campaña",
"Select the topic": "Seleccione el tema",
"Select the campaign": "Seleccione la campaña",
"New name for the cloned campaign": "Nuevo nombre para la campaña clonada",
"New subject line for the cloned campaign": "Nueva línea de asunto para la campaña clonada",
"Sender name for the cloned campaign": "Nombre del remitente para la campaña clonada",
"Sender email address for the cloned campaign": "Dirección de correo electrónico del remitente para la campaña clonada",
"Reply-to email address for the cloned campaign": "Dirección de correo de respuesta para la campaña clonada",
"Email encoding type (e.g., UTF-8)": "Tipo de codificación de correo electrónico (por ejemplo, UTF-8)",
"Select the mailing list": "Seleccione la lista de correo",
"Information about the contact": "Información sobre el contacto",
"Contact source can be added.": "Fuente de contacto puede ser añadida.",
"Select the tag to associate with the contact": "Seleccione la etiqueta para asociar con el contacto",
"Email address of the contact to tag": "Dirección de correo electrónico del contacto para etiquetar",
"Email address of the contact to remove the tag from": "Dirección de correo electrónico del contacto del que eliminar la etiqueta",
"Contacts email addresses to be added to the mailing list (maximum 10 emails)": "Direcciones de correo electrónico de contactos a añadir a la lista de correo (máximo 10 correos electrónicos)",
"Email of the contact to be found (partial matches supported)": "Correo electrónico del contacto a encontrar (partidas parciales soportadas)",
"Filter contacts by status (optional)": "Filtrar contactos por estado (opcional)",
"Sort order for results (optional)": "Ordenar resultados (opcional)",
"Starting index for pagination (optional, default: 1)": "Índice de inicio para la paginación (opcional, predeterminado: 1)",
"Number of contacts to retrieve (optional, default: all)": "Número de contactos a recuperar (opcional, predeterminado: todos)",
"Name of the campaign to be found (partial matches supported)": "Nombre de la campaña que se encuentra (partidas parciales soportadas)",
"Filter campaigns by status (optional)": "Filtrar campañas por estado (opcional)",
"Number of campaigns to retrieve (optional, default: 5)": "Número de campañas a recuperar (opcional, predeterminado: 5)",
"Active": "Activo",
"Recent": "Recientes",
"Most Recent": "Más Recientes",
"Unsubscribed": "Desuscrito",
"Bounced": "Rebotado",
"Ascending": "Ascendiente",
"Descending": "Descendiente",
"All": "Todos",
"All Campaigns": "Toda la campaña",
"Drafts": "Borradores",
"Scheduled": "Programado",
"In Progress": "En curso",
"Sent": "Enviado",
"Stopped": "Detenido",
"Canceled": "Cancelado",
"To Be Reviewed": "A ser reseñado",
"Reviewed": "Revisado",
"Paused": "Pausado",
"In Testing": "En pruebas",
"New Contact": "Nuevo contacto",
"Unsubscribe": "Darse de baja",
"New Campaign": "Nueva Campaña",
"Fires when a new contact is added to a selected mailing list.": "Dispara cuando un nuevo contacto se agrega a una lista de correo seleccionada.",
"Fires when a contact is removed from a mailing list or unsubscribed.": "Se activa cuando un contacto es eliminado de una lista de correo o darse de baja.",
"Fires when a new campaign is created.": "Dispara cuando se crea una nueva campaña.",
"Unsubscribe Type": "Tipo de desuscripción",
"Filter contacts by status (default: active)": "Filtrar contactos por estado (por defecto: activo)",
"Sort order for contacts (default: descending)": "Orden de los contactos (por defecto: descender)",
"Type of contact removal to monitor (default: unsubscribed)": "Tipo de eliminación de contactos para monitorear (por defecto: darse de baja)"
}

View File

@@ -0,0 +1,110 @@
{
"Zoho Campaigns is an email marketing platform for managing mailing lists, sending campaigns, tracking engagement, and automating subscriber workflows.": "Zoho Campaigns est une plateforme de marketing par e-mail pour gérer les listes de diffusion, envoyer des campagnes, suivre l'engagement et automatiser les flux de travail des abonnés.",
"Data Center": "Centre de données",
"The data center location of your Zoho Campaigns account": "L'emplacement du centre de données de votre compte Zoho Campaigns",
"zoho.com (United States)": "zoho.com (États-Unis)",
"zoho.eu (Europe)": "zoho.eu (Europe)",
"zoho.in (India)": "zoho.in (Inde)",
"zoho.com.au (Australia)": "zoho.com.au (Australie)",
"zoho.jp (Japan)": "zoho.jp (Japon)",
"zoho.com.cn (China)": "zoho.com.cn (Chine)",
"Connect your Zoho Campaigns account using OAuth2": "Connectez votre compte Zoho Campaigns avec OAuth2",
"Create Campaign": "Créer une campagne",
"Clone Campaign": "Cloner la campagne",
"Send Campaign": "Envoyer la campagne",
"Add/Update Contact": "Ajouter/mettre à jour le contact",
"Add Tag to Contact": "Ajouter un tag au contact",
"Remove Tag": "Supprimer le tag",
"Unsubscribe Contact": "Se désabonner du contact",
"Add Contact to Mailing List": "Ajouter un contact à la liste de diffusion",
"Find Contact": "Trouver un contact",
"Find Campaign": "Trouver une campagne",
"Create a new campaign with campaign name, subject, topic, sender name/address, and mailing list.": "Créez une nouvelle campagne avec le nom de la campagne, le sujet, le sujet, le nom de l'expéditeur et la liste de diffusion.",
"Clone an existing campaign, optionally renaming.": "Cloner une campagne existante, éventuellement renommer.",
"Send a campaign that has been created or cloned.": "Envoyez une campagne qui a été créée ou clonée.",
"Add a new contact or update an existing one. Confirmation email sent based on mailing list settings.": "Ajouter un nouveau contact ou mettre à jour un contact existant. E-mail de confirmation envoyé en fonction des paramètres de la liste de diffusion.",
"Apply a tag to a contact by email. Creates the tag if it doesn't exist.": "Appliquer un tag à un contact par e-mail. Crée le tag s'il n'existe pas.",
"Remove a tag from a contact.": "Supprimer un tag d'un contact.",
"Remove a contact from a mailing list.": "Retirer un contact d'une liste de diffusion.",
"Add contacts to your mailing lists.": "Ajouter des contacts à vos listes de diffusion.",
"Look up an existing contact by email address.": "Rechercher un contact existant par adresse e-mail.",
"Locate an existing campaign by campaign name.": "Localisez une campagne existante par nom de campagne.",
"Campaign Name": "Nom de la campagne",
"From Email": "De l'E-mail",
"Subject": "Sujet",
"Mailing Lists": "Listes de diffusion",
"Content URL": "URL du contenu",
"Topic": "Sujet",
"Campaign": "Campagnes",
"From Name": "De nom",
"Reply-To Email": "E-mail répondre-à",
"Encoding Type": "Type d'encodage",
"Mailing List": "Liste de diffusion",
"Contact Information": "Coordonnées",
"Source": "Source",
"Tag": "Étiquette",
"Contact Email": "Courriel du contact",
"Emails": "E-mails",
"Contact Status": "Statut du contact",
"Sort Order": "Ordre de tri",
"From Index": "Depuis l'index",
"Range": "Range",
"Campaign Status": "Statut de la campagne",
"A name to your campaign": "Un nom pour votre campagne",
"Sender email address for the campaign": "Adresse e-mail de l'expéditeur pour la campagne",
"The subject line of the campaign": "La ligne de sujet de la campagne",
"Select the mailing lists": "Sélectionnez les listes de diffusion",
"Public URL containing the HTML content for your campaign": "URL publique contenant le contenu HTML de votre campagne",
"Select the topic": "Sélectionnez le sujet",
"Select the campaign": "Sélectionnez la campagne",
"New name for the cloned campaign": "Nouveau nom pour la campagne clonée",
"New subject line for the cloned campaign": "Nouvelle ligne de sujet pour la campagne clonée",
"Sender name for the cloned campaign": "Nom de l'expéditeur pour la campagne clonée",
"Sender email address for the cloned campaign": "Adresse e-mail de l'expéditeur pour la campagne clonée",
"Reply-to email address for the cloned campaign": "Adresse email de réponse pour la campagne clonée",
"Email encoding type (e.g., UTF-8)": "Type d'encodage du courriel (par exemple, UTF-8)",
"Select the mailing list": "Sélectionnez la liste de diffusion",
"Information about the contact": "Informations sur le contact",
"Contact source can be added.": "La source du contact peut être ajoutée.",
"Select the tag to associate with the contact": "Sélectionnez le tag à associer avec le contact",
"Email address of the contact to tag": "Adresse e-mail du contact à étiqueter",
"Email address of the contact to remove the tag from": "Adresse e-mail du contact pour supprimer le tag",
"Contacts email addresses to be added to the mailing list (maximum 10 emails)": "Adresses e-mail des contacts à ajouter à la liste de diffusion (maximum 10 emails)",
"Email of the contact to be found (partial matches supported)": "Courriel du contact à trouver (correspondances partielles prises en charge)",
"Filter contacts by status (optional)": "Filtrer les contacts par statut (optionnel)",
"Sort order for results (optional)": "Ordre de tri des résultats (facultatif)",
"Starting index for pagination (optional, default: 1)": "Démarrage de l'index pour la pagination (optionnel, par défaut: 1)",
"Number of contacts to retrieve (optional, default: all)": "Nombre de contacts à récupérer (optionnel, par défaut : tous)",
"Name of the campaign to be found (partial matches supported)": "Nom de la campagne à trouver (correspondances partielles supportées)",
"Filter campaigns by status (optional)": "Filtrer les campagnes par statut (optionnel)",
"Number of campaigns to retrieve (optional, default: 5)": "Nombre de campagnes à récupérer (optionnel, par défaut: 5)",
"Active": "Actif",
"Recent": "Récentes",
"Most Recent": "Les plus récents",
"Unsubscribed": "Désabonné",
"Bounced": "Rebondi",
"Ascending": "Ascendant",
"Descending": "Descendant",
"All": "Tous",
"All Campaigns": "Toutes les campagnes",
"Drafts": "Brouillons",
"Scheduled": "Planifié",
"In Progress": "En cours",
"Sent": "Envoyé",
"Stopped": "Arrêté",
"Canceled": "Annulé",
"To Be Reviewed": "À revoir",
"Reviewed": "Révisé",
"Paused": "En pause",
"In Testing": "En test",
"New Contact": "Nouveau contact",
"Unsubscribe": "Se désabonner",
"New Campaign": "Nouvelle Campagne",
"Fires when a new contact is added to a selected mailing list.": "Se déclenche lorsqu'un nouveau contact est ajouté à une liste de diffusion sélectionnée.",
"Fires when a contact is removed from a mailing list or unsubscribed.": "Déclenche lorsqu'un contact est retiré d'une liste de diffusion ou se désabonner.",
"Fires when a new campaign is created.": "Tire quand une nouvelle campagne est créée.",
"Unsubscribe Type": "Type de désinscription",
"Filter contacts by status (default: active)": "Filtrer les contacts par statut (par défaut : actif)",
"Sort order for contacts (default: descending)": "Ordre de tri des contacts (par défaut: décroissant)",
"Type of contact removal to monitor (default: unsubscribed)": "Type de suppression de contact à surveiller (par défaut : désabonné)"
}

View File

@@ -0,0 +1,110 @@
{
"Zoho Campaigns is an email marketing platform for managing mailing lists, sending campaigns, tracking engagement, and automating subscriber workflows.": "Zoho Campaignsは、メーリングリストの管理、キャンペーンの送信、エンゲージメントの追跡、加入者ワークフローの自動化のためのメールマーケティングプラットフォームです。",
"Data Center": "データセンター",
"The data center location of your Zoho Campaigns account": "Zohoキャンペーンアカウントのデータセンターの場所",
"zoho.com (United States)": "zoho.com (アメリカ合衆国)",
"zoho.eu (Europe)": "zoho.eu (ヨーロッパ)",
"zoho.in (India)": "zoho.in (インド)",
"zoho.com.au (Australia)": "zoho.com.au (オーストラリア)",
"zoho.jp (Japan)": "zoho.jp (日本)",
"zoho.com.cn (China)": "zoho.com.cn (中国)",
"Connect your Zoho Campaigns account using OAuth2": "OAuth2を使用してZohoキャンペーンアカウントに接続",
"Create Campaign": "キャンペーンを作成",
"Clone Campaign": "キャンペーンを複製",
"Send Campaign": "キャンペーンを送信",
"Add/Update Contact": "連絡先の追加/更新",
"Add Tag to Contact": "連絡先にタグを追加",
"Remove Tag": "タグを削除",
"Unsubscribe Contact": "連絡先を購読解除",
"Add Contact to Mailing List": "メーリングリストに連絡先を追加",
"Find Contact": "連絡先を探す",
"Find Campaign": "キャンペーンを検索",
"Create a new campaign with campaign name, subject, topic, sender name/address, and mailing list.": "キャンペーン名、件名、トピック、送信者名/住所、メーリングリストで新しいキャンペーンを作成します。",
"Clone an existing campaign, optionally renaming.": "既存のキャンペーンをクローンし、必要に応じて名前を変更します。",
"Send a campaign that has been created or cloned.": "作成またはクローンされたキャンペーンを送信します。",
"Add a new contact or update an existing one. Confirmation email sent based on mailing list settings.": "新しい連絡先を追加するか、既存の連絡先を更新します。メーリングリスト設定に基づいて送信された確認メール。",
"Apply a tag to a contact by email. Creates the tag if it doesn't exist.": "メールで連絡先にタグを適用します。存在しない場合はタグを作成します。",
"Remove a tag from a contact.": "コンタクトからタグを削除します。",
"Remove a contact from a mailing list.": "メーリングリストから連絡先を削除します。",
"Add contacts to your mailing lists.": "メーリングリストに連絡先を追加します。",
"Look up an existing contact by email address.": "既存の連絡先をメールアドレスで検索します。",
"Locate an existing campaign by campaign name.": "キャンペーン名で既存のキャンペーンを探します。",
"Campaign Name": "キャンペーン名",
"From Email": "差出人メールアドレス",
"Subject": "件名",
"Mailing Lists": "メーリング リスト",
"Content URL": "コンテンツ URL",
"Topic": "トピック",
"Campaign": "キャンペーン",
"From Name": "差出人名",
"Reply-To Email": "返信先メールアドレス",
"Encoding Type": "エンコードタイプ",
"Mailing List": "メーリングリスト:",
"Contact Information": "連絡先情報",
"Source": "ソース",
"Tag": "タグ",
"Contact Email": "連絡先メールアドレス",
"Emails": "E-mail",
"Contact Status": "連絡先のステータス",
"Sort Order": "並び順",
"From Index": "索引から",
"Range": "Range",
"Campaign Status": "キャンペーンステータス",
"A name to your campaign": "キャンペーンの名前",
"Sender email address for the campaign": "キャンペーンの送信者メールアドレス",
"The subject line of the campaign": "キャンペーンの件名",
"Select the mailing lists": "メーリングリストを選択",
"Public URL containing the HTML content for your campaign": "キャンペーンのHTMLコンテンツを含む公開 URL",
"Select the topic": "トピックを選択",
"Select the campaign": "キャンペーンを選択",
"New name for the cloned campaign": "複製されたキャンペーンの新しい名前",
"New subject line for the cloned campaign": "複製されたキャンペーンの新しい件名行",
"Sender name for the cloned campaign": "クローンキャンペーンの送信者名",
"Sender email address for the cloned campaign": "クローンキャンペーンの送信者メールアドレス",
"Reply-to email address for the cloned campaign": "複製されたキャンペーンの返信先メールアドレス",
"Email encoding type (e.g., UTF-8)": "メールエンコーディングの種類UTF-8",
"Select the mailing list": "メーリングリストを選択してください",
"Information about the contact": "連絡先に関する情報",
"Contact source can be added.": "連絡先のソースを追加できます。",
"Select the tag to associate with the contact": "連絡先に関連付けるタグを選択してください",
"Email address of the contact to tag": "タグ付けする連絡先のメールアドレス",
"Email address of the contact to remove the tag from": "タグを削除する連絡先のメールアドレス",
"Contacts email addresses to be added to the mailing list (maximum 10 emails)": "メーリングリストに追加される連絡先メールアドレス最大10通",
"Email of the contact to be found (partial matches supported)": "見つける連絡先のメール(一部一致対応)",
"Filter contacts by status (optional)": "ステータスで連絡先をフィルター (オプション)",
"Sort order for results (optional)": "結果の並べ替え順 (オプション)",
"Starting index for pagination (optional, default: 1)": "ページネーションのインデックスを開始しています (オプション、デフォルト: 1)",
"Number of contacts to retrieve (optional, default: all)": "取得する連絡先の数 (オプション、デフォルト: すべて)",
"Name of the campaign to be found (partial matches supported)": "見つけるキャンペーンの名前 (一部一致がサポートされています)",
"Filter campaigns by status (optional)": "ステータスでキャンペーンをフィルター (オプション)",
"Number of campaigns to retrieve (optional, default: 5)": "取得するキャンペーン数オプション、デフォルト5",
"Active": "有効",
"Recent": "最近のもの",
"Most Recent": "最新順",
"Unsubscribed": "購読解除済み",
"Bounced": "バウンスしました",
"Ascending": "昇順",
"Descending": "降順",
"All": "すべて",
"All Campaigns": "すべてのキャンペーン",
"Drafts": "Drafts",
"Scheduled": "スケジュール済み",
"In Progress": "進行中",
"Sent": "送信済み",
"Stopped": "停止しました",
"Canceled": "キャンセルしました",
"To Be Reviewed": "確認する",
"Reviewed": "レビュー済み",
"Paused": "一時停止中",
"In Testing": "テスト中",
"New Contact": "新しい連絡先",
"Unsubscribe": "購読解除",
"New Campaign": "新規キャンペーン",
"Fires when a new contact is added to a selected mailing list.": "選択したメーリングリストに新しい連絡先が追加されたときに発生します。",
"Fires when a contact is removed from a mailing list or unsubscribed.": "連絡先がメーリングリストから削除されるか、登録解除されたときに発生します。",
"Fires when a new campaign is created.": "新しいキャンペーンが作成されたときに発生します。",
"Unsubscribe Type": "購読解除タイプ",
"Filter contacts by status (default: active)": "ステータスで連絡先を絞り込みます (デフォルト: アクティブ)",
"Sort order for contacts (default: descending)": "連絡先の並び順(デフォルト:降順)",
"Type of contact removal to monitor (default: unsubscribed)": "監視するコンタクト削除の種類(デフォルト:購読解除)"
}

View File

@@ -0,0 +1,110 @@
{
"Zoho Campaigns is an email marketing platform for managing mailing lists, sending campaigns, tracking engagement, and automating subscriber workflows.": "Zoho Campagnes is een marketingplatform voor het beheren van mailinglijsten, het verzenden van campagnes, het bijhouden van betrokkenheid en het automatiseren van workflows van abonnees.",
"Data Center": "Struik centrum",
"The data center location of your Zoho Campaigns account": "De locatie van datacenter van je Zoho Campagnes account",
"zoho.com (United States)": "zoho.com (Verenigde Staten)",
"zoho.eu (Europe)": "zoho.eu (Europa)",
"zoho.in (India)": "zoho.in (India)",
"zoho.com.au (Australia)": "zoho.com.au (Australia)",
"zoho.jp (Japan)": "zoho.jp (Japan)",
"zoho.com.cn (China)": "zoho.com.cn (China)",
"Connect your Zoho Campaigns account using OAuth2": "Verbind uw Zoho Campagnes account met OAuth2",
"Create Campaign": "Nieuwe campagne",
"Clone Campaign": "Campagne klonen",
"Send Campaign": "Verzend campagne",
"Add/Update Contact": "Contactpersoon toevoegen/bijwerken",
"Add Tag to Contact": "Tag aan contactpersoon toevoegen",
"Remove Tag": "Tag verwijderen",
"Unsubscribe Contact": "Ontvangers uitschrijven",
"Add Contact to Mailing List": "Contact toevoegen aan mailinglijst",
"Find Contact": "Contactpersoon zoeken",
"Find Campaign": "Vind campagne",
"Create a new campaign with campaign name, subject, topic, sender name/address, and mailing list.": "Maak een nieuwe campagne met campagnenaam, onderwerp, onderwerp, afzendernaam/adres en mailinglijst.",
"Clone an existing campaign, optionally renaming.": "Kopieer een bestaande campagne, eventueel hernoemd.",
"Send a campaign that has been created or cloned.": "Verstuur een campagne die is gemaakt of gekloond.",
"Add a new contact or update an existing one. Confirmation email sent based on mailing list settings.": "Voeg een nieuw contact toe of werk een bestaande bij. Bevestiging e-mail verzonden op basis van de mailinglijstinstellingen.",
"Apply a tag to a contact by email. Creates the tag if it doesn't exist.": "Een tag toepassen op een contactpersoon per e-mail. Maakt de tag aan als deze niet bestaat.",
"Remove a tag from a contact.": "Verwijder een tag van een contactpersoon.",
"Remove a contact from a mailing list.": "Een contactpersoon uit een mailinglijst verwijderen.",
"Add contacts to your mailing lists.": "Contacten aan je mailinglijsten toevoegen.",
"Look up an existing contact by email address.": "Opzoeken van een bestaand contact per e-mailadres.",
"Locate an existing campaign by campaign name.": "Zoek een bestaande campagne op campagnenaam.",
"Campaign Name": "Campagne Naam",
"From Email": "Van e-mail",
"Subject": "Onderwerp",
"Mailing Lists": "Mailing lijsten",
"Content URL": "Content URL",
"Topic": "Onderwerp",
"Campaign": "Campagne",
"From Name": "Afzender naam",
"Reply-To Email": "Antwoord-Aan E-mail",
"Encoding Type": "Type codering",
"Mailing List": "Mailing lijst",
"Contact Information": "Contact informatie",
"Source": "Bron",
"Tag": "Tagnaam",
"Contact Email": "Contact e-mail adres",
"Emails": "E-mails",
"Contact Status": "Contact status",
"Sort Order": "Sorteren bestelling",
"From Index": "Van Index",
"Range": "Range",
"Campaign Status": "Campagne Status",
"A name to your campaign": "Een naam voor uw campagne",
"Sender email address for the campaign": "E-mailadres afzender voor de campagne",
"The subject line of the campaign": "Het onderwerp van de campagne",
"Select the mailing lists": "Selecteer de mailing lijsten",
"Public URL containing the HTML content for your campaign": "Openbare URL met de HTML-inhoud voor uw campagne",
"Select the topic": "Selecteer het onderwerp",
"Select the campaign": "Selecteer de campagne",
"New name for the cloned campaign": "Nieuwe naam voor de gekloonde campagne",
"New subject line for the cloned campaign": "Nieuw onderwerp voor de gekloonde campagne",
"Sender name for the cloned campaign": "Afzendernaam voor de gekloonde campagne",
"Sender email address for the cloned campaign": "Afzender e-mailadres voor de gekloonde campagne",
"Reply-to email address for the cloned campaign": "Reply-to emailadres voor de gekloonde campagne",
"Email encoding type (e.g., UTF-8)": "Type e-mailcodering (bijv. UTF-8)",
"Select the mailing list": "Selecteer de mailinglijst",
"Information about the contact": "Informatie over de contactpersoon",
"Contact source can be added.": "Bron contactpersoon kan worden toegevoegd.",
"Select the tag to associate with the contact": "Selecteer de tag om te koppelen aan de contactpersoon",
"Email address of the contact to tag": "E-mailadres van de contactpersoon om te taggen",
"Email address of the contact to remove the tag from": "E-mailadres van de contactpersoon om de tag van te verwijderen",
"Contacts email addresses to be added to the mailing list (maximum 10 emails)": "Contacten e-mail adressen die moeten worden toegevoegd aan de mailinglijst (maximaal 10 e-mails)",
"Email of the contact to be found (partial matches supported)": "Email van de contactpersoon te vinden (gedeeltelijke matches ondersteund)",
"Filter contacts by status (optional)": "Contactpersonen filteren op status (optioneel)",
"Sort order for results (optional)": "Sorteer volgorde voor resultaten (optioneel)",
"Starting index for pagination (optional, default: 1)": "Begin index voor paginering (optioneel, standaard: 1)",
"Number of contacts to retrieve (optional, default: all)": "Aantal op te halen contacten (optioneel, standaard: alle)",
"Name of the campaign to be found (partial matches supported)": "Naam van de te vinden campagne (gedeeltelijke matches ondersteund)",
"Filter campaigns by status (optional)": "Campagnes filteren op status (optioneel)",
"Number of campaigns to retrieve (optional, default: 5)": "Aantal op te halen campagnes (optioneel, standaard: 5)",
"Active": "Actief",
"Recent": "Recentelijk",
"Most Recent": "Meest recente",
"Unsubscribed": "Uitgeschreven",
"Bounced": "Bounced",
"Ascending": "Oplopend",
"Descending": "Aflopend",
"All": "Allemaal",
"All Campaigns": "Alle campagnes",
"Drafts": "Concepten",
"Scheduled": "Gepland",
"In Progress": "In uitvoering",
"Sent": "Verzonden",
"Stopped": "Gestopt",
"Canceled": "Geannuleerd",
"To Be Reviewed": "Wordt gereviewd",
"Reviewed": "Gereviewd",
"Paused": "Gepauzeerd",
"In Testing": "In het testen",
"New Contact": "Nieuw contactpersoon",
"Unsubscribe": "Afmelden",
"New Campaign": "Nieuwe campagne",
"Fires when a new contact is added to a selected mailing list.": "Vuurt wanneer een nieuwe contactpersoon is toegevoegd aan een geselecteerde mailinglijst.",
"Fires when a contact is removed from a mailing list or unsubscribed.": "Vuurt wanneer een contactpersoon wordt verwijderd uit een mailinglijst of uitgeschreven.",
"Fires when a new campaign is created.": "Vuurt wanneer een nieuwe campagne wordt gemaakt.",
"Unsubscribe Type": "Type afmelding",
"Filter contacts by status (default: active)": "Contactpersonen filteren op status (standaard: actief)",
"Sort order for contacts (default: descending)": "Sorteer volgorde voor contactpersonen (standaard: aflopend)",
"Type of contact removal to monitor (default: unsubscribed)": "Type contact verwijdering om te monitoren (standaard: uitschrijven)"
}

View File

@@ -0,0 +1,110 @@
{
"Zoho Campaigns is an email marketing platform for managing mailing lists, sending campaigns, tracking engagement, and automating subscriber workflows.": "Zoho Campanhas é uma plataforma de marketing de e-mail para gerenciar listas de e-mails, enviar campanhas, engajamento de rastreamento e automatizar fluxos de trabalho de assinantes.",
"Data Center": "Centro de Dados",
"The data center location of your Zoho Campaigns account": "O local do centro de dados de suas Campanhas Zoho conta",
"zoho.com (United States)": "zoho.com (Estados Unidos)",
"zoho.eu (Europe)": "zoho.eu (Europa)",
"zoho.in (India)": "zoho.in (Índia)",
"zoho.com.au (Australia)": "zoho.com.au (Austrália)",
"zoho.jp (Japan)": "zoho.jp (Japão)",
"zoho.com.cn (China)": "zoho.com.cn (China)",
"Connect your Zoho Campaigns account using OAuth2": "Conectar sua conta Zoho Campanhas usando OAuth2",
"Create Campaign": "Criar Campanha",
"Clone Campaign": "Clonar Campanha",
"Send Campaign": "Enviar Campanha",
"Add/Update Contact": "Adicionar/Atualizar Contato",
"Add Tag to Contact": "Adicionar Tag ao Contato",
"Remove Tag": "Remover Marca",
"Unsubscribe Contact": "Cancelar contato",
"Add Contact to Mailing List": "Adicionar Contato à Lista de Correio",
"Find Contact": "Localizar contato",
"Find Campaign": "Encontrar Campanha",
"Create a new campaign with campaign name, subject, topic, sender name/address, and mailing list.": "Criar uma nova campanha com o nome da campanha, assunto, tópico, nome do remetente / endereço e lista de envio.",
"Clone an existing campaign, optionally renaming.": "Clonar uma campanha existente, opcionalmente renomeada.",
"Send a campaign that has been created or cloned.": "Envie uma campanha que foi criada ou clonada.",
"Add a new contact or update an existing one. Confirmation email sent based on mailing list settings.": "Adicione um novo contato ou atualize um existente. E-mail de confirmação enviado com base nas configurações da lista de envio.",
"Apply a tag to a contact by email. Creates the tag if it doesn't exist.": "Aplicar uma etiqueta a um contato por e-mail. Cria a etiqueta se não existir.",
"Remove a tag from a contact.": "Remove uma tag de um contato.",
"Remove a contact from a mailing list.": "Remover um contato de uma lista de envio.",
"Add contacts to your mailing lists.": "Adicionar contatos à sua lista de envio.",
"Look up an existing contact by email address.": "Procure um contato existente por endereço de e-mail.",
"Locate an existing campaign by campaign name.": "Localize uma campanha existente pelo nome da campanha.",
"Campaign Name": "Nome Da Campanha",
"From Email": "E-mail do Remetente",
"Subject": "Cargo",
"Mailing Lists": "Listas de distribuição",
"Content URL": "URL do conteúdo",
"Topic": "Tópico",
"Campaign": "Campanha",
"From Name": "Nome do Remetente",
"Reply-To Email": "E-mail para resposta",
"Encoding Type": "Tipo de codificação",
"Mailing List": "Lista de Correio",
"Contact Information": "Informação do Contato",
"Source": "fonte",
"Tag": "Etiqueta",
"Contact Email": "E-mail de contato",
"Emails": "e-mails",
"Contact Status": "Estado do contato",
"Sort Order": "Ordem de classificação",
"From Index": "Do índice",
"Range": "Range",
"Campaign Status": "Status da Campanha",
"A name to your campaign": "Um nome para sua campanha",
"Sender email address for the campaign": "E-mail do remetente da campanha",
"The subject line of the campaign": "O assunto da campanha",
"Select the mailing lists": "Selecione as listas de discussão",
"Public URL containing the HTML content for your campaign": "URL pública contendo o conteúdo HTML para sua campanha",
"Select the topic": "Selecione o tema",
"Select the campaign": "Selecione a campanha",
"New name for the cloned campaign": "Novo nome para a campanha clonada",
"New subject line for the cloned campaign": "Nova linha de assunto para a campanha clonada",
"Sender name for the cloned campaign": "Nome do remetente da campanha clonada",
"Sender email address for the cloned campaign": "E-mail do remetente da campanha clonada",
"Reply-to email address for the cloned campaign": "Responder-para endereço de e-mail da campanha clonada",
"Email encoding type (e.g., UTF-8)": "Tipo de codificação do e-mail (por exemplo, UTF-8)",
"Select the mailing list": "Selecione a lista de e-mails",
"Information about the contact": "Informações sobre o contato",
"Contact source can be added.": "A fonte de contatos pode ser adicionada.",
"Select the tag to associate with the contact": "Selecione a tag para associar com o contato",
"Email address of the contact to tag": "Endereço de email do contato a etiqueta",
"Email address of the contact to remove the tag from": "Endereço de email do contato para remover a tag da",
"Contacts email addresses to be added to the mailing list (maximum 10 emails)": "Contatos endereços de e-mail a serem adicionados à lista de discussão (máximo de 10 e-mails)",
"Email of the contact to be found (partial matches supported)": "E-mail do contato a ser encontrado (correspondências parciais suportadas)",
"Filter contacts by status (optional)": "Filtrar contatos por estado (opcional)",
"Sort order for results (optional)": "Ordem de classificação para resultados (opcional)",
"Starting index for pagination (optional, default: 1)": "Iniciando índice para paginação (opcional, padrão: 1)",
"Number of contacts to retrieve (optional, default: all)": "Número de contatos para recuperar (opcional, padrão: todos)",
"Name of the campaign to be found (partial matches supported)": "Nome da campanha a ser encontrada (partidas parciais suportadas)",
"Filter campaigns by status (optional)": "Filtrar campanhas por status (opcional)",
"Number of campaigns to retrieve (optional, default: 5)": "Número de campanhas a serem recuperadas (opcional, padrão: 5)",
"Active": "Ativo",
"Recent": "Recente",
"Most Recent": "Mais recentes",
"Unsubscribed": "Cancelada",
"Bounced": "Devolvido",
"Ascending": "Crescente",
"Descending": "Decrescente",
"All": "TODOS",
"All Campaigns": "Todas as campanhas",
"Drafts": "Rascunhos",
"Scheduled": "Agendado",
"In Progress": "Em Execução",
"Sent": "Enviado",
"Stopped": "Parado",
"Canceled": "Cancelado",
"To Be Reviewed": "Para ser revisado",
"Reviewed": "Revisto",
"Paused": "Pausado",
"In Testing": "Em Teste",
"New Contact": "Novo Contato",
"Unsubscribe": "Desinscrever",
"New Campaign": "Nova Campanha",
"Fires when a new contact is added to a selected mailing list.": "Efetua quando um novo contato é adicionado à lista de discussão selecionada.",
"Fires when a contact is removed from a mailing list or unsubscribed.": "Ativa quando um contato é removido de uma lista de e-mails ou cancelado.",
"Fires when a new campaign is created.": "Atira quando uma nova campanha é criada.",
"Unsubscribe Type": "Tipo de descadastro",
"Filter contacts by status (default: active)": "Filtrar contatos por estado (padrão: ativo)",
"Sort order for contacts (default: descending)": "Ordenar ordem dos contatos (padrão: decrescente)",
"Type of contact removal to monitor (default: unsubscribed)": "Tipo de remoção de contato para monitorar (padrão: cancelado)"
}

View File

@@ -0,0 +1,126 @@
{
"Zoho Campaigns is an email marketing platform for managing mailing lists, sending campaigns, tracking engagement, and automating subscriber workflows.": "Zoho Campaigns is an email marketing platform for managing mailing lists, sending campaigns, tracking engagement, and automating subscriber workflows.",
"Data Center": "Data Center",
"The data center location of your Zoho Campaigns account": "The data center location of your Zoho Campaigns account",
"zoho.com (United States)": "zoho.com (United States)",
"zoho.eu (Europe)": "zoho.eu (Europe)",
"zoho.in (India)": "zoho.in (India)",
"zoho.com.au (Australia)": "zoho.com.au (Australia)",
"zoho.jp (Japan)": "zoho.jp (Japan)",
"zoho.com.cn (China)": "zoho.com.cn (China)",
"Connect your Zoho Campaigns account using OAuth2": "Connect your Zoho Campaigns account using OAuth2",
"Create Campaign": "Create Campaign",
"Clone Campaign": "Clone Campaign",
"Send Campaign": "Send Campaign",
"Add/Update Contact": "Add/Update Contact",
"Add Tag to Contact": "Add Tag to Contact",
"Remove Tag": "Remove Tag",
"Unsubscribe Contact": "Unsubscribe Contact",
"Add Contact to Mailing List": "Add Contact to Mailing List",
"Find Contact": "Find Contact",
"Find Campaign": "Find Campaign",
"Custom API Call": "Custom API Call",
"Create a new campaign with campaign name, subject, topic, sender name/address, and mailing list.": "Create a new campaign with campaign name, subject, topic, sender name/address, and mailing list.",
"Clone an existing campaign, optionally renaming.": "Clone an existing campaign, optionally renaming.",
"Send a campaign that has been created or cloned.": "Send a campaign that has been created or cloned.",
"Add a new contact or update an existing one. Confirmation email sent based on mailing list settings.": "Add a new contact or update an existing one. Confirmation email sent based on mailing list settings.",
"Apply a tag to a contact by email. Creates the tag if it doesn't exist.": "Apply a tag to a contact by email. Creates the tag if it doesn't exist.",
"Remove a tag from a contact.": "Remove a tag from a contact.",
"Remove a contact from a mailing list.": "Remove a contact from a mailing list.",
"Add contacts to your mailing lists.": "Add contacts to your mailing lists.",
"Look up an existing contact by email address.": "Look up an existing contact by email address.",
"Locate an existing campaign by campaign name.": "Locate an existing campaign by campaign name.",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Campaign Name": "Campaign Name",
"From Email": "From Email",
"Subject": "Subject",
"Mailing Lists": "Mailing Lists",
"Content URL": "Content URL",
"Topic": "Topic",
"Campaign": "Campaign",
"From Name": "From Name",
"Reply-To Email": "Reply-To Email",
"Encoding Type": "Encoding Type",
"Mailing List": "Mailing List",
"Contact Information": "Contact Information",
"Source": "Source",
"Tag": "Tag",
"Contact Email": "Contact Email",
"Emails": "Emails",
"Contact Status": "Contact Status",
"Sort Order": "Sort Order",
"From Index": "From Index",
"Range": "Range",
"Campaign Status": "Campaign Status",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"A name to your campaign": "A name to your campaign",
"Sender email address for the campaign": "Sender email address for the campaign",
"The subject line of the campaign": "The subject line of the campaign",
"Select the mailing lists": "Select the mailing lists",
"Public URL containing the HTML content for your campaign": "Public URL containing the HTML content for your campaign",
"Select the topic": "Select the topic",
"Select the campaign": "Select the campaign",
"New name for the cloned campaign": "New name for the cloned campaign",
"New subject line for the cloned campaign": "New subject line for the cloned campaign",
"Sender name for the cloned campaign": "Sender name for the cloned campaign",
"Sender email address for the cloned campaign": "Sender email address for the cloned campaign",
"Reply-to email address for the cloned campaign": "Reply-to email address for the cloned campaign",
"Email encoding type (e.g., UTF-8)": "Email encoding type (e.g., UTF-8)",
"Select the mailing list": "Select the mailing list",
"Information about the contact": "Information about the contact",
"Contact source can be added.": "Contact source can be added.",
"Select the tag to associate with the contact": "Select the tag to associate with the contact",
"Email address of the contact to tag": "Email address of the contact to tag",
"Email address of the contact to remove the tag from": "Email address of the contact to remove the tag from",
"Contacts email addresses to be added to the mailing list (maximum 10 emails)": "Contacts email addresses to be added to the mailing list (maximum 10 emails)",
"Email of the contact to be found (partial matches supported)": "Email of the contact to be found (partial matches supported)",
"Filter contacts by status": "Filter contacts by status",
"Sort order for results": "Sort order for results",
"Starting index for pagination (optional, default: 1)": "Starting index for pagination (optional, default: 1)",
"Number of contacts to retrieve (optional, default: all)": "Number of contacts to retrieve (optional, default: all)",
"Name of the campaign to be found (partial matches supported)": "Name of the campaign to be found (partial matches supported)",
"Filter campaigns by status (optional)": "Filter campaigns by status (optional)",
"Sort order for results (optional)": "Sort order for results (optional)",
"Number of campaigns to retrieve (optional, default: 5)": "Number of campaigns to retrieve (optional, default: 5)",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"Active": "Active",
"Recent": "Recent",
"Most Recent": "Most Recent",
"Unsubscribed": "Unsubscribed",
"Bounced": "Bounced",
"Ascending": "Ascending",
"Descending": "Descending",
"All": "All",
"All Campaigns": "All Campaigns",
"Drafts": "Drafts",
"Scheduled": "Scheduled",
"In Progress": "In Progress",
"Sent": "Sent",
"Stopped": "Stopped",
"Canceled": "Canceled",
"To Be Reviewed": "To Be Reviewed",
"Reviewed": "Reviewed",
"Paused": "Paused",
"In Testing": "In Testing",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Contact": "New Contact",
"Unsubscribe": "Unsubscribe",
"New Campaign": "New Campaign",
"Fires when a new contact is added to a selected mailing list.": "Fires when a new contact is added to a selected mailing list.",
"Fires when a contact is removed from a mailing list or unsubscribed.": "Fires when a contact is removed from a mailing list or unsubscribed.",
"Fires when a new campaign is created.": "Fires when a new campaign is created.",
"Unsubscribe Type": "Unsubscribe Type",
"Type of contact removal to monitor (default: unsubscribed)": "Type of contact removal to monitor (default: unsubscribed)"
}

View File

@@ -0,0 +1,110 @@
{
"Zoho Campaigns is an email marketing platform for managing mailing lists, sending campaigns, tracking engagement, and automating subscriber workflows.": "Zoho Campaigns is an email marketing platform for managing mailing lists, sending campaigns, tracking engagement, and automating subscriber workflows.",
"Data Center": "Data Center",
"The data center location of your Zoho Campaigns account": "The data center location of your Zoho Campaigns account",
"zoho.com (United States)": "zoho.com (United States)",
"zoho.eu (Europe)": "zoho.eu (Europe)",
"zoho.in (India)": "zoho.in (India)",
"zoho.com.au (Australia)": "zoho.com.au (Australia)",
"zoho.jp (Japan)": "zoho.jp (Japan)",
"zoho.com.cn (China)": "zoho.com.cn (China)",
"Connect your Zoho Campaigns account using OAuth2": "Connect your Zoho Campaigns account using OAuth2",
"Create Campaign": "Create Campaign",
"Clone Campaign": "Clone Campaign",
"Send Campaign": "Send Campaign",
"Add/Update Contact": "Add/Update Contact",
"Add Tag to Contact": "Add Tag to Contact",
"Remove Tag": "Remove Tag",
"Unsubscribe Contact": "Unsubscribe Contact",
"Add Contact to Mailing List": "Add Contact to Mailing List",
"Find Contact": "Find Contact",
"Find Campaign": "Find Campaign",
"Create a new campaign with campaign name, subject, topic, sender name/address, and mailing list.": "Create a new campaign with campaign name, subject, topic, sender name/address, and mailing list.",
"Clone an existing campaign, optionally renaming.": "Clone an existing campaign, optionally renaming.",
"Send a campaign that has been created or cloned.": "Send a campaign that has been created or cloned.",
"Add a new contact or update an existing one. Confirmation email sent based on mailing list settings.": "Add a new contact or update an existing one. Confirmation email sent based on mailing list settings.",
"Apply a tag to a contact by email. Creates the tag if it doesn't exist.": "Apply a tag to a contact by email. Creates the tag if it doesn't exist.",
"Remove a tag from a contact.": "Remove a tag from a contact.",
"Remove a contact from a mailing list.": "Remove a contact from a mailing list.",
"Add contacts to your mailing lists.": "Add contacts to your mailing lists.",
"Look up an existing contact by email address.": "Look up an existing contact by email address.",
"Locate an existing campaign by campaign name.": "Locate an existing campaign by campaign name.",
"Campaign Name": "Campaign Name",
"From Email": "From Email",
"Subject": "Subject",
"Mailing Lists": "Mailing Lists",
"Content URL": "Content URL",
"Topic": "Topic",
"Campaign": "Campaign",
"From Name": "From Name",
"Reply-To Email": "Reply-To Email",
"Encoding Type": "Encoding Type",
"Mailing List": "Mailing List",
"Contact Information": "Contact Information",
"Source": "来源",
"Tag": "标签",
"Contact Email": "Contact Email",
"Emails": "电子邮件",
"Contact Status": "Contact Status",
"Sort Order": "Sort Order",
"From Index": "From Index",
"Range": "Range",
"Campaign Status": "Campaign Status",
"A name to your campaign": "A name to your campaign",
"Sender email address for the campaign": "Sender email address for the campaign",
"The subject line of the campaign": "The subject line of the campaign",
"Select the mailing lists": "Select the mailing lists",
"Public URL containing the HTML content for your campaign": "Public URL containing the HTML content for your campaign",
"Select the topic": "Select the topic",
"Select the campaign": "Select the campaign",
"New name for the cloned campaign": "New name for the cloned campaign",
"New subject line for the cloned campaign": "New subject line for the cloned campaign",
"Sender name for the cloned campaign": "Sender name for the cloned campaign",
"Sender email address for the cloned campaign": "Sender email address for the cloned campaign",
"Reply-to email address for the cloned campaign": "Reply-to email address for the cloned campaign",
"Email encoding type (e.g., UTF-8)": "Email encoding type (e.g., UTF-8)",
"Select the mailing list": "Select the mailing list",
"Information about the contact": "Information about the contact",
"Contact source can be added.": "Contact source can be added.",
"Select the tag to associate with the contact": "Select the tag to associate with the contact",
"Email address of the contact to tag": "Email address of the contact to tag",
"Email address of the contact to remove the tag from": "Email address of the contact to remove the tag from",
"Contacts email addresses to be added to the mailing list (maximum 10 emails)": "Contacts email addresses to be added to the mailing list (maximum 10 emails)",
"Email of the contact to be found (partial matches supported)": "Email of the contact to be found (partial matches supported)",
"Filter contacts by status (optional)": "Filter contacts by status (optional)",
"Sort order for results (optional)": "Sort order for results (optional)",
"Starting index for pagination (optional, default: 1)": "Starting index for pagination (optional, default: 1)",
"Number of contacts to retrieve (optional, default: all)": "Number of contacts to retrieve (optional, default: all)",
"Name of the campaign to be found (partial matches supported)": "Name of the campaign to be found (partial matches supported)",
"Filter campaigns by status (optional)": "Filter campaigns by status (optional)",
"Number of campaigns to retrieve (optional, default: 5)": "Number of campaigns to retrieve (optional, default: 5)",
"Active": "使用中",
"Recent": "Recent",
"Most Recent": "Most Recent",
"Unsubscribed": "Unsubscribed",
"Bounced": "Bounced",
"Ascending": "升序",
"Descending": "降序",
"All": "所有的",
"All Campaigns": "All Campaigns",
"Drafts": "Drafts",
"Scheduled": "Scheduled",
"In Progress": "In Progress",
"Sent": "Sent",
"Stopped": "Stopped",
"Canceled": "Canceled",
"To Be Reviewed": "To Be Reviewed",
"Reviewed": "Reviewed",
"Paused": "已暂停",
"In Testing": "In Testing",
"New Contact": "New Contact",
"Unsubscribe": "Unsubscribe",
"New Campaign": "New Campaign",
"Fires when a new contact is added to a selected mailing list.": "Fires when a new contact is added to a selected mailing list.",
"Fires when a contact is removed from a mailing list or unsubscribed.": "Fires when a contact is removed from a mailing list or unsubscribed.",
"Fires when a new campaign is created.": "Fires when a new campaign is created.",
"Unsubscribe Type": "Unsubscribe Type",
"Filter contacts by status (default: active)": "Filter contacts by status (default: active)",
"Sort order for contacts (default: descending)": "Sort order for contacts (default: descending)",
"Type of contact removal to monitor (default: unsubscribed)": "Type of contact removal to monitor (default: unsubscribed)"
}

View File

@@ -0,0 +1,58 @@
import { createPiece, OAuth2PropertyValue } from '@activepieces/pieces-framework';
import { addContactToMailingList } from './lib/actions/add-contact-to-mailing-list';
import { addTagToContact } from './lib/actions/add-tag-to-contact';
import { addUpdateContact } from './lib/actions/add-update-contact';
import { cloneCampaign } from './lib/actions/clone-campaign';
import { createCampaign } from './lib/actions/create-campaign';
import { findCampaign } from './lib/actions/find-campaign';
import { findContact } from './lib/actions/find-contact';
import { removeTag } from './lib/actions/remove-tag';
import { sendCampaign } from './lib/actions/send-campaign';
import { unsubscribeContact } from './lib/actions/unsubscribe-contact';
import { zohoCampaignsAuth, zohoCampaignsCommon } from './lib/common';
import { newCampaign } from './lib/triggers/new-campaign';
import { newContact } from './lib/triggers/new-contact';
import { unsubscribe } from './lib/triggers/unsubscribe';
import { createCustomApiCallAction } from '@activepieces/pieces-common';
export const zohoCampaigns = createPiece({
displayName: 'Zoho Campaigns',
description:
'Zoho Campaigns is an email marketing platform for managing mailing lists, sending campaigns, tracking engagement, and automating subscriber workflows.',
auth: zohoCampaignsAuth,
minimumSupportedRelease: '0.36.1',
logoUrl: 'https://cdn.activepieces.com/pieces/zoho-campaigns.png',
authors: ['LuizDMM', 'onyedikachi-david'],
actions: [
// Write Actions
createCampaign,
cloneCampaign,
sendCampaign,
addUpdateContact,
addTagToContact,
removeTag,
unsubscribeContact,
addContactToMailingList,
// Search Actions
findContact,
findCampaign,
createCustomApiCallAction({
baseUrl: (auth) =>
{
const authValue = auth as OAuth2PropertyValue
const location = authValue.props?.['location'] || 'zoho.com';
return `${zohoCampaignsCommon.baseUrl(location)}?resfmt=JSON`
},
auth: zohoCampaignsAuth,
authMapping: async (auth) => ({
Authorization: `Zoho-oauthtoken ${(auth as OAuth2PropertyValue).access_token}`,
}),
}),
],
triggers: [
newContact,
unsubscribe,
newCampaign,
],
});

View File

@@ -0,0 +1,26 @@
import { propsValidation } from '@activepieces/pieces-common';
import { createAction } from '@activepieces/pieces-framework';
import { zohoCampaignsAuth, zohoCampaignsCommon } from '../common';
export const addContactToMailingList = createAction({
auth: zohoCampaignsAuth,
name: 'addContactToMailingList',
displayName: 'Add Contact to Mailing List',
description: 'Add contacts to your mailing lists.',
props: zohoCampaignsCommon.addContactToMailingListProperties(),
async run({ auth, propsValue }) {
const location = auth.props?.['location'] as string || 'zoho.com';
const accessToken = auth.access_token
await propsValidation.validateZod(
propsValue,
zohoCampaignsCommon.addContactToMailingListSchema
);
return await zohoCampaignsCommon.addContactToMailingList({
accessToken,
location,
listkey: String(propsValue.listkey),
emailids: propsValue.emails.join(','),
});
},
});

View File

@@ -0,0 +1,38 @@
import { propsValidation } from '@activepieces/pieces-common';
import { createAction } from '@activepieces/pieces-framework';
import { zohoCampaignsAuth, zohoCampaignsCommon } from '../common';
export const addTagToContact = createAction({
auth: zohoCampaignsAuth,
name: 'addTagToContact',
displayName: 'Add Tag to Contact',
description:
"Apply a tag to a contact by email. Creates the tag if it doesn't exist.",
props: zohoCampaignsCommon.addTagToContactProperties,
async run({ auth, propsValue }) {
const location = auth.props?.['location'] as string || 'zoho.com';
const accessToken = auth.access_token;
await propsValidation.validateZod(
propsValue,
zohoCampaignsCommon.addTagToContactSchema
);
const tags = await zohoCampaignsCommon.listTags({ accessToken, location });
const tagExists =
tags !== undefined &&
tags.some((tagMap) =>
Object.values(tagMap).some((t) => t.tag_name === propsValue.tagName)
);
if (!tagExists) {
await zohoCampaignsCommon.createTag({
accessToken,
location,
tagName: propsValue.tagName,
});
}
return await zohoCampaignsCommon.addTagToContact({
accessToken,
location,
...propsValue,
});
},
});

View File

@@ -0,0 +1,32 @@
import { propsValidation } from '@activepieces/pieces-common';
import { createAction } from '@activepieces/pieces-framework';
import { zohoCampaignsAuth, zohoCampaignsCommon } from '../common';
export const addUpdateContact = createAction({
auth: zohoCampaignsAuth,
name: 'addUpdateContact',
displayName: 'Add/Update Contact',
description:
'Add a new contact or update an existing one. Confirmation email sent based on mailing list settings.',
props: zohoCampaignsCommon.addUpdateContactProperties(),
async run({ auth, propsValue }) {
const location = auth.props?.['location'] as string || 'zoho.com';
const accessToken = auth.access_token;
await propsValidation.validateZod(
propsValue,
zohoCampaignsCommon.addUpdateContactSchema
);
const { additionalFields, ...baseFields } = propsValue.contactinfo;
return await zohoCampaignsCommon.addUpdateContact({
accessToken,
location,
...propsValue,
listkey: String(propsValue.listkey),
contactinfo: {
...baseFields,
...additionalFields,
},
});
},
});

View File

@@ -0,0 +1,42 @@
import { propsValidation } from '@activepieces/pieces-common';
import { createAction } from '@activepieces/pieces-framework';
import { zohoCampaignsAuth, zohoCampaignsCommon } from '../common';
export const cloneCampaign = createAction({
auth: zohoCampaignsAuth,
name: 'cloneCampaign',
displayName: 'Clone Campaign',
description: 'Clone an existing campaign, optionally renaming.',
props: zohoCampaignsCommon.cloneCampaignProperties(),
async run({ auth, propsValue }) {
const location = auth.props?.['location'] as string || 'zoho.com';
const accessToken = auth.access_token;
await propsValidation.validateZod(
propsValue,
zohoCampaignsCommon.cloneCampaignSchema
);
const {
campaignkey,
campaignname,
subject,
from_name,
from_add,
reply_to,
encode_type,
} = propsValue;
const campaigninfo = {
oldcampaignkey: campaignkey,
...(campaignname && { campaignname }),
...(subject && { subject }),
...(from_name && { from_name }),
...(from_add && { from_add }),
...(reply_to && { reply_to }),
...(encode_type && { encode_type }),
};
return await zohoCampaignsCommon.cloneCampaign({
accessToken,
location,
campaigninfo,
});
},
});

View File

@@ -0,0 +1,31 @@
import { propsValidation } from '@activepieces/pieces-common';
import { createAction } from '@activepieces/pieces-framework';
import { zohoCampaignsAuth, zohoCampaignsCommon } from '../common';
export const createCampaign = createAction({
auth: zohoCampaignsAuth,
name: 'createCampaign',
displayName: 'Create Campaign',
description:
'Create a new campaign with campaign name, subject, topic, sender name/address, and mailing list.',
props: zohoCampaignsCommon.createCampaignProperties(),
async run({ auth, propsValue }) {
const location = auth.props?.['location'] as string || 'zoho.com';
const accessToken = auth.access_token ;
await propsValidation.validateZod(
propsValue,
zohoCampaignsCommon.createCampaignSchema
);
const list_details =
propsValue.list_details?.reduce((acc, curr) => {
acc[curr] = [];
return acc;
}, {} as { [key: string]: [] }) || {};
return await zohoCampaignsCommon.createCampaign({
accessToken,
location,
...propsValue,
list_details,
});
},
});

View File

@@ -0,0 +1,49 @@
import { propsValidation } from '@activepieces/pieces-common';
import { createAction } from '@activepieces/pieces-framework';
import { zohoCampaignsAuth, zohoCampaignsCommon } from '../common';
export const findCampaign = createAction({
auth: zohoCampaignsAuth,
name: 'findCampaign',
displayName: 'Find Campaign',
description: 'Locate an existing campaign by campaign name.',
props: zohoCampaignsCommon.findCampaignProperties(),
async run({ auth, propsValue }) {
const location = auth.props?.['location'] as string || 'zoho.com';
const accessToken = auth.access_token
await propsValidation.validateZod(
propsValue,
zohoCampaignsCommon.findCampaignSchema
);
const { campaignName, status, sort, fromindex, range } = propsValue;
const searchParams: any = {
accessToken,
};
if (status) searchParams.status = status;
if (sort) searchParams.sort = sort;
if (fromindex) searchParams.fromindex = fromindex;
if (range) searchParams.range = range;
const campaigns = await zohoCampaignsCommon.listCampaigns({
...searchParams,
location
});
const needle = (campaignName ?? '').trim().toLowerCase();
// Try to find case-insensitive and partial match
const matchingCampaigns = campaigns.filter((campaign) =>
(campaign.campaign_name ?? '').toLowerCase().includes(needle)
);
if (matchingCampaigns.length === 0) {
const statusText = status ? ` with status "${status}"` : '';
throw new Error(
`No campaign found with a name containing "${campaignName}"${statusText} in the selected account.`
);
}
return matchingCampaigns;
},
});

View File

@@ -0,0 +1,57 @@
import { propsValidation } from '@activepieces/pieces-common';
import { createAction } from '@activepieces/pieces-framework';
import { zohoCampaignsAuth, zohoCampaignsCommon } from '../common';
export const findContact = createAction({
auth: zohoCampaignsAuth,
name: 'findContact',
displayName: 'Find Contact',
description: 'Look up an existing contact by email address.',
props: zohoCampaignsCommon.findContactProperties(),
async run({ auth, propsValue }) {
const location = auth.props?.['location'] as string || 'zoho.com';
const accessToken = auth.access_token;
await propsValidation.validateZod(
propsValue,
zohoCampaignsCommon.findContactSchema
);
const {
listkey,
contactEmail: email,
status,
sort,
fromindex,
range,
} = propsValue;
const searchParams: any = {
accessToken,
listkey: listkey as string,
};
if (status) searchParams.status = status;
if (sort) searchParams.sort = sort;
if (fromindex) searchParams.fromindex = fromindex;
if (range) searchParams.range = range;
const contacts = await zohoCampaignsCommon.listContacts({
...searchParams,
location,
});
const needle = (email ?? '').trim().toLowerCase();
// Try to find case-insensitive and partial match
const matchingContacts = contacts.filter((contact) =>
(contact.contact_email ?? '').toLowerCase().includes(needle)
);
if (matchingContacts.length === 0) {
const statusText = status ? ` with status "${status}"` : '';
throw new Error(
`No contact found with an email containing "${email}"${statusText} in the selected mailing list.`
);
}
return matchingContacts;
},
});

View File

@@ -0,0 +1,24 @@
import { propsValidation } from '@activepieces/pieces-common';
import { createAction } from '@activepieces/pieces-framework';
import { zohoCampaignsAuth, zohoCampaignsCommon } from '../common';
export const removeTag = createAction({
auth: zohoCampaignsAuth,
name: 'removeTag',
displayName: 'Remove Tag',
description: 'Remove a tag from a contact.',
props: zohoCampaignsCommon.removeTagProperties,
async run({ auth, propsValue }) {
const location = auth.props?.['location'] as string || 'zoho.com';
const accessToken = auth.access_token;
await propsValidation.validateZod(
propsValue,
zohoCampaignsCommon.removeTagSchema
);
return await zohoCampaignsCommon.removeTag({
accessToken,
location,
...propsValue,
});
},
});

View File

@@ -0,0 +1,25 @@
import { propsValidation } from '@activepieces/pieces-common';
import { createAction } from '@activepieces/pieces-framework';
import { zohoCampaignsAuth, zohoCampaignsCommon } from '../common';
export const sendCampaign = createAction({
auth: zohoCampaignsAuth,
name: 'sendCampaign',
displayName: 'Send Campaign',
description: 'Send a campaign that has been created or cloned.',
props: zohoCampaignsCommon.sendCampaignProperties(),
async run({ auth, propsValue }) {
const location = auth.props?.['location'] as string || 'zoho.com';
const accessToken = auth.access_token;
await propsValidation.validateZod(
propsValue,
zohoCampaignsCommon.sendCampaignSchema
);
const { campaignkey } = propsValue;
return await zohoCampaignsCommon.sendCampaign({
accessToken,
location,
campaignkey: campaignkey as string,
});
},
});

View File

@@ -0,0 +1,31 @@
import { propsValidation } from '@activepieces/pieces-common';
import { createAction } from '@activepieces/pieces-framework';
import { zohoCampaignsAuth, zohoCampaignsCommon } from '../common';
export const unsubscribeContact = createAction({
auth: zohoCampaignsAuth,
name: 'unsubscribeContact',
displayName: 'Unsubscribe Contact',
description: 'Remove a contact from a mailing list.',
props: zohoCampaignsCommon.unsubscribeContactProperties(),
async run({ auth, propsValue }) {
const location = auth.props?.['location'] as string || 'zoho.com';
const accessToken = auth.access_token;
await propsValidation.validateZod(
propsValue,
zohoCampaignsCommon.unsubscribeContactSchema
);
const { additionalFields, ...baseFields } = propsValue.contactinfo;
return await zohoCampaignsCommon.unsubscribeContact({
accessToken,
location,
listkey: String(propsValue.listkey),
contactinfo: {
...baseFields,
...additionalFields,
},
...(propsValue.topic_id && { topic_id: propsValue.topic_id }),
});
},
});

View File

@@ -0,0 +1,393 @@
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
import { PieceAuth, Property } from '@activepieces/pieces-framework';
import { OAuth2GrantType } from '@activepieces/shared';
import * as properties from './properties';
import * as schemas from './schemas';
import {
AddContactToMailingListParams,
AddTagToContactParams,
AddUpdateContactParams,
AuthorizationParams,
CloneCampaignParams,
CreateCampaignParams,
CreateCampaignResponse,
CreateTagParams,
ListCampaignParams,
ListCampaignResponse,
ListContactsParams,
ListContactsResponse,
ListMailingListsParams,
ListMailingListsResponse,
ListTagsResponse,
ListTopicsResponse,
RemoveTagParams,
SendCampaignParams,
UnsubscribeContactParams,
} from './types';
export const zohoCampaignsAuth = PieceAuth.OAuth2({
props: {
location: Property.StaticDropdown({
displayName: 'Data Center',
description: 'The data center location of your Zoho Campaigns account',
required: true,
options: {
options: [
{
label: 'zoho.com (United States)',
value: 'zoho.com',
},
{
label: 'zoho.eu (Europe)',
value: 'zoho.eu',
},
{
label: 'zoho.in (India)',
value: 'zoho.in',
},
{
label: 'zoho.com.au (Australia)',
value: 'zoho.com.au',
},
{
label: 'zoho.jp (Japan)',
value: 'zoho.jp',
},
{
label: 'zoho.com.cn (China)',
value: 'zoho.com.cn',
},
],
},
}),
},
description: 'Connect your Zoho Campaigns account using OAuth2',
grantType: OAuth2GrantType.AUTHORIZATION_CODE,
required: true,
authUrl: 'https://accounts.{location}/oauth/v2/auth',
tokenUrl: 'https://accounts.{location}/oauth/v2/token',
scope: ['ZohoCampaigns.campaign.ALL', 'ZohoCampaigns.contact.ALL'],
});
export const zohoCampaignsCommon = {
baseUrl: (location = 'zoho.com') => {
return `https://campaigns.${location}/api/v1.1`;
},
endpoints: {
createCampaign: '/createCampaign',
createTag: '/tag/add',
cloneCampaign: '/json/clonecampaign',
sendCampaign: '/sendcampaign',
addUpdateContact: '/json/listsubscribe',
addTagToContact: '/tag/associate',
removeTag: '/tag/deassociate',
unsubscribeContact: '/json/listunsubscribe',
addContactToMailingList: '/addlistsubscribersinbulk',
listContacts: '/getlistsubscribers',
listCampaigns: '/recentcampaigns',
listMailingLists: '/getmailinglists',
listTopics: '/topics',
listTags: '/tag/getalltags',
},
baseHeaders: (accessToken: string) => {
return {
Authorization: `Zoho-oauthtoken ${accessToken}`,
'Content-Type': 'application/json',
};
},
baseParams: {
resfmt: 'JSON',
},
// Properties
createCampaignProperties: properties.createCampaign,
cloneCampaignProperties: properties.cloneCampaign,
sendCampaignProperties: properties.sendCampaign,
addUpdateContactProperties: properties.addUpdateContact,
addTagToContactProperties: properties.addTagToContact,
removeTagProperties: properties.removeTag,
unsubscribeContactProperties: properties.unsubscribeContact,
addContactToMailingListProperties: properties.addContactToMailingList,
findContactProperties: properties.findContact,
findCampaignProperties: properties.findCampaign,
newContactProperties: properties.newContact,
unsubscribeProperties: properties.unsubscribe,
// Schemas
createCampaignSchema: schemas.createCampaign,
cloneCampaignSchema: schemas.cloneCampaign,
sendCampaignSchema: schemas.sendCampaign,
addUpdateContactSchema: schemas.addUpdateContact,
addTagToContactSchema: schemas.addTagToContact,
removeTagSchema: schemas.removeTag,
unsubscribeContactSchema: schemas.unsubscribeContact,
addContactToMailingListSchema: schemas.addContactToMailingList,
findContactSchema: schemas.findContact,
findCampaignSchema: schemas.findCampaign,
// Methods
createCampaign: async ({
accessToken,
location = 'zoho.com',
...campaignParams
}: CreateCampaignParams & { location?: string }) => {
const {
list_details: listDetails,
topicId,
...restParams
} = campaignParams;
const list_details = JSON.stringify(listDetails);
const body = new URLSearchParams({
resfmt: 'json',
list_details,
...restParams,
...(topicId && { topicId }),
}).toString();
const response = await httpClient.sendRequest<CreateCampaignResponse>({
method: HttpMethod.POST,
url: `${zohoCampaignsCommon.baseUrl(location)}${zohoCampaignsCommon.endpoints.createCampaign}`,
headers: {
...zohoCampaignsCommon.baseHeaders(accessToken),
'Content-Type': 'application/x-www-form-urlencoded',
},
body,
});
return response.body;
},
createTag: async ({ accessToken, location = 'zoho.com', tagName }: CreateTagParams & { location?: string }) => {
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: `${zohoCampaignsCommon.baseUrl(location)}${zohoCampaignsCommon.endpoints.createTag}`,
headers: zohoCampaignsCommon.baseHeaders(accessToken),
queryParams: {
...zohoCampaignsCommon.baseParams,
tagName,
},
});
return response.body;
},
cloneCampaign: async ({ accessToken, location = 'zoho.com', campaigninfo }: CloneCampaignParams & { location?: string }) => {
const strCampaignInfo = JSON.stringify(campaigninfo);
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${zohoCampaignsCommon.baseUrl(location)}${zohoCampaignsCommon.endpoints.cloneCampaign}`,
headers: zohoCampaignsCommon.baseHeaders(accessToken),
queryParams: {
...zohoCampaignsCommon.baseParams,
campaigninfo: strCampaignInfo,
},
});
return response.body;
},
sendCampaign: async ({ accessToken, location = 'zoho.com', campaignkey }: SendCampaignParams & { location?: string }) => {
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${zohoCampaignsCommon.baseUrl(location)}${zohoCampaignsCommon.endpoints.sendCampaign}`,
headers: {
...zohoCampaignsCommon.baseHeaders(accessToken),
'Content-Type': 'application/x-www-form-urlencoded',
},
queryParams: {
...zohoCampaignsCommon.baseParams,
campaignkey,
},
});
return response.body;
},
addUpdateContact: async ({
accessToken,
location = 'zoho.com',
...contactParams
}: AddUpdateContactParams & { location?: string }) => {
const {
listkey,
contactinfo: contactInfoObj,
source,
topic_id,
} = contactParams;
const body = new URLSearchParams({
...zohoCampaignsCommon.baseParams,
listkey,
...(source && { source }),
...(topic_id && { topic_id }),
contactinfo: JSON.stringify(contactInfoObj),
}).toString();
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${zohoCampaignsCommon.baseUrl(location)}${zohoCampaignsCommon.endpoints.addUpdateContact}`,
headers: {
...zohoCampaignsCommon.baseHeaders(accessToken),
'Content-Type': 'application/x-www-form-urlencoded',
},
body,
});
return response.body;
},
addTagToContact: async ({
accessToken,
location = 'zoho.com',
...tagParams
}: AddTagToContactParams & { location?: string }) => {
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: `${zohoCampaignsCommon.baseUrl(location)}${zohoCampaignsCommon.endpoints.addTagToContact}`,
headers: zohoCampaignsCommon.baseHeaders(accessToken),
queryParams: {
...zohoCampaignsCommon.baseParams,
...tagParams,
},
});
return response.body;
},
removeTag: async ({ accessToken, location = 'zoho.com', ...tagParams }: RemoveTagParams & { location?: string }) => {
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: `${zohoCampaignsCommon.baseUrl(location)}${zohoCampaignsCommon.endpoints.removeTag}`,
headers: zohoCampaignsCommon.baseHeaders(accessToken),
queryParams: {
...zohoCampaignsCommon.baseParams,
...tagParams,
},
});
return response.body;
},
unsubscribeContact: async ({
accessToken,
location = 'zoho.com',
...unsubscribeParams
}: UnsubscribeContactParams & { location?: string }) => {
const {
contactinfo: contactInfoObj,
listkey,
topic_id,
} = unsubscribeParams;
const body = new URLSearchParams({
...zohoCampaignsCommon.baseParams,
listkey,
...(topic_id && { topic_id }),
contactinfo: JSON.stringify(contactInfoObj),
}).toString();
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${zohoCampaignsCommon.baseUrl(location)}${zohoCampaignsCommon.endpoints.unsubscribeContact}`,
headers: {
...zohoCampaignsCommon.baseHeaders(accessToken),
'Content-Type': 'application/x-www-form-urlencoded',
},
body,
});
return response.body;
},
addContactToMailingList: async ({
accessToken,
location = 'zoho.com',
...mailingListParams
}: AddContactToMailingListParams & { location?: string }) => {
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${zohoCampaignsCommon.baseUrl(location)}${zohoCampaignsCommon.endpoints.addContactToMailingList}`,
headers: zohoCampaignsCommon.baseHeaders(accessToken),
queryParams: {
...zohoCampaignsCommon.baseParams,
...mailingListParams,
},
});
return response.body;
},
listContacts: async ({
accessToken,
location = 'zoho.com',
listkey,
...rest
}: ListContactsParams & { location?: string }) => {
const { fromindex, range, ...otherParams } = rest;
const strFromIndex =
typeof fromindex === 'number' ? String(fromindex) : undefined;
const strRange = typeof range === 'number' ? String(range) : undefined;
const queryParams = {
...zohoCampaignsCommon.baseParams,
listkey,
...(fromindex && { fromindex: strFromIndex }),
...(range && { range: strRange }),
...otherParams,
};
const response = await httpClient.sendRequest<ListContactsResponse>({
method: HttpMethod.GET,
url: `${zohoCampaignsCommon.baseUrl(location)}${zohoCampaignsCommon.endpoints.listContacts}`,
headers: zohoCampaignsCommon.baseHeaders(accessToken),
queryParams,
});
return response.body.list_of_details || [];
},
listCampaigns: async ({
accessToken,
location = 'zoho.com',
...filterParams
}: ListCampaignParams & { location?: string }) => {
const { fromindex, range, ...otherParams } = filterParams;
const strFromIndex =
typeof fromindex === 'number' ? String(fromindex) : undefined;
const strRange = typeof range === 'number' ? String(range) : undefined;
const queryParams = {
...zohoCampaignsCommon.baseParams,
...(fromindex && { fromindex: strFromIndex }),
...(range && { range: strRange }),
...otherParams,
};
const response = await httpClient.sendRequest<ListCampaignResponse>({
method: HttpMethod.GET,
url: `${zohoCampaignsCommon.baseUrl(location)}${zohoCampaignsCommon.endpoints.listCampaigns}`,
headers: zohoCampaignsCommon.baseHeaders(accessToken),
queryParams,
});
return response.body.recent_campaigns || [];
},
listMailingLists: async ({
accessToken,
location = 'zoho.com',
...filterParams
}: ListMailingListsParams & { location?: string }) => {
const { fromindex, range, ...otherParams } = filterParams;
const strFromIndex =
typeof fromindex === 'number' ? String(fromindex) : undefined;
const strRange = typeof range === 'number' ? String(range) : undefined;
const queryParams = {
...zohoCampaignsCommon.baseParams,
...(fromindex && { fromindex: strFromIndex }),
...(range && { range: strRange }),
...otherParams,
};
const response = await httpClient.sendRequest<ListMailingListsResponse>({
method: HttpMethod.GET,
url: `${zohoCampaignsCommon.baseUrl(location)}${zohoCampaignsCommon.endpoints.listMailingLists}`,
headers: zohoCampaignsCommon.baseHeaders(accessToken),
queryParams,
});
return response.body.list_of_details || [];
},
listTopics: async ({ accessToken, location = 'zoho.com' }: AuthorizationParams & { location?: string }) => {
const response = await httpClient.sendRequest<ListTopicsResponse>({
method: HttpMethod.GET,
url: `${zohoCampaignsCommon.baseUrl(location)}${zohoCampaignsCommon.endpoints.listTopics}`,
headers: zohoCampaignsCommon.baseHeaders(accessToken),
queryParams: {
...zohoCampaignsCommon.baseParams,
},
});
return response.body.topicDetails;
},
listTags: async ({ accessToken, location = 'zoho.com' }: AuthorizationParams & { location?: string }) => {
const response = await httpClient.sendRequest<ListTagsResponse>({
method: HttpMethod.GET,
url: `${zohoCampaignsCommon.baseUrl(location)}${zohoCampaignsCommon.endpoints.listTags}`,
headers: zohoCampaignsCommon.baseHeaders(accessToken),
queryParams: {
...zohoCampaignsCommon.baseParams,
},
});
return response.body.tags;
},
};

View File

@@ -0,0 +1,471 @@
import { PiecePropValueSchema, Property } from '@activepieces/pieces-framework';
import { zohoCampaignsAuth, zohoCampaignsCommon } from '.';
import { Tag } from './types';
// Custom Properties
const campaignDropdown = () =>
Property.Dropdown({
auth: zohoCampaignsAuth,
displayName: 'Campaign',
description: 'Select the campaign',
required: true,
refreshers: ['auth'],
options: async ({ auth }) => {
const authValue = auth as PiecePropValueSchema<typeof zohoCampaignsAuth>;
const location = authValue.props?.['location'] || 'zoho.com';
if (!auth) {
return {
disabled: true,
placeholder: 'Connect your Zoho Campaigns account first',
options: [],
};
}
const campaigns = await zohoCampaignsCommon.listCampaigns({
accessToken: authValue.access_token,
location,
});
if (campaigns.length === 0) {
return {
disabled: true,
placeholder: 'No campaigns found',
options: [],
};
}
return {
options: campaigns.map((campaign) => ({
label: campaign.campaign_name,
value: campaign.campaign_key,
})),
};
},
});
const tagDropdown = ({ required = true }: { required?: boolean }) =>
Property.Dropdown({
auth: zohoCampaignsAuth,
displayName: 'Tag',
description: 'Select the tag to associate with the contact',
required: required,
refreshers: ['auth'],
options: async ({
auth,
}): Promise<{
disabled?: boolean;
placeholder?: string;
options: Array<{ label: string; value: string }>;
}> => {
const authValue = auth as PiecePropValueSchema<typeof zohoCampaignsAuth>;
const location = authValue.props?.['location'] || 'zoho.com';
if (!auth) {
return {
disabled: true,
placeholder: 'Connect your Zoho Campaigns account first',
options: [],
};
}
const tags = await zohoCampaignsCommon.listTags({
accessToken: authValue.access_token,
location,
});
if (!tags || tags.length === 0) {
return {
disabled: true,
placeholder: 'No tags found',
options: [],
};
}
const tagOptions = tags.flatMap((tagMap: Tag) =>
Object.values(tagMap).map((tag: any) => ({
label: tag.tag_name,
value: tag.tag_name,
}))
);
return {
options: tagOptions,
};
},
});
const mailingListDropdown = ({ required = true }) =>
Property.Dropdown({
auth: zohoCampaignsAuth,
displayName: 'Mailing List',
description: 'Select the mailing list',
required: required,
refreshers: ['auth'],
options: async ({ auth }) => {
const authValue = auth as PiecePropValueSchema<typeof zohoCampaignsAuth>;
const location = authValue.props?.['location'] || 'zoho.com';
if (!auth) {
return {
disabled: true,
placeholder: 'Connect your Zoho Campaigns account first',
options: [],
};
}
const mailingLists = await zohoCampaignsCommon.listMailingLists({
accessToken: authValue.access_token,
location,
});
if (mailingLists.length === 0) {
return {
disabled: true,
placeholder: 'No mailing lists found',
options: [],
};
}
return {
options: mailingLists.map((list) => ({
label: list.listname,
value: list.listkey,
})),
};
},
});
const mailingListMultiSelectDropdown = ({ required = true }) =>
Property.MultiSelectDropdown({
auth: zohoCampaignsAuth,
displayName: 'Mailing Lists',
description: 'Select the mailing lists',
required: required,
refreshers: ['auth'],
options: async ({ auth }) => {
const authValue = auth as PiecePropValueSchema<typeof zohoCampaignsAuth>;
const location = authValue.props?.['location'] || 'zoho.com';
if (!auth) {
return {
disabled: true,
placeholder: 'Connect your Zoho Campaigns account first',
options: [],
};
}
const mailingLists = await zohoCampaignsCommon.listMailingLists({
accessToken: authValue.access_token,
location,
});
if (mailingLists.length === 0) {
return {
disabled: true,
placeholder: 'No mailing lists found',
options: [],
};
}
return {
options: mailingLists.map((list) => ({
label: list.listname,
value: list.listkey,
})),
};
},
});
const topicDropdown = ({ required = true }) =>
Property.Dropdown({
auth: zohoCampaignsAuth,
displayName: 'Topic',
description: 'Select the topic',
required: required,
refreshers: ['auth'],
options: async ({ auth }) => {
const authValue = auth as PiecePropValueSchema<typeof zohoCampaignsAuth>;
const location = authValue.props?.['location'] || 'zoho.com';
if (!auth) {
return {
disabled: true,
placeholder: 'Connect your Zoho Campaigns account first',
options: [],
};
}
const topics = await zohoCampaignsCommon.listTopics({
accessToken: authValue.access_token,
location,
});
if (topics.length === 0) {
return {
disabled: true,
placeholder: 'No topics found',
options: [],
};
}
return {
options: topics.map((topic) => ({
label: topic.topicName,
value: topic.topicId,
})),
};
},
});
const contactInformation = Property.DynamicProperties({
displayName: 'Contact Information',
description: 'Information about the contact',
required: true,
auth: zohoCampaignsAuth,
refreshers: ['auth'],
props: async () => ({
'Contact Email': Property.ShortText({
displayName: 'Contact Email',
description: 'Email address of the contact',
required: true,
}),
'First Name': Property.ShortText({
displayName: 'First Name',
description: 'First name of the contact',
required: false,
}),
'Last Name': Property.ShortText({
displayName: 'Last Name',
description: 'Last name of the contact',
required: false,
}),
Phone: Property.ShortText({
displayName: 'Phone',
description: 'Phone number of the contact',
required: false,
}),
'Company Name': Property.ShortText({
displayName: 'Company Name',
description: 'Company name of the contact',
required: false,
}),
additionalFields: Property.Object({
displayName: 'Additional Fields',
description:
'Additional fields for the contact in key-value pairs. For example, {"City": "New York", "State": "NY"}',
required: false,
}),
}),
});
// Action Properties
export const createCampaign = () => ({
campaignname: Property.ShortText({
displayName: 'Campaign Name',
description: 'A name to your campaign',
required: true,
}),
from_email: Property.ShortText({
displayName: 'From Email',
description: 'Sender email address for the campaign',
required: true,
}),
subject: Property.ShortText({
displayName: 'Subject',
description: 'The subject line of the campaign',
required: true,
}),
list_details: mailingListMultiSelectDropdown({ required: true }),
content_url: Property.ShortText({
displayName: 'Content URL',
description: 'Public URL containing the HTML content for your campaign',
required: false,
}),
topicId: topicDropdown({ required: false }),
});
export const cloneCampaign = () => ({
campaignkey: campaignDropdown(),
campaignname: Property.ShortText({
displayName: 'Campaign Name',
description: 'New name for the cloned campaign',
required: false,
}),
subject: Property.ShortText({
displayName: 'Subject',
description: 'New subject line for the cloned campaign',
required: false,
}),
from_name: Property.ShortText({
displayName: 'From Name',
description: 'Sender name for the cloned campaign',
required: false,
}),
from_add: Property.ShortText({
displayName: 'From Email',
description: 'Sender email address for the cloned campaign',
required: false,
}),
reply_to: Property.ShortText({
displayName: 'Reply-To Email',
description: 'Reply-to email address for the cloned campaign',
required: false,
}),
encode_type: Property.ShortText({
displayName: 'Encoding Type',
description: 'Email encoding type (e.g., UTF-8)',
required: false,
}),
});
export const sendCampaign = () => ({
campaignkey: campaignDropdown(),
});
export const addUpdateContact = () => ({
listkey: mailingListDropdown({ required: true }),
contactinfo: contactInformation,
source: Property.ShortText({
displayName: 'Source',
description: 'Contact source can be added.',
required: false,
}),
topic_id: topicDropdown({ required: false }),
});
export const addTagToContact: {
tagName: any;
lead_email: any;
} = {
tagName: tagDropdown({ required: true }),
lead_email: Property.ShortText({
displayName: 'Contact Email',
description: 'Email address of the contact to tag',
required: true,
}),
};
export const removeTag: {
tagName: any;
lead_email: any;
} = {
tagName: tagDropdown({ required: true }),
lead_email: Property.ShortText({
displayName: 'Contact Email',
description: 'Email address of the contact to remove the tag from',
required: true,
}),
};
export const unsubscribeContact = () => ({
listkey: mailingListDropdown({ required: true }),
contactinfo: contactInformation,
topic_id: topicDropdown({ required: false }),
});
export const addContactToMailingList = () => ({
listkey: mailingListDropdown({ required: true }),
emails: Property.Array({
displayName: 'Emails',
description:
'Contacts email addresses to be added to the mailing list (maximum 10 emails)',
required: true,
}),
});
export const findContact = () => ({
listkey: mailingListDropdown({ required: true }),
contactEmail: Property.ShortText({
displayName: 'Contact Email',
description: 'Email of the contact to be found (partial matches supported)',
required: true,
}),
status: Property.StaticDropdown({
displayName: 'Contact Status',
description: 'Filter contacts by status',
required: true,
options: {
options: [
{ label: 'Active', value: 'active' },
{ label: 'Recent', value: 'recent' },
{ label: 'Most Recent', value: 'most recent' },
{ label: 'Unsubscribed', value: 'unsub' },
{ label: 'Bounced', value: 'bounce' },
],
},
}),
sort: Property.StaticDropdown({
displayName: 'Sort Order',
description: 'Sort order for results',
required: true,
options: {
options: [
{ label: 'Ascending', value: 'asc' },
{ label: 'Descending', value: 'desc' },
],
},
}),
fromindex: Property.Number({
displayName: 'From Index',
description: 'Starting index for pagination (optional, default: 1)',
required: false,
}),
range: Property.Number({
displayName: 'Range',
description: 'Number of contacts to retrieve (optional, default: all)',
required: false,
}),
});
export const findCampaign = () => ({
campaignName: Property.ShortText({
displayName: 'Campaign Name',
description: 'Name of the campaign to be found (partial matches supported)',
required: true,
}),
status: Property.StaticDropdown({
displayName: 'Campaign Status',
description: 'Filter campaigns by status (optional)',
required: false,
options: {
options: [
{ label: 'All', value: 'all' },
{ label: 'All Campaigns', value: 'all campaigns' },
{ label: 'Drafts', value: 'drafts' },
{ label: 'Scheduled', value: 'scheduled' },
{ label: 'In Progress', value: 'inprogress' },
{ label: 'Sent', value: 'sent' },
{ label: 'Stopped', value: 'stopped' },
{ label: 'Canceled', value: 'canceled' },
{ label: 'To Be Reviewed', value: 'tobereviewed' },
{ label: 'Reviewed', value: 'reviewed' },
{ label: 'Paused', value: 'paused' },
{ label: 'In Testing', value: 'intesting' },
],
},
}),
sort: Property.StaticDropdown({
displayName: 'Sort Order',
description: 'Sort order for results (optional)',
required: false,
options: {
options: [
{ label: 'Ascending', value: 'asc' },
{ label: 'Descending', value: 'desc' },
],
},
}),
fromindex: Property.Number({
displayName: 'From Index',
description: 'Starting index for pagination (optional, default: 1)',
required: false,
}),
range: Property.Number({
displayName: 'Range',
description: 'Number of campaigns to retrieve (optional, default: 5)',
required: false,
}),
});
export const newContact = () => ({
listkey: mailingListDropdown({ required: true }),
});
export const unsubscribe = () => ({
listkey: mailingListDropdown({ required: true }),
status: Property.StaticDropdown({
displayName: 'Unsubscribe Type',
description: 'Type of contact removal to monitor (default: unsubscribed)',
required: false,
options: {
options: [
{ label: 'Unsubscribed', value: 'unsub' },
{ label: 'Bounced', value: 'bounce' },
],
},
}),
});

View File

@@ -0,0 +1,73 @@
import z from 'zod';
export const createCampaign = {
campaignname: z.string(),
from_email: z.string().email(),
subject: z.string(),
content_url: z.string().url().optional(),
list_details: z.array(z.string()),
topicId: z.string().nullable().optional(),
}
export const cloneCampaign = {
campaignkey: z.string(),
campaignname: z.string().optional(),
subject: z.string().optional(),
from_name: z.string().optional(),
from_add: z.string().email().optional(),
reply_to: z.string().email().optional(),
encode_type: z.string().optional(),
}
export const sendCampaign = {
campaignkey: z.string(),
}
export const addUpdateContact = {
listkey: z.string(),
contactinfo: z.object({
'Contact Email': z.string().email(),
}),
source: z.string().optional(),
topic_id: z.string().nullable().optional(),
}
export const addTagToContact = {
tagName: z.string(),
lead_email: z.string().email(),
}
export const removeTag = {
tagName: z.string(),
lead_email: z.string().email(),
}
export const unsubscribeContact = {
listkey: z.string(),
contactinfo: z.object({
'Contact Email': z.string().email(),
}),
topic_id: z.string().nullable().optional(),
}
export const addContactToMailingList = {
listkey: z.string(),
emails: z.array(z.string().email()).min(1).max(10),
}
export const findContact = {
listkey: z.string(),
contactEmail: z.string().email(),
status: z.enum(['active', 'recent', 'most recent', 'unsub', 'bounce']).optional(),
sort: z.enum(['asc', 'desc']).optional(),
fromindex: z.number().min(1).optional(),
range: z.number().min(1).optional(),
}
export const findCampaign = {
campaignName: z.string(),
status: z.enum(['all', 'all campaigns', 'drafts', 'scheduled', 'inprogress', 'sent', 'stopped', 'canceled', 'tobereviewed', 'reviewed', 'paused', 'intesting']).optional(),
sort: z.enum(['asc', 'desc']).optional(),
fromindex: z.number().min(1).optional(),
range: z.number().min(1).optional(),
}

View File

@@ -0,0 +1,224 @@
export interface AuthorizationParams {
accessToken: string;
}
export interface BaseCampaignKeyParams {
campaignkey: string;
}
export interface CreateCampaignParams extends AuthorizationParams {
campaignname: string;
from_email: string;
subject: string;
content_url?: string;
list_details: object;
topicId?: string;
}
export interface CreateTagParams extends AuthorizationParams {
tagName: string;
}
export interface CloneCampaignParams extends AuthorizationParams {
campaigninfo: object;
}
export interface SendCampaignParams
extends AuthorizationParams,
BaseCampaignKeyParams {}
export interface AddUpdateContactParams extends AuthorizationParams {
listkey: string;
contactinfo: object;
source?: string;
topic_id?: string;
}
export interface AddTagToContactParams extends AuthorizationParams {
tagName: string;
lead_email: string;
}
export interface RemoveTagParams extends AuthorizationParams {
tagName: string;
lead_email: string;
}
export interface UnsubscribeContactParams extends AuthorizationParams {
listkey: string;
contactinfo: object;
topic_id?: string;
}
export interface AddContactToMailingListParams extends AuthorizationParams {
listkey: string;
emailids: string;
}
export interface ListContactsParams extends AuthorizationParams {
listkey: string;
sort?: 'asc' | 'desc';
fromindex?: number;
range?: number;
status?: 'active' | 'recent' | 'most recent' | 'unsub' | 'bounce';
}
export interface ListCampaignParams extends AuthorizationParams {
sort?: 'asc' | 'desc';
fromindex?: number;
range?: number;
status?:
| 'all'
| 'all campaigns'
| 'drafts'
| 'scheduled'
| 'inprogress'
| 'sent'
| 'stopped'
| 'canceled'
| 'tobereviewed'
| 'reviewed'
| 'paused'
| 'intesting';
}
export interface ListMailingListsParams extends AuthorizationParams {
sort?: 'asc' | 'desc';
fromindex?: number;
range?: number;
}
// API Response types
export type Campaign = {
campaign_key: string;
campaign_name: string;
created_date_string: string;
campaign_status: string;
created_time: string;
campaign_preview: string;
};
export type Contact = {
firstname: string;
added_time: string;
phone: string;
companyname: string;
contact_email: string;
lastname: string;
zuid: string;
};
export type MailingList = {
date: string;
deletable: string;
segments: object;
updated_time_gmt: string;
listdesc: string;
created_time_gmt: string;
list_created_time: string;
noofunsubcnt: string;
lockstatus: string;
listkey: string;
listtype: string;
sentcnt: string;
owner: string;
list_campaigns_count: string;
created_time: string;
noofcontacts: string;
editable: string;
listname: string;
listdgs: string;
noofbouncecnt: string;
issmart: string;
list_created_date: string;
listnotifications: string;
listunino: string;
zuid: string;
servicetype: string;
sno: string;
is_public: string;
otherslist: string;
zx: string;
};
export type Topic = {
topicId: string;
topicName: string;
primaryList: number;
};
export type Tag = {
[key: string]: {
tagowner: string;
tag_created_time: string;
tag_name: string;
tag_color: string;
tag_desc: string;
tagged_contact_count: string;
is_crm_tag: string;
zuid: string;
};
};
export interface ListCampaignResponse {
fromindex: string;
total_record_count: string;
code: string;
recent_campaigns: Campaign[];
range: string;
campaign_count: string;
uri: string;
version: string;
requestdetails: string;
status: string;
}
export interface ListContactsResponse {
code: string;
uri: string;
version: string;
list_of_details: Contact[];
requestdetails: {
fromindex: number;
range: number;
sort: string;
status: string;
};
status: string;
}
export interface ListMailingListsResponse {
code: string;
uri: string;
version: string;
list_of_details: MailingList[];
requestdetails: {
fromindex: number;
range: number;
total_list_count: number;
sort: string;
};
status: string;
}
export interface ListTopicsResponse {
topicDetails: Topic[];
message: string;
code: string;
uri: string;
}
export interface CreateCampaignResponse {
message: string;
campaignKey: string;
code: string;
uri: string;
}
export interface ListTagsResponse {
uri: string;
version: string;
requestdetails: string;
tags?: Tag[];
}

View File

@@ -0,0 +1,65 @@
import {
DedupeStrategy,
Polling,
pollingHelper,
} from '@activepieces/pieces-common';
import {
AppConnectionValueForAuthProperty,
createTrigger,
TriggerStrategy,
} from '@activepieces/pieces-framework';
import dayjs from 'dayjs';
import { zohoCampaignsAuth, zohoCampaignsCommon } from '../common';
const polling: Polling<
AppConnectionValueForAuthProperty<typeof zohoCampaignsAuth>,
Record<string, never>
> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth }) => {
const location = auth.props?.['location'] as string || 'zoho.com';
const accessToken = auth.access_token;
const items = await zohoCampaignsCommon.listCampaigns({
accessToken,
location,
});
return items.map((item) => ({
epochMilliSeconds: dayjs(item.created_date_string).valueOf(),
data: item,
}));
},
};
export const newCampaign = createTrigger({
auth: zohoCampaignsAuth,
name: 'newCampaign',
displayName: 'New Campaign',
description: 'Fires when a new campaign is created.',
props: {},
sampleData: {
campaign_key: 'f70c4878c4a47169407e63917ad24497',
campaign_name: 'Summer Newsletter 2024',
created_date_string: '19 Aug 2024, 11:26 AM',
campaign_status: 'Draft',
created_time: '1724065567000',
campaign_preview:
'https://campaigns.zoho.com/EmailDisplayAction.do?&campaignId=303000023454038',
},
type: TriggerStrategy.POLLING,
async test(context) {
return await pollingHelper.test(polling, context);
},
async onEnable(context) {
const { store, auth, propsValue } = context;
await pollingHelper.onEnable(polling, { store, auth, propsValue });
},
async onDisable(context) {
const { store, auth, propsValue } = context;
await pollingHelper.onDisable(polling, { store, auth, propsValue });
},
async run(context) {
return await pollingHelper.poll(polling, context);
},
});

View File

@@ -0,0 +1,76 @@
import {
DedupeStrategy,
Polling,
pollingHelper,
} from '@activepieces/pieces-common';
import {
AppConnectionValueForAuthProperty,
createTrigger,
PiecePropValueSchema,
StaticPropsValue,
TriggerStrategy,
} from '@activepieces/pieces-framework';
import dayjs from 'dayjs';
import { zohoCampaignsAuth, zohoCampaignsCommon } from '../common';
const polling: Polling<
AppConnectionValueForAuthProperty<typeof zohoCampaignsAuth>,
StaticPropsValue<any>
> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, propsValue }) => {
const location = auth.props?.['location'] as string || 'zoho.com';
const accessToken = auth.access_token;
const { listkey } = propsValue;
if (!listkey) {
throw new Error('Mailing list is required');
}
const items = await zohoCampaignsCommon.listContacts({
accessToken,
location,
listkey,
sort:'desc',
});
return items.map((item) => ({
epochMilliSeconds: dayjs(item.added_time).valueOf(),
data: item,
}));
},
};
export const newContact = createTrigger({
auth: zohoCampaignsAuth,
name: 'newContact',
displayName: 'New Contact',
description: 'Fires when a new contact is added to a selected mailing list.',
props: zohoCampaignsCommon.newContactProperties(),
sampleData: {
contact_email: 'john.doe@example.com',
firstname: 'John',
lastname: 'Doe',
phone: '+1-555-123-4567',
companyname: 'Acme Corp',
zuid: '12345678',
added_time: '1699123456789',
},
type: TriggerStrategy.POLLING,
async test(context) {
return await pollingHelper.test(polling, context);
},
async onEnable(context) {
const { store, auth, propsValue } = context;
await pollingHelper.onEnable(polling, { store, auth, propsValue });
},
async onDisable(context) {
const { store, auth, propsValue } = context;
await pollingHelper.onDisable(polling, { store, auth, propsValue });
},
async run(context) {
return await pollingHelper.poll(polling, context);
},
});

View File

@@ -0,0 +1,78 @@
import {
DedupeStrategy,
Polling,
pollingHelper,
} from '@activepieces/pieces-common';
import {
AppConnectionValueForAuthProperty,
createTrigger,
PiecePropValueSchema,
StaticPropsValue,
TriggerStrategy,
} from '@activepieces/pieces-framework';
import dayjs from 'dayjs';
import { zohoCampaignsAuth, zohoCampaignsCommon } from '../common';
// replace auth with piece auth variable
const polling: Polling<
AppConnectionValueForAuthProperty<typeof zohoCampaignsAuth>,
StaticPropsValue<any>
> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, propsValue }) => {
const { listkey, status = 'unsub' } = propsValue;
const location = auth.props?.['location'] as string || 'zoho.com';
const accessToken = auth.access_token;
if (!listkey) {
throw new Error('Mailing list is required');
}
const items = await zohoCampaignsCommon.listContacts({
accessToken,
location,
listkey,
sort: 'desc',
status,
});
return items.map((item) => ({
epochMilliSeconds: dayjs(item.added_time).valueOf(),
data: item,
}));
},
};
export const unsubscribe = createTrigger({
auth: zohoCampaignsAuth,
name: 'unsubscribe',
displayName: 'Unsubscribe',
description:
'Fires when a contact is removed from a mailing list or unsubscribed.',
props: zohoCampaignsCommon.unsubscribeProperties(),
sampleData: {
contact_email: 'unsubscribed@example.com',
firstname: 'John',
lastname: 'Doe',
phone: '+1-555-123-4567',
companyname: 'Acme Corp',
zuid: '12345678',
added_time: '1699123456789',
},
type: TriggerStrategy.POLLING,
async test(context) {
return await pollingHelper.test(polling, context);
},
async onEnable(context) {
const { store, auth, propsValue } = context;
await pollingHelper.onEnable(polling, { store, auth, propsValue });
},
async onDisable(context) {
const { store, auth, propsValue } = context;
await pollingHelper.onDisable(polling, { store, auth, propsValue });
},
async run(context) {
return await pollingHelper.poll(polling, context);
},
});