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,37 @@
{
"Mailchimp": "Mailchimp",
"All-in-One integrated marketing platform": "All-in-One integrated marketing platform",
"Add Member to an Audience (List)": "Add Member to an Audience (List)",
"Add Note to Subscriber": "Add Note to Subscriber",
"Add Subscriber to a tag": "Add Subscriber to a tag",
"Remove Subscriber from a tag": "Remove Subscriber from a tag",
"Update Member in an Audience (List)": "Update Member in an Audience (List)",
"Add a member to an existing Mailchimp audience (list)": "Add a member to an existing Mailchimp audience (list)",
"Add a note to a subscriber": "Add a note to a subscriber",
"Adds a subscriber to a tag. This will fail if the user is not subscribed to the audience.": "Adds a subscriber to a tag. This will fail if the user is not subscribed to the audience.",
"Removes a subscriber from a tag": "Removes a subscriber from a tag",
"Update a member in an existing Mailchimp audience (list)": "Update a member in an existing Mailchimp audience (list)",
"First Name": "First Name",
"Last Name": "Last Name",
"Email": "Email",
"Audience": "Audience",
"Status": "Status",
"Note": "Note",
"Tag Name": "Tag Name",
"First name of the new contact": "First name of the new contact",
"Last name of the new contact": "Last name of the new contact",
"Email of the new contact": "Email of the new contact",
"Audience you want to add the contact to": "Audience you want to add the contact to",
"Email of the subscriber": "Email of the subscriber",
"Note to add to the subscriber": "Note to add to the subscriber",
"Tag name to add to the subscriber": "Tag name to add to the subscriber",
"Subscribed": "Subscribed",
"Unsubscribed": "Unsubscribed",
"Cleaned": "Cleaned",
"Pending": "Pending",
"Transactional": "Transactional",
"Member Subscribed to Audience": "Member Subscribed to Audience",
"Member Unsubscribed to Audience": "Member Unsubscribed to Audience",
"Runs when an Audience subscriber is added.": "Runs when an Audience subscriber is added.",
"Runs when a member unsubscribes.": "Runs when a member unsubscribes."
}

View File

@@ -0,0 +1,188 @@
{
"All-in-One integrated marketing platform for managing audiences, sending campaigns, tracking engagement, and automating lifecycle communications.": "All-in-One integrierte Marketingplattform für das Management von Publikationen, das Versenden von Kampagnen, das Tracking und die Automatisierung von Lebenszykluskommunikationen.",
"Add or Update Subscriber": "Abonnent hinzufügen oder aktualisieren",
"Add Note to Subscriber": "Notiz zum Abonnenten hinzufügen",
"Add Subscriber to Tag": "Abonnent zum Tag hinzufügen",
"Remove Subscriber from Tag": "Abonnent vom Tag entfernen",
"Update Member in an Audience (List)": "Mitglied in einer Zielgruppe aktualisieren (Listen)",
"Create Campaign": "Kampagne erstellen",
"Get Campaign Report": "Kampagnenbericht abrufen",
"Create Audience": "Publikum erstellen",
"Archive Subscriber": "Abonnent archivieren",
"Unsubscribe Email": "E-Mail abbestellen",
"Find Campaign": "Kampagne suchen",
"Find Customer": "Kunde finden",
"Find Tag": "Such-Tag",
"Find Subscriber": "Abonnent finden",
"Add a new subscriber to an audience or update existing subscriber": "Neuen Abonnenten hinzufügen oder bestehenden Abonnenten aktualisieren",
"Add a note to a subscriber in your Mailchimp audience.": "Fügen Sie einem Abonnenten eine Notiz in Ihrem Mailchimp Publikum hinzu.",
"Add a subscriber to a specific tag in your Mailchimp audience.": "Fügen Sie einen Abonnenten zu einem bestimmten Tag in Ihrem Mailchimp Publikum hinzu.",
"Remove a subscriber from a specific tag in your Mailchimp audience.": "Entfernen Sie einen Abonnenten von einem bestimmten Tag in Ihrem Mailchimp Publikum.",
"Update a member in an existing Mailchimp audience (list)": "Aktualisiere ein Mitglied in einem bestehenden Mailchimp Publikum (Liste)",
"Create a new Mailchimp campaign": "Neue Mailchimp Kampagne erstellen",
"Get comprehensive report details for a specific sent campaign including opens, clicks, bounces, and performance metrics": "Erhalten Sie umfassende Berichtsdetails für eine bestimmte Kampagne, einschließlich Öffnungen, Klicks, Bounces und Performance-Metriken",
"Create a new audience (list) in your Mailchimp account": "Erstellen Sie ein neues Publikum (Liste) in Ihrem Mailchimp-Konto",
"Archive an existing audience member": "Archiviere ein bestehendes Publikumsmitglied",
"Unsubscribe an email address from an audience": "Eine E-Mail-Adresse von einem Publikum abbestellen",
"Search all campaigns for the specified query terms": "Alle Kampagnen nach den angegebenen Abfragewörtern durchsuchen",
"Find a customer by email address in a store": "Kunden per E-Mail in einem Shop finden",
"Search for tags on a list by name": "Nach Tags auf einer Liste nach Namen suchen",
"Search for subscribers across all lists or within a specific list. This action provides comprehensive subscriber information including merge fields, interests, and activity data.": "Suchen Sie nach Abonnenten über alle Listen oder innerhalb einer bestimmten Liste. Diese Aktion bietet umfassende Informationen für Abonnenten einschließlich Merge-Felder, Interessen und Aktivitätsdaten.",
"Audience": "Zielgruppe",
"Email Address": "E-Mail-Adresse",
"Status if New": "Status wenn neu",
"Email Type": "E-Mail-Typ",
"Status": "Status",
"First Name": "Vorname",
"Last Name": "Nachname",
"Language": "Sprache",
"VIP": "VIP",
"Skip Merge Validation": "Merge Validierung überspringen",
"Note Content": "Notiz Inhalt",
"Tag Name": "Tag-Name",
"Email": "E-Mail",
"Campaign Type": "Kampagnentyp",
"Subject Line": "Betreffzeile",
"Campaign Title": "Kampagnentitel",
"From Name": "Absendername",
"From Email": "Absender-E-Mail",
"Reply To Email": "Antwort an E-Mail",
"To Name": "An Name",
"Content Type": "Inhaltstyp",
"Content URL": "Inhalts-URL",
"Template ID": "Template-ID",
"HTML Content": "HTML-Inhalt",
"Campaign": "Kampagne",
"Include Fields": "Felder einschließen",
"Exclude Fields": "Felder ausschließen",
"List Name": "Listenname",
"Company": "Firma",
"Address Line 1": "Adresszeile 1",
"Address Line 2": "Adresszeile 2",
"City": "Stadt",
"State/Province": "Bundesland/Provinz",
"ZIP/Postal Code": "Postleitzahl",
"Country": "Land",
"Phone": "Telefon",
"Permission Reminder": "Berechtigungs-Erinnerung",
"Default From Name": "Standard Absendername",
"Default From Email": "Standard Absender E-Mail",
"Default Subject": "Standard Betreff",
"Email Type Option": "E-Mail-Typ-Option",
"Use Archive Bar": "Archivleiste verwenden",
"Notify on Subscribe": "Benachrichtigung bei Abonnieren",
"Notify on Unsubscribe": "Bei Abmeldung benachrichtigen",
"Double Opt-in": "Doppel-Opt-In",
"Marketing Permissions": "Marketing-Berechtigungen",
"Subscriber Hash or Email": "Abonnenten-Hash oder E-Mail",
"Skip Duplicate Check": "Doppelte Prüfung überspringen",
"Update Existing": "Bestehende aktualisieren",
"Search Query": "Suchanfrage",
"Fields": "Felder",
"Store": "Shop",
"Count": "Anzahl",
"Offset": "Versatz",
"Audience you want to add the contact to": "Zielgruppe, zu der Sie den Kontakt hinzufügen möchten",
"Email address for the subscriber": "E-Mail-Adresse für den Abonnenten",
"Status for new subscribers": "Status für neue Abonnenten",
"Type of email this member wants to receive": "Art der E-Mail, die dieses Mitglied erhalten möchte",
"Current status of subscriber (for updates)": "Aktueller Status des Abonnenten (für Updates)",
"First name of the subscriber": "Vorname des Abonnenten",
"Last name of the subscriber": "Nachname des Abonnenten",
"Subscriber language (e.g., \"en\", \"es\", \"fr\")": "Abonnentensprache (z.B. \"en\", \"es\", \"fr\")",
"VIP status for subscriber": "VIP Status für Abonnenten",
"Accept member data without merge field values even if required": "Akzeptieren Sie Mitgliedsdaten auch ohne Merge-Feldwerte, wenn erforderlich",
"The email address of the subscriber to add a note to": "Die E-Mail-Adresse des Abonnenten zum Hinzufügen einer Notiz",
"The note content to add to the subscriber": "Der Inhalt der Notiz zum Abonnenten",
"The email address of the subscriber to add to the tag": "Die E-Mail-Adresse des Abonnenten, der zum Tag hinzugefügt werden soll",
"The name of the tag to add the subscriber to": "Der Name des Tags, dem der Abonnent hinzugefügt werden soll",
"The email address of the subscriber to remove from the tag": "Die E-Mail-Adresse des zu entfernenden Abonnenten",
"The name of the tag to remove the subscriber from": "Der Name des Tags, von dem der Abonnent entfernt wird",
"Email of the new contact": "E-Mail des neuen Kontakts",
"The type of campaign to create": "Die Art der Kampagne zu erstellen",
"The subject line for the campaign": "Betreffzeile für die Kampagne",
"The title of the campaign": "Der Titel der Kampagne",
"The name that will appear in the \"From\" field": "Der Name, der im Feld \"Von\" angezeigt wird",
"The email address that will appear in the \"From\" field": "Die E-Mail-Adresse, die im Feld \"Von\" angezeigt wird",
"The email address that will receive replies": "Die E-Mail-Adresse, die Antworten erhalten wird",
"The name that will appear in the \"To\" field (e.g., *|FNAME|*)": "Der Name, der im Feld \"An\" angezeigt wird (z.B. *|FNAME|*)",
"How the campaign content is put together": "Wie der Kampagneninhalt zusammengestellt wird",
"The URL where the campaign content is hosted (required if content_type is \"url\")": "Die URL, auf der der Inhalt der Kampagne gehostet wird (erforderlich, wenn content_type \"url\")",
"The ID of the template to use (required if content_type is \"template\")": "Die ID der zu verwendenden Vorlage (erforderlich, wenn content_type \"template\")",
"The HTML content for the campaign (required if content_type is \"html\")": "Der HTML-Inhalt für die Kampagne (erforderlich, wenn content_type \"html\")",
"Select the campaign to get information for": "Wählen Sie die Kampagne, um Informationen zu erhalten",
"Comma-separated list of fields to return (e.g., \"opens.unique_opens,clicks.click_rate\")": "Komma-getrennte Liste von zurückzugebenden Feldern (z.B. \"opens.unique_opens,clicks.click_rate\")",
"Comma-separated list of fields to exclude (e.g., \"timeseries,_links\")": "Kommaseparierte Liste von auszuschließenden Feldern (z.B. \"Timeseries,_links\")",
"The name of the list": "Der Name der Liste",
"Company name for list contact information": "Firmenname für Kontaktinformationen",
"Street address for list contact information": "Adresse für Kontaktinformationen der Liste",
"Additional address information (optional)": "Zusätzliche Adressinformationen (optional)",
"City for list contact information": "Stadt für Kontaktinformationen",
"State or province for list contact information": "Bundesland oder Provinz für Kontaktinformationen",
"ZIP or postal code for list contact information": "Postleitzahl oder Postleitzahl für Kontaktinformationen",
"Country for list contact information": "Land für Kontaktinformationen der Liste",
"Phone number for list contact information (optional)": "Telefonnummer für Kontaktinformationen der Liste (optional)",
"The permission reminder for the list": "Die Berechtigungs-Erinnerung für die Liste",
"Default from name for campaigns": "Standard von Name für Kampagnen",
"Default from email address for campaigns": "Standard von E-Mail-Adresse für Kampagnen",
"Default subject line for campaigns": "Standard-Betreffzeile für Kampagnen",
"Default language for campaigns (e.g., \"en\", \"es\", \"fr\")": "Standardsprache für Kampagnen (z.B. \"en\", \"es\", \"fr\")",
"Whether the list supports multiple email formats (HTML/plain text)": "Ob die Liste mehrere E-Mail-Formate unterstützt (HTML/plain Text)",
"Whether campaigns use the Archive Bar in archives by default": "Ob Kampagnen die Archivleiste standardmäßig in Archiven verwenden",
"Email address to send subscribe notifications to (optional)": "E-Mail-Adresse, an die Benachrichtigungen gesendet werden sollen (optional)",
"Email address to send unsubscribe notifications to (optional)": "E-Mail-Adresse zum Senden von Benachrichtigungen für Abmeldung (optional)",
"Whether to require subscriber confirmation via email": "Gibt an, ob die Abonnenten-Bestätigung per E-Mail erforderlich ist",
"Whether the list has marketing permissions (GDPR) enabled": "Ob die Liste die Marketing-Berechtigungen (GDPR) aktiviert hat",
"MD5 hash of the lowercase email address, email address, or contact_id": "MD5-Hash der Kleinbuchstaben, E-Mail-Adresse oder contact_id",
"Email address to unsubscribe": "E-Mail-Adresse zum Abbestellen",
"Ignore duplicates in the request": "Duplikate in der Anfrage ignorieren",
"Change existing members subscription status": "Status bestehender Mitglieder ändern",
"Search terms to find campaigns": "Suchbegriffe für Kampagnen suchen",
"Comma-separated list of fields to return": "Kommaseparierte Liste von zurückzugebenden Feldern",
"Comma-separated list of fields to exclude": "Kommaseparierte Liste von Feldern, die ausgeschlossen werden sollen",
"Select the e-commerce store": "E-Commerce-Store auswählen",
"Email address to search for": "Zu suchende E-Mail-Adresse",
"Number of records to return (max 1000)": "Anzahl der zurückzugebenden Datensätze (max. 1000)",
"Number of records to skip for pagination": "Anzahl der zu überspringenden Datensätze für die Seiteneinstellung",
"Search query to filter tags (optional - if empty, returns all tags)": "Suchabfrage nach Tags filtern (optional - wenn leer, gibt alle Tags zurück)",
"Email address of the subscriber to search for": "E-Mail-Adresse des zu suchenden Abonnenten",
"Fields to include in the response (leave empty for all fields). Use dot notation for nested fields (e.g., \"merge_fields.FNAME\")": "Felder die in der Antwort enthalten sind (leer lassen für alle Felder). Verwenden Sie Punktnotation für verschachtelte Felder (z.B. \"merge_fields.FNAME\")",
"Fields to exclude from the response. Use dot notation for nested fields": "Felder die von der Antwort ausgeschlossen werden sollen. Verwenden Sie Punktnotation für verschachtelte Felder",
"Subscribed": "Abonniert",
"Unsubscribed": "Abgemeldet",
"Cleaned": "Bereinigt",
"Pending": "Ausstehend",
"Transactional": "Transaktion",
"HTML": "HTML",
"Text": "Text",
"Regular": "Normal",
"Plain Text": "Einfacher Text",
"A/B Test": "A/B-Test",
"RSS": "RSS",
"Variate": "Variieren",
"Template": "Vorlage",
"URL": "URL",
"Multichannel": "Mehrkanal",
"Member Subscribed to Audience": "Mitglied für Publikum abonniert",
"Member Unsubscribed from Audience": "Mitglied von Publikum abgemeldet",
"New Campaign": "Neue Kampagne",
"Link Clicked": "Link geklickt",
"Email Opened": "E-Mail geöffnet",
"Subscriber Updated": "Abonnent aktualisiert",
"New Customer": "Neuer Kunde",
"New Order": "Neue Bestellung",
"New Segment Tag Subscriber": "Neuer Segmenttag Abonnent",
"Fires when a new subscriber joins your Mailchimp audience. This trigger captures new subscriptions, opt-ins, and audience growth events with comprehensive subscriber information.": "Feuert ab, wenn ein neuer Abonnent Ihrem Mailchimp Publikum beitritt. Dies löst neue Abonnements, Opt-Ins und Publikumswachstum mit umfassenden Informationen auf.",
"Fires when a subscriber unsubscribes from your Mailchimp audience. This trigger captures unsubscribe events, opt-outs, and audience churn with comprehensive subscriber information for retention analysis.": "Löscht ab, wenn sich ein Abonnent von Ihrem Mailchimp Publikum abmeldet. Dies löst Abmeldungen, Opt-outs und ein Publikum mit umfassenden Abonnenteninformationen zur Speicherung auf.",
"Fires when a new campaign is created or sent": "Feuer wenn eine neue Kampagne erstellt oder gesendet wird",
"Fires when a recipient clicks a specified link in a campaign": "Löst ab, wenn ein Empfänger einen bestimmten Link in einer Kampagne klickt",
"Fires when a recipient opens a an email in a specific campaign": "Löst ab, wenn ein Empfänger eine E-Mail in einer bestimmten Kampagne öffnet",
"Fires when a subscriber profile is updated, including changes to merge fields, interests, or contact information. This trigger captures profile updates, new subscriptions, and subscriber modifications.": "Feuert ab, wenn ein Teilnehmerprofil aktualisiert wird, einschließlich Änderungen in Verbindung mit Feldern, Interessen oder Kontaktinformationen. Dieser Auslöser erfasst Profilaktualisierungen, neue Abonnements und Abonnentenänderungen.",
"Fires when a new customer is added to a connected store": "Feuert ab, wenn ein neuer Kunde einem verbundenen Shop hinzugefügt wird",
"Fires when a new order is created in the connected store": "Feuert ab, wenn eine neue Bestellung im verbundenen Shop erstellt wird",
"Fires when a subscriber joins a specific segment or tag": "Feuert ab, wenn ein Abonnent einem bestimmten Segment oder Tag beitritt",
"Segment ID (Optional)": "Segment-ID (optional)",
"Tag Name (Optional)": "Tag-Name (optional)",
"The specific segment ID to monitor. Leave empty to monitor all segments.": "Die zu überwachende spezifische Segmentnummer. Leer lassen, um alle Segmente zu überwachen.",
"The specific tag name to monitor. Leave empty to monitor all tags.": "Der zu überwachende Tag-Name. Leer lassen, um alle Tags zu überwachen."
}

View File

@@ -0,0 +1,188 @@
{
"All-in-One integrated marketing platform for managing audiences, sending campaigns, tracking engagement, and automating lifecycle communications.": "Plataforma integrada de marketing todo en uno para la gestión de audiencias, el envío de campañas, el seguimiento del compromiso y la automatización del ciclo de vida.",
"Add or Update Subscriber": "Añadir o actualizar suscriptores",
"Add Note to Subscriber": "Añadir nota al suscriptor",
"Add Subscriber to Tag": "Añadir suscriptor a la etiqueta",
"Remove Subscriber from Tag": "Eliminar suscriptor de la etiqueta",
"Update Member in an Audience (List)": "Actualizar miembro en una lista",
"Create Campaign": "Crear Campaña",
"Get Campaign Report": "Obtener informe de campaña",
"Create Audience": "Crear Audiencia",
"Archive Subscriber": "Archivar suscriptor",
"Unsubscribe Email": "Desuscribirse Email",
"Find Campaign": "Buscar campaña",
"Find Customer": "Buscar cliente",
"Find Tag": "Buscar Etiqueta",
"Find Subscriber": "Buscar suscriptores",
"Add a new subscriber to an audience or update existing subscriber": "Añadir un nuevo suscriptor a un público o actualizar el suscriptor existente",
"Add a note to a subscriber in your Mailchimp audience.": "Añade una nota a un suscriptor en tu audiencia de correo electrónico.",
"Add a subscriber to a specific tag in your Mailchimp audience.": "Añade un suscriptor a una etiqueta específica en tu audiencia de correo electrónico.",
"Remove a subscriber from a specific tag in your Mailchimp audience.": "Elimina un suscriptor de una etiqueta específica en tu audiencia de correo.",
"Update a member in an existing Mailchimp audience (list)": "Actualizar un miembro en una audiencia de correo existente (lista)",
"Create a new Mailchimp campaign": "Crear una nueva campaña de correo electrónico",
"Get comprehensive report details for a specific sent campaign including opens, clicks, bounces, and performance metrics": "Obtener detalles completos del informe para una campaña enviada específica, incluyendo aperturas, clics, rebotes y métricas de rendimiento",
"Create a new audience (list) in your Mailchimp account": "Crea una nueva audiencia (lista) en tu cuenta de correo electrónico",
"Archive an existing audience member": "Archivar un público existente",
"Unsubscribe an email address from an audience": "Darse de baja de una dirección de correo electrónico a un público",
"Search all campaigns for the specified query terms": "Buscar en todas las campañas los términos de consulta especificados",
"Find a customer by email address in a store": "Encontrar un cliente por correo electrónico en una tienda",
"Search for tags on a list by name": "Buscar etiquetas en una lista por nombre",
"Search for subscribers across all lists or within a specific list. This action provides comprehensive subscriber information including merge fields, interests, and activity data.": "Buscar suscriptores en todas las listas o dentro de una lista específica. Esta acción proporciona información completa de suscriptores, incluyendo campos de fusión, intereses y datos de actividad.",
"Audience": "Público",
"Email Address": "Dirección de email",
"Status if New": "Estado si nuevo",
"Email Type": "Tipo de Email",
"Status": "Estado",
"First Name": "Nombre",
"Last Name": "Apellido",
"Language": "Idioma",
"VIP": "VIP",
"Skip Merge Validation": "Omitir validación de fusión",
"Note Content": "Contenido de Nota",
"Tag Name": "Nombre de la etiqueta",
"Email": "E-mail",
"Campaign Type": "Tipo de Campaña",
"Subject Line": "Línea del asunto",
"Campaign Title": "Título de la campaña",
"From Name": "De nombre",
"From Email": "Desde Email",
"Reply To Email": "Responder al email",
"To Name": "A nombre",
"Content Type": "Tipo de contenido",
"Content URL": "URL de contenido",
"Template ID": "ID de plantilla",
"HTML Content": "Contenido HTML",
"Campaign": "Campaña",
"Include Fields": "Incluye campos",
"Exclude Fields": "Excluir campos",
"List Name": "Nombre de lista",
"Company": "Empresa",
"Address Line 1": "Dirección línea 1",
"Address Line 2": "Dirección línea 2",
"City": "Ciudad",
"State/Province": "Estado/Provenza",
"ZIP/Postal Code": "Código postal",
"Country": "País",
"Phone": "Teléfono",
"Permission Reminder": "Recordatorio de permisos",
"Default From Name": "Nombre por defecto",
"Default From Email": "Correo predeterminado",
"Default Subject": "Asunto por defecto",
"Email Type Option": "Opción de tipo de email",
"Use Archive Bar": "Usar barra de archivo",
"Notify on Subscribe": "Notificar al suscribirse",
"Notify on Unsubscribe": "Notificar al darse de baja",
"Double Opt-in": "Doble opción",
"Marketing Permissions": "Permisos de marketing",
"Subscriber Hash or Email": "Suscriptor Hash o Email",
"Skip Duplicate Check": "Saltar verificación duplicada",
"Update Existing": "Actualizar existente",
"Search Query": "Buscar consulta",
"Fields": "Campos",
"Store": "Tienda",
"Count": "Contador",
"Offset": "Desplazamiento",
"Audience you want to add the contact to": "Audiencia a la que quieres añadir el contacto",
"Email address for the subscriber": "Dirección de correo para el suscriptor",
"Status for new subscribers": "Estado de los nuevos suscriptores",
"Type of email this member wants to receive": "Tipo de correo electrónico que este miembro desea recibir",
"Current status of subscriber (for updates)": "Estado actual del suscriptor (para actualizaciones)",
"First name of the subscriber": "Nombre del suscriptor",
"Last name of the subscriber": "Apellido del suscriptor",
"Subscriber language (e.g., \"en\", \"es\", \"fr\")": "Idioma del suscriptor (por ej., \"es\", \"es\", \"fr\")",
"VIP status for subscriber": "Estado VIP del suscriptor",
"Accept member data without merge field values even if required": "Aceptar datos de miembros sin valores de campos de fusión incluso si es requerido",
"The email address of the subscriber to add a note to": "La dirección de correo electrónico del suscriptor a la que agregar una nota",
"The note content to add to the subscriber": "El contenido de la nota a añadir al suscriptor",
"The email address of the subscriber to add to the tag": "La dirección de correo electrónico del suscriptor a añadir a la etiqueta",
"The name of the tag to add the subscriber to": "El nombre de la etiqueta a la que agregar el suscriptor",
"The email address of the subscriber to remove from the tag": "La dirección de correo electrónico del suscriptor a eliminar de la etiqueta",
"The name of the tag to remove the subscriber from": "El nombre de la etiqueta de la que eliminar el suscriptor",
"Email of the new contact": "Email del nuevo contacto",
"The type of campaign to create": "El tipo de campaña a crear",
"The subject line for the campaign": "La línea del tema para la campaña",
"The title of the campaign": "El título de la campaña",
"The name that will appear in the \"From\" field": "El nombre que aparecerá en el campo \"De\"",
"The email address that will appear in the \"From\" field": "La dirección de correo electrónico que aparecerá en el campo \"De\"",
"The email address that will receive replies": "La dirección de correo electrónico que recibirá respuestas",
"The name that will appear in the \"To\" field (e.g., *|FNAME|*)": "El nombre que aparecerá en el campo \"A\" (por ejemplo, *|FNAME|*)",
"How the campaign content is put together": "Cómo se reúne el contenido de la campaña",
"The URL where the campaign content is hosted (required if content_type is \"url\")": "La URL donde está alojado el contenido de la campaña (obligatorio si content_type es \"url\")",
"The ID of the template to use (required if content_type is \"template\")": "El ID de la plantilla a usar (obligatorio si content_type es \"plantilla\")",
"The HTML content for the campaign (required if content_type is \"html\")": "El contenido HTML para la campaña (obligatorio si content_type es \"html\")",
"Select the campaign to get information for": "Seleccione la campaña para obtener información de",
"Comma-separated list of fields to return (e.g., \"opens.unique_opens,clicks.click_rate\")": "Lista separada por comas de campos a devolver (por ejemplo, \"opens.unique_opens,clicks.click_rate\")",
"Comma-separated list of fields to exclude (e.g., \"timeseries,_links\")": "Lista separada por comas de campos a excluir (por ejemplo, \"timeseries,_links\")",
"The name of the list": "El nombre de la lista",
"Company name for list contact information": "Nombre de la empresa para la lista de contactos",
"Street address for list contact information": "Dirección de la lista de contactos",
"Additional address information (optional)": "Información de dirección adicional (opcional)",
"City for list contact information": "Ciudad para la lista de datos de contacto",
"State or province for list contact information": "Estado o provincia para la lista de datos de contacto",
"ZIP or postal code for list contact information": "Código postal para la lista de contactos",
"Country for list contact information": "País para la lista de datos de contacto",
"Phone number for list contact information (optional)": "Número de teléfono para la información de contacto de la lista (opcional)",
"The permission reminder for the list": "El recordatorio de permisos para la lista",
"Default from name for campaigns": "Nombre predeterminado para campañas",
"Default from email address for campaigns": "Dirección de correo electrónico predeterminada para campañas",
"Default subject line for campaigns": "Línea de asunto predeterminada para campañas",
"Default language for campaigns (e.g., \"en\", \"es\", \"fr\")": "Idioma predeterminado para las campañas (por ejemplo, \"es\", \"es\", \"fr\")",
"Whether the list supports multiple email formats (HTML/plain text)": "Si la lista soporta varios formatos de correo electrónico (HTML/texto plano)",
"Whether campaigns use the Archive Bar in archives by default": "Si las campañas utilizan la barra de archivos por defecto",
"Email address to send subscribe notifications to (optional)": "Dirección de correo electrónico a la que enviar notificaciones de suscripción (opcional)",
"Email address to send unsubscribe notifications to (optional)": "Dirección de correo electrónico a la que enviar notificaciones de cancelación (opcional)",
"Whether to require subscriber confirmation via email": "Si requerir confirmación del suscriptor por correo electrónico",
"Whether the list has marketing permissions (GDPR) enabled": "Si la lista tiene permisos de marketing (GDPR) habilitados",
"MD5 hash of the lowercase email address, email address, or contact_id": "Hashh MD5 de la dirección de correo en minúsculas, dirección de correo electrónico o contact_id",
"Email address to unsubscribe": "Dirección de correo electrónico para darse de baja",
"Ignore duplicates in the request": "Ignorar duplicados en la solicitud",
"Change existing members subscription status": "Cambiar el estado de suscripción de miembros existentes",
"Search terms to find campaigns": "Buscar términos para encontrar campañas",
"Comma-separated list of fields to return": "Lista separada por comas de campos a devolver",
"Comma-separated list of fields to exclude": "Lista separada por comas de campos a excluir",
"Select the e-commerce store": "Seleccione la tienda de e-commerce",
"Email address to search for": "Dirección de correo para buscar",
"Number of records to return (max 1000)": "Número de registros a devolver (máx. 1000)",
"Number of records to skip for pagination": "Número de registros a omitir para la paginación",
"Search query to filter tags (optional - if empty, returns all tags)": "Búsqueda de etiquetas para filtrar (opcional - si está vacío, devuelve todas las etiquetas)",
"Email address of the subscriber to search for": "Dirección de correo electrónico del suscriptor para buscar",
"Fields to include in the response (leave empty for all fields). Use dot notation for nested fields (e.g., \"merge_fields.FNAME\")": "Campos a incluir en la respuesta (dejar vacío para todos los campos). Use notación de puntos para campos anidados (por ejemplo, \"merge_fields.FNAME\")",
"Fields to exclude from the response. Use dot notation for nested fields": "Campos a excluir de la respuesta. Usar notación de puntos para campos anidados",
"Subscribed": "Suscrito",
"Unsubscribed": "Desuscrito",
"Cleaned": "Limpiado",
"Pending": "Pendiente",
"Transactional": "Transaccional",
"HTML": "HTML",
"Text": "Texto",
"Regular": "Regular",
"Plain Text": "Texto simple",
"A/B Test": "Prueba A/B",
"RSS": "RSS",
"Variate": "Variar",
"Template": "Plantilla",
"URL": "URL",
"Multichannel": "Multicanal",
"Member Subscribed to Audience": "Miembro suscrito al público",
"Member Unsubscribed from Audience": "Miembro desuscrito del público",
"New Campaign": "Nueva Campaña",
"Link Clicked": "Enlace pulsado",
"Email Opened": "Email abierto",
"Subscriber Updated": "Suscriptor actualizado",
"New Customer": "Nuevo cliente",
"New Order": "Nuevo pedido",
"New Segment Tag Subscriber": "Nuevo suscriptor de etiqueta de segmento",
"Fires when a new subscriber joins your Mailchimp audience. This trigger captures new subscriptions, opt-ins, and audience growth events with comprehensive subscriber information.": "Dispara cuando un nuevo suscriptor se une a tu audiencia de Mail-p. Esto activa la captura de nuevas suscripciones, opt-ins y eventos de crecimiento del público con información completa de suscriptores.",
"Fires when a subscriber unsubscribes from your Mailchimp audience. This trigger captures unsubscribe events, opt-outs, and audience churn with comprehensive subscriber information for retention analysis.": "Dispara cuando un suscriptor se quita de la audiencia de Mail-p. Esto activa la captura eventos de desuscripción, opt-outs, y el público desnudo con información completa del suscriptor para el análisis de retención.",
"Fires when a new campaign is created or sent": "Dispara cuando se crea o envía una nueva campaña",
"Fires when a recipient clicks a specified link in a campaign": "Dispara cuando un destinatario hace clic en un enlace especificado en una campaña",
"Fires when a recipient opens a an email in a specific campaign": "Dispara cuando un destinatario abre un correo electrónico en una campaña específica",
"Fires when a subscriber profile is updated, including changes to merge fields, interests, or contact information. This trigger captures profile updates, new subscriptions, and subscriber modifications.": "Dispara cuando un perfil de suscriptor es actualizado, incluyendo cambios en campos de fusión, intereses o información de contacto. Este disparador captura actualizaciones de perfil, nuevas suscripciones y modificaciones de suscriptores.",
"Fires when a new customer is added to a connected store": "Dispara cuando un nuevo cliente se agrega a una tienda conectada",
"Fires when a new order is created in the connected store": "Dispara cuando se crea un nuevo pedido en la tienda conectada",
"Fires when a subscriber joins a specific segment or tag": "Dispara cuando un suscriptor se une a un segmento o etiqueta específicos",
"Segment ID (Optional)": "ID del segmento (opcional)",
"Tag Name (Optional)": "Nombre de la etiqueta (opcional)",
"The specific segment ID to monitor. Leave empty to monitor all segments.": "El ID de segmento específico para monitor. Dejar en blanco para monitorizar todos los segmentos.",
"The specific tag name to monitor. Leave empty to monitor all tags.": "El nombre de etiqueta específico para monitor. Dejar en blanco para monitorear todas las etiquetas."
}

View File

@@ -0,0 +1,188 @@
{
"All-in-One integrated marketing platform for managing audiences, sending campaigns, tracking engagement, and automating lifecycle communications.": "Plateforme de marketing intégrée tout-en-un pour la gestion des auditoires, l'envoi de campagnes, l'engagement de suivi et l'automatisation des communications de cycle de vie.",
"Add or Update Subscriber": "Ajouter ou mettre à jour l'abonné",
"Add Note to Subscriber": "Ajouter une note à l'abonné",
"Add Subscriber to Tag": "Ajouter un abonné au tag",
"Remove Subscriber from Tag": "Retirer l'abonné du tag",
"Update Member in an Audience (List)": "Mettre à jour le membre dans un public (List)",
"Create Campaign": "Créer une campagne",
"Get Campaign Report": "Obtenir le rapport de la campagne",
"Create Audience": "Créer un public",
"Archive Subscriber": "Archiver l'abonné",
"Unsubscribe Email": "Se désabonner de l'e-mail",
"Find Campaign": "Trouver une campagne",
"Find Customer": "Trouver le client",
"Find Tag": "Trouver un Tag",
"Find Subscriber": "Trouver un abonné",
"Add a new subscriber to an audience or update existing subscriber": "Ajouter un nouvel abonné à un public ou mettre à jour un abonné existant",
"Add a note to a subscriber in your Mailchimp audience.": "Ajoutez une note à un abonné dans votre auditoire Mailchimp.",
"Add a subscriber to a specific tag in your Mailchimp audience.": "Ajoutez un abonné à un tag spécifique dans votre auditoire Mailchimp.",
"Remove a subscriber from a specific tag in your Mailchimp audience.": "Retirez un abonné d'un tag spécifique dans votre auditoire Mailchimp.",
"Update a member in an existing Mailchimp audience (list)": "Mettre à jour un membre dans un public Mailchimp existant (liste)",
"Create a new Mailchimp campaign": "Créer une nouvelle campagne Mailchimp",
"Get comprehensive report details for a specific sent campaign including opens, clicks, bounces, and performance metrics": "Obtenez des détails détaillés sur le rapport d'une campagne envoyée spécifique, y compris les ouvertures, les clics, les rebonds et les indicateurs de performance",
"Create a new audience (list) in your Mailchimp account": "Créer un nouveau public (liste) dans votre compte Mailchimp",
"Archive an existing audience member": "Archiver un membre du public existant",
"Unsubscribe an email address from an audience": "Désabonner une adresse e-mail d'un public",
"Search all campaigns for the specified query terms": "Rechercher dans toutes les campagnes les termes de la requête spécifiés",
"Find a customer by email address in a store": "Trouver un client par adresse e-mail dans un magasin",
"Search for tags on a list by name": "Rechercher des tags sur une liste par nom",
"Search for subscribers across all lists or within a specific list. This action provides comprehensive subscriber information including merge fields, interests, and activity data.": "Rechercher des abonnés sur toutes les listes ou dans une liste spécifique. Cette action fournit des informations complètes sur les abonnés, y compris les champs de fusion, les intérêts et les données d'activité.",
"Audience": "Audience",
"Email Address": "Adresse e-mail",
"Status if New": "Statut si nouveau",
"Email Type": "Type d'email",
"Status": "Statut",
"First Name": "First Name",
"Last Name": "Last Name",
"Language": "Langue",
"VIP": "Vip",
"Skip Merge Validation": "Ignorer la validation de fusion",
"Note Content": "Contenu de la note",
"Tag Name": "Nom de l'étiquette",
"Email": "Courriel",
"Campaign Type": "Type de campagne",
"Subject Line": "Ligne de sujet",
"Campaign Title": "Titre de la campagne",
"From Name": "De nom",
"From Email": "De l'E-mail",
"Reply To Email": "Répondre à l'e-mail",
"To Name": "À nommer",
"Content Type": "Type de contenu",
"Content URL": "URL du contenu",
"Template ID": "ID du modèle",
"HTML Content": "Contenu HTML",
"Campaign": "Campagnes",
"Include Fields": "Inclure les champs",
"Exclude Fields": "Exclure les champs",
"List Name": "Nom de la liste",
"Company": "Entreprise",
"Address Line 1": "Adresse ligne 1",
"Address Line 2": "Adresse ligne 2",
"City": "Ville",
"State/Province": "État/Province",
"ZIP/Postal Code": "Code postal",
"Country": "Pays",
"Phone": "Téléphone",
"Permission Reminder": "Rappel d'autorisation",
"Default From Name": "Nom d'expéditeur par défaut",
"Default From Email": "Courriel de l'expéditeur par défaut",
"Default Subject": "Sujet par défaut",
"Email Type Option": "Option du type d'e-mail",
"Use Archive Bar": "Utiliser la barre d'archives",
"Notify on Subscribe": "Notifier lors de l'abonnement",
"Notify on Unsubscribe": "Notifier en cas de désinscription",
"Double Opt-in": "Double Opt-in",
"Marketing Permissions": "Autorisations de marketing",
"Subscriber Hash or Email": "Hachage ou e-mail de l'abonné",
"Skip Duplicate Check": "Ignorer la vérification en double",
"Update Existing": "Mise à jour existante",
"Search Query": "Requête de recherche",
"Fields": "Champs",
"Store": "Magasin",
"Count": "Count",
"Offset": "Décalage",
"Audience you want to add the contact to": "Audience à laquelle vous souhaitez ajouter le contact",
"Email address for the subscriber": "Adresse e-mail de l'abonné",
"Status for new subscribers": "Statut des nouveaux abonnés",
"Type of email this member wants to receive": "Type d'e-mail que ce membre souhaite recevoir",
"Current status of subscriber (for updates)": "Statut actuel de l'abonné (pour les mises à jour)",
"First name of the subscriber": "Prénom de l'abonné",
"Last name of the subscriber": "Nom de famille du destinataire",
"Subscriber language (e.g., \"en\", \"es\", \"fr\")": "Langue de l'abonné (par exemple, \"fr\", \"en\", \"es\", \"fr\")",
"VIP status for subscriber": "Statut VIP pour l'abonné",
"Accept member data without merge field values even if required": "Accepter les données des membres sans les valeurs du champ de fusion même si nécessaire",
"The email address of the subscriber to add a note to": "L'adresse email de l'abonné pour ajouter une note à",
"The note content to add to the subscriber": "Contenu de la note à ajouter à l'abonné",
"The email address of the subscriber to add to the tag": "L'adresse email de l'abonné à ajouter au tag",
"The name of the tag to add the subscriber to": "Le nom du tag à ajouter à l'abonné",
"The email address of the subscriber to remove from the tag": "L'adresse email de l'abonné à supprimer du tag",
"The name of the tag to remove the subscriber from": "Le nom du tag à supprimer de l'abonné",
"Email of the new contact": "E-mail du nouveau contact",
"The type of campaign to create": "Le type de campagne à créer",
"The subject line for the campaign": "La ligne de sujet de la campagne",
"The title of the campaign": "Le titre de la campagne",
"The name that will appear in the \"From\" field": "Le nom qui apparaîtra dans le champ \"De\"",
"The email address that will appear in the \"From\" field": "L'adresse e-mail qui apparaîtra dans le champ \"De\"",
"The email address that will receive replies": "L'adresse e-mail qui recevra les réponses",
"The name that will appear in the \"To\" field (e.g., *|FNAME|*)": "Le nom qui apparaîtra dans le champ \"À\" (par exemple, *|FNAME|*)",
"How the campaign content is put together": "Comment le contenu de la campagne est assemblé",
"The URL where the campaign content is hosted (required if content_type is \"url\")": "L'URL où le contenu de la campagne est hébergé (requis si content_type est \"url\")",
"The ID of the template to use (required if content_type is \"template\")": "L'ID du modèle à utiliser (requis si content_type est \"template\")",
"The HTML content for the campaign (required if content_type is \"html\")": "Le contenu HTML pour la campagne (requis si content_type est \"html\")",
"Select the campaign to get information for": "Sélectionnez la campagne pour obtenir des informations pour",
"Comma-separated list of fields to return (e.g., \"opens.unique_opens,clicks.click_rate\")": "Liste de champs séparés par des virgules à retourner (par exemple, \"opens.unique_opens,clicks.click_rate\")",
"Comma-separated list of fields to exclude (e.g., \"timeseries,_links\")": "Liste de champs séparés par des virgules à exclure (par exemple, \"timeseries,_links\")",
"The name of the list": "Le nom de la liste",
"Company name for list contact information": "Nom de la société pour la liste des coordonnées",
"Street address for list contact information": "Adresse postale pour la liste des coordonnées",
"Additional address information (optional)": "Informations complémentaires sur l'adresse (facultatif)",
"City for list contact information": "Ville pour la liste des coordonnées",
"State or province for list contact information": "État ou province pour la liste des coordonnées",
"ZIP or postal code for list contact information": "ZIP ou code postal pour la liste des coordonnées",
"Country for list contact information": "Pays pour la liste des informations de contact",
"Phone number for list contact information (optional)": "Numéro de téléphone pour la liste des informations de contact (facultatif)",
"The permission reminder for the list": "Rappel de permission pour la liste",
"Default from name for campaigns": "Par défaut du nom pour les campagnes",
"Default from email address for campaigns": "Adresse e-mail par défaut pour les campagnes",
"Default subject line for campaigns": "Sujet par défaut pour les campagnes",
"Default language for campaigns (e.g., \"en\", \"es\", \"fr\")": "Langue par défaut des campagnes (par exemple, \"fr\", \"en\", \"es\", \"fr\")",
"Whether the list supports multiple email formats (HTML/plain text)": "Si la liste prend en charge plusieurs formats d'e-mail (texte HTML/brut)",
"Whether campaigns use the Archive Bar in archives by default": "Si les campagnes utilisent la barre d'archives dans les archives par défaut",
"Email address to send subscribe notifications to (optional)": "Adresse e-mail à laquelle envoyer des notifications d'abonnement (facultatif)",
"Email address to send unsubscribe notifications to (optional)": "Adresse e-mail à laquelle envoyer des notifications de désinscription (facultatif)",
"Whether to require subscriber confirmation via email": "Exiger une confirmation d'abonné par e-mail",
"Whether the list has marketing permissions (GDPR) enabled": "Si la liste a des autorisations de marketing (GDPR) activées",
"MD5 hash of the lowercase email address, email address, or contact_id": "Hachage MD5 de l'adresse email en minuscule, adresse e-mail ou contact_id",
"Email address to unsubscribe": "Adresse e-mail pour vous désabonner",
"Ignore duplicates in the request": "Ignorer les doublons dans la requête",
"Change existing members subscription status": "Modifier le statut d'abonnement des membres existants",
"Search terms to find campaigns": "Rechercher des termes pour trouver des campagnes",
"Comma-separated list of fields to return": "Liste de champs séparés par des virgules à retourner",
"Comma-separated list of fields to exclude": "Liste de champs séparés par des virgules à exclure",
"Select the e-commerce store": "Sélectionnez la boutique e-commerce",
"Email address to search for": "Adresse e-mail à rechercher",
"Number of records to return (max 1000)": "Nombre d'enregistrements à retourner (max 1000)",
"Number of records to skip for pagination": "Nombre d'enregistrements à passer pour la pagination",
"Search query to filter tags (optional - if empty, returns all tags)": "Requête de recherche pour filtrer les balises (facultative - si vide, retourne toutes les balises)",
"Email address of the subscriber to search for": "Adresse e-mail de l'abonné à rechercher",
"Fields to include in the response (leave empty for all fields). Use dot notation for nested fields (e.g., \"merge_fields.FNAME\")": "Champs à inclure dans la réponse (laisser vide pour tous les champs). Utiliser la notation par point pour les champs imbriqués (par exemple, \"merge_fields.FNAME\")",
"Fields to exclude from the response. Use dot notation for nested fields": "Champs à exclure de la réponse. Utiliser la notation par point pour les champs imbriqués",
"Subscribed": "Inscrit",
"Unsubscribed": "Désabonné",
"Cleaned": "Nettoyé",
"Pending": "En attente",
"Transactional": "Transactionnel",
"HTML": "HTML",
"Text": "Texte du texte",
"Regular": "Régulièrement",
"Plain Text": "Texte brut",
"A/B Test": "Test A/B",
"RSS": "Flux RSS",
"Variate": "Variation",
"Template": "Gabarit",
"URL": "URL",
"Multichannel": "Multicanal",
"Member Subscribed to Audience": "Membre abonné à l'audience",
"Member Unsubscribed from Audience": "Membre désabonné de l'audience",
"New Campaign": "Nouvelle Campagne",
"Link Clicked": "Lien cliqué",
"Email Opened": "Courriel ouvert",
"Subscriber Updated": "Abonné mis à jour",
"New Customer": "Nouveau client",
"New Order": "Nouvelle commande",
"New Segment Tag Subscriber": "Abonné à un nouveau segment",
"Fires when a new subscriber joins your Mailchimp audience. This trigger captures new subscriptions, opt-ins, and audience growth events with comprehensive subscriber information.": "Déclenche lorsqu'un nouvel abonné rejoint votre auditoire Mailchimp. Cela permet de capturer de nouveaux abonnements, des opt-ins et des événements de croissance du public avec des informations détaillées sur les abonnés.",
"Fires when a subscriber unsubscribes from your Mailchimp audience. This trigger captures unsubscribe events, opt-outs, and audience churn with comprehensive subscriber information for retention analysis.": "Déclenche lorsqu'un abonné se désabonne de votre auditoire Mailchimp. Ce déclencheur capture les événements de désinscription, les opt-out et le public avec des informations complètes d'abonné pour l'analyse de la rétention.",
"Fires when a new campaign is created or sent": "Tire quand une nouvelle campagne est créée ou envoyée",
"Fires when a recipient clicks a specified link in a campaign": "Se déclenche lorsqu'un destinataire clique sur un lien spécifié dans une campagne",
"Fires when a recipient opens a an email in a specific campaign": "Se déclenche lorsqu'un destinataire ouvre un e-mail dans une campagne spécifique",
"Fires when a subscriber profile is updated, including changes to merge fields, interests, or contact information. This trigger captures profile updates, new subscriptions, and subscriber modifications.": "Déclenche lorsqu'un profil d'abonné est mis à jour, y compris les modifications des champs de fusion, des intérêts ou des informations de contact. Ce déclencheur capture les mises à jour du profil, les nouveaux abonnements et les modifications des abonnés.",
"Fires when a new customer is added to a connected store": "Se déclenche lorsqu'un nouveau client est ajouté à une boutique connectée",
"Fires when a new order is created in the connected store": "Se déclenche lorsqu'une nouvelle commande est créée dans la boutique connectée",
"Fires when a subscriber joins a specific segment or tag": "Se déclenche lorsqu'un abonné rejoint un segment ou un tag spécifique",
"Segment ID (Optional)": "ID du segment (facultatif)",
"Tag Name (Optional)": "Nom de l'étiquette (facultatif)",
"The specific segment ID to monitor. Leave empty to monitor all segments.": "L'ID de segment spécifique à surveiller. Laissez vide pour surveiller tous les segments.",
"The specific tag name to monitor. Leave empty to monitor all tags.": "Le nom du tag spécifique à surveiller. Laissez vide pour surveiller tous les tags."
}

View File

@@ -0,0 +1,37 @@
{
"Mailchimp": "Mailchimp",
"All-in-One integrated marketing platform": "All-in-One integrated marketing platform",
"Add Member to an Audience (List)": "Add Member to an Audience (List)",
"Add Note to Subscriber": "Add Note to Subscriber",
"Add Subscriber to a tag": "Add Subscriber to a tag",
"Remove Subscriber from a tag": "Remove Subscriber from a tag",
"Update Member in an Audience (List)": "Update Member in an Audience (List)",
"Add a member to an existing Mailchimp audience (list)": "Add a member to an existing Mailchimp audience (list)",
"Add a note to a subscriber": "Add a note to a subscriber",
"Adds a subscriber to a tag. This will fail if the user is not subscribed to the audience.": "Adds a subscriber to a tag. This will fail if the user is not subscribed to the audience.",
"Removes a subscriber from a tag": "Removes a subscriber from a tag",
"Update a member in an existing Mailchimp audience (list)": "Update a member in an existing Mailchimp audience (list)",
"First Name": "First Name",
"Last Name": "Last Name",
"Email": "Email",
"Audience": "Audience",
"Status": "Status",
"Note": "Note",
"Tag Name": "Tag Name",
"First name of the new contact": "First name of the new contact",
"Last name of the new contact": "Last name of the new contact",
"Email of the new contact": "Email of the new contact",
"Audience you want to add the contact to": "Audience you want to add the contact to",
"Email of the subscriber": "Email of the subscriber",
"Note to add to the subscriber": "Note to add to the subscriber",
"Tag name to add to the subscriber": "Tag name to add to the subscriber",
"Subscribed": "Subscribed",
"Unsubscribed": "Unsubscribed",
"Cleaned": "Cleaned",
"Pending": "Pending",
"Transactional": "Transactional",
"Member Subscribed to Audience": "Member Subscribed to Audience",
"Member Unsubscribed to Audience": "Member Unsubscribed to Audience",
"Runs when an Audience subscriber is added.": "Runs when an Audience subscriber is added.",
"Runs when a member unsubscribes.": "Runs when a member unsubscribes."
}

View File

@@ -0,0 +1,37 @@
{
"Mailchimp": "Mailchimp",
"All-in-One integrated marketing platform": "All-in-One integrated marketing platform",
"Add Member to an Audience (List)": "Add Member to an Audience (List)",
"Add Note to Subscriber": "Add Note to Subscriber",
"Add Subscriber to a tag": "Add Subscriber to a tag",
"Remove Subscriber from a tag": "Remove Subscriber from a tag",
"Update Member in an Audience (List)": "Update Member in an Audience (List)",
"Add a member to an existing Mailchimp audience (list)": "Add a member to an existing Mailchimp audience (list)",
"Add a note to a subscriber": "Add a note to a subscriber",
"Adds a subscriber to a tag. This will fail if the user is not subscribed to the audience.": "Adds a subscriber to a tag. This will fail if the user is not subscribed to the audience.",
"Removes a subscriber from a tag": "Removes a subscriber from a tag",
"Update a member in an existing Mailchimp audience (list)": "Update a member in an existing Mailchimp audience (list)",
"First Name": "First Name",
"Last Name": "Last Name",
"Email": "Email",
"Audience": "Audience",
"Status": "Status",
"Note": "Note",
"Tag Name": "Tag Name",
"First name of the new contact": "First name of the new contact",
"Last name of the new contact": "Last name of the new contact",
"Email of the new contact": "Email of the new contact",
"Audience you want to add the contact to": "Audience you want to add the contact to",
"Email of the subscriber": "Email of the subscriber",
"Note to add to the subscriber": "Note to add to the subscriber",
"Tag name to add to the subscriber": "Tag name to add to the subscriber",
"Subscribed": "Subscribed",
"Unsubscribed": "Unsubscribed",
"Cleaned": "Cleaned",
"Pending": "Pending",
"Transactional": "Transactional",
"Member Subscribed to Audience": "Member Subscribed to Audience",
"Member Unsubscribed to Audience": "Member Unsubscribed to Audience",
"Runs when an Audience subscriber is added.": "Runs when an Audience subscriber is added.",
"Runs when a member unsubscribes.": "Runs when a member unsubscribes."
}

View File

@@ -0,0 +1,188 @@
{
"All-in-One integrated marketing platform for managing audiences, sending campaigns, tracking engagement, and automating lifecycle communications.": "オーディエンスの管理、キャンペーンの送信、エンゲージメントの追跡、ライフサイクルコミュニケーションの自動化のためのオールインワン統合マーケティングプラットフォーム。",
"Add or Update Subscriber": "購読者を追加または更新",
"Add Note to Subscriber": "購読者にメモを追加",
"Add Subscriber to Tag": "タグに購読者を追加",
"Remove Subscriber from Tag": "タグから購読者を削除",
"Update Member in an Audience (List)": "オーディエンスのメンバーを更新 (リスト)",
"Create Campaign": "キャンペーンを作成",
"Get Campaign Report": "キャンペーンレポートの取得",
"Create Audience": "オーディエンスを作成",
"Archive Subscriber": "購読者をアーカイブする",
"Unsubscribe Email": "Unsubscribe Email",
"Find Campaign": "キャンペーンを検索",
"Find Customer": "顧客検索",
"Find Tag": "タグを検索",
"Find Subscriber": "購読者を検索",
"Add a new subscriber to an audience or update existing subscriber": "購読者に新しい購読者を追加するか、既存の購読者を更新します",
"Add a note to a subscriber in your Mailchimp audience.": "Mailchimpの購読者にメモを追加します。",
"Add a subscriber to a specific tag in your Mailchimp audience.": "Mailchimp オーディエンスの特定のタグに購読者を追加します。",
"Remove a subscriber from a specific tag in your Mailchimp audience.": "Mailchimp オーディエンスの特定のタグから購読者を削除します。",
"Update a member in an existing Mailchimp audience (list)": "既存の Mailchimp オーディエンスのメンバーを更新します (リスト)",
"Create a new Mailchimp campaign": "新しいMailchimpキャンペーンを作成",
"Get comprehensive report details for a specific sent campaign including opens, clicks, bounces, and performance metrics": "開封、クリック、バウンス、パフォーマンス指標など、特定の送信済みキャンペーンの包括的なレポートの詳細を取得します",
"Create a new audience (list) in your Mailchimp account": "Mailchimp アカウントに新しいオーディエンス(リスト)を作成します",
"Archive an existing audience member": "既存のオーディエンスメンバーをアーカイブ",
"Unsubscribe an email address from an audience": "オーディエンスからのメールアドレスの購読を解除する",
"Search all campaigns for the specified query terms": "指定したクエリ用語のすべてのキャンペーンを検索",
"Find a customer by email address in a store": "ストアのメールアドレスで顧客を探す",
"Search for tags on a list by name": "リスト内のタグを名前で検索",
"Search for subscribers across all lists or within a specific list. This action provides comprehensive subscriber information including merge fields, interests, and activity data.": "すべてのリストまたは特定のリスト内のサブスクライバーを検索します。このアクションは、マージ項目、興味、およびアクティビティデータを含む包括的なサブスクライバー情報を提供します。",
"Audience": "オーディエンス:",
"Email Address": "メールアドレス",
"Status if New": "新規の状態",
"Email Type": "メールの種類",
"Status": "ステータス",
"First Name": "名",
"Last Name": "姓",
"Language": "言語",
"VIP": "VIP",
"Skip Merge Validation": "マージ検証をスキップ",
"Note Content": "ノートコンテンツ",
"Tag Name": "タグ名",
"Email": "Eメールアドレス",
"Campaign Type": "キャンペーンタイプ",
"Subject Line": "件名",
"Campaign Title": "キャンペーンタイトル",
"From Name": "差出人名",
"From Email": "差出人メールアドレス",
"Reply To Email": "メールに返信",
"To Name": "宛先名",
"Content Type": "コンテンツタイプ",
"Content URL": "コンテンツ URL",
"Template ID": "テンプレートID",
"HTML Content": "HTML コンテンツ",
"Campaign": "キャンペーン",
"Include Fields": "フィールドを含める",
"Exclude Fields": "除外フィールド",
"List Name": "リスト名",
"Company": "会社名",
"Address Line 1": "住所1",
"Address Line 2": "住所2",
"City": "市区町村名",
"State/Province": "都道府県:",
"ZIP/Postal Code": "郵便番号(郵便番号)",
"Country": "国",
"Phone": "電話番号",
"Permission Reminder": "許可の通知",
"Default From Name": "デフォルトの差出人名",
"Default From Email": "標準送信者メールアドレス",
"Default Subject": "デフォルトの件名",
"Email Type Option": "メールタイプオプション",
"Use Archive Bar": "アーカイブバーを使用",
"Notify on Subscribe": "購読時に通知",
"Notify on Unsubscribe": "購読解除時に通知",
"Double Opt-in": "ダブルオプトイン",
"Marketing Permissions": "マーケティング権限",
"Subscriber Hash or Email": "購読者のハッシュまたはメール",
"Skip Duplicate Check": "重複チェックをスキップ",
"Update Existing": "既存の更新",
"Search Query": "検索クエリ",
"Fields": "フィールド",
"Store": "ストア",
"Count": "カウント",
"Offset": "オフセット",
"Audience you want to add the contact to": "連絡先を追加するオーディエンス:",
"Email address for the subscriber": "購読者のメールアドレス",
"Status for new subscribers": "新しい購読者のステータス",
"Type of email this member wants to receive": "このメンバーが受信したいメールの種類",
"Current status of subscriber (for updates)": "購読者の現在の状態 (更新のため)",
"First name of the subscriber": "購読者の名",
"Last name of the subscriber": "購読者の姓",
"Subscriber language (e.g., \"en\", \"es\", \"fr\")": "購読者の言語 (例: \"en\", \"es\", \"fr\")",
"VIP status for subscriber": "購読者のVIPステータス",
"Accept member data without merge field values even if required": "必要に応じて、マージフィールドの値なしでメンバーデータを承認する",
"The email address of the subscriber to add a note to": "メモを追加する購読者のメールアドレス",
"The note content to add to the subscriber": "購読者に追加するノートコンテンツ",
"The email address of the subscriber to add to the tag": "タグに追加する購読者のメールアドレス",
"The name of the tag to add the subscriber to": "購読者を追加するタグの名前",
"The email address of the subscriber to remove from the tag": "タグから削除する購読者のメールアドレス",
"The name of the tag to remove the subscriber from": "購読者を削除するタグの名前",
"Email of the new contact": "新しい連絡先のメール",
"The type of campaign to create": "キャンペーンの種類",
"The subject line for the campaign": "キャンペーンのタイトル",
"The title of the campaign": "キャンペーンのタイトル",
"The name that will appear in the \"From\" field": "「From」フィールドに表示される名前",
"The email address that will appear in the \"From\" field": "\"From\"フィールドに表示されるメールアドレス",
"The email address that will receive replies": "返信を受け取るメールアドレス",
"The name that will appear in the \"To\" field (e.g., *|FNAME|*)": "\"To\" フィールドに表示される名前 (例: *|FNAME|*)",
"How the campaign content is put together": "キャンペーンコンテンツの組み合わせ方法",
"The URL where the campaign content is hosted (required if content_type is \"url\")": "キャンペーンコンテンツがホストされている URL (content_type が \"url\" の場合に必須)",
"The ID of the template to use (required if content_type is \"template\")": "使用するテンプレートの ID (content_type が \"テンプレート\" の場合に必要)",
"The HTML content for the campaign (required if content_type is \"html\")": "キャンペーンの HTML コンテンツ (content_type が \"html\" の場合に必要)",
"Select the campaign to get information for": "以下の情報を取得するキャンペーンを選択してください",
"Comma-separated list of fields to return (e.g., \"opens.unique_opens,clicks.click_rate\")": "カンマ区切りで返すフィールドのリスト(例:\"opens.unique_opens,clicks.click_rate\")",
"Comma-separated list of fields to exclude (e.g., \"timeseries,_links\")": "カンマ区切りで除外する項目のリスト(例:\"timeseries,_links\"",
"The name of the list": "リストの名前",
"Company name for list contact information": "連絡先一覧の会社名",
"Street address for list contact information": "住所一覧の連絡先情報",
"Additional address information (optional)": "追加住所情報 (オプション)",
"City for list contact information": "連絡先情報一覧の市区町村名",
"State or province for list contact information": "連絡先情報を一覧表示する州または地域",
"ZIP or postal code for list contact information": "連絡先情報を一覧表示する郵便番号または郵便番号",
"Country for list contact information": "リストの連絡先情報の国",
"Phone number for list contact information (optional)": "連絡先一覧の電話番号(オプション)",
"The permission reminder for the list": "リストの権限通知",
"Default from name for campaigns": "デフォルトのキャンペーン名",
"Default from email address for campaigns": "キャンペーンのメールアドレスからのデフォルト",
"Default subject line for campaigns": "キャンペーンの既定の件名行",
"Default language for campaigns (e.g., \"en\", \"es\", \"fr\")": "キャンペーンの既定の言語 (例: \"en\", \"es\", \"fr\")",
"Whether the list supports multiple email formats (HTML/plain text)": "リストが複数のメール形式をサポートしているかどうかHTML/プレーンテキスト)",
"Whether campaigns use the Archive Bar in archives by default": "キャンペーンがデフォルトでアーカイブバーを使用するかどうか",
"Email address to send subscribe notifications to (optional)": "購読通知を送信するメールアドレス (オプション)",
"Email address to send unsubscribe notifications to (optional)": "購読解除通知を送信するメールアドレス (オプション)",
"Whether to require subscriber confirmation via email": "メールで購読者の確認を必要とするか",
"Whether the list has marketing permissions (GDPR) enabled": "リストにマーケティング権限(GDPR)が有効になっているかどうか",
"MD5 hash of the lowercase email address, email address, or contact_id": "小文字のメールアドレス、メールアドレス、またはcontact_id の MD5 ハッシュ",
"Email address to unsubscribe": "解除するメールアドレス",
"Ignore duplicates in the request": "リクエスト内の重複を無視",
"Change existing members subscription status": "既存のメンバーの購読状態を変更する",
"Search terms to find campaigns": "キャンペーンを検索するための用語を検索",
"Comma-separated list of fields to return": "カンマで区切られたフィールドのリスト",
"Comma-separated list of fields to exclude": "カンマ区切りで除外するフィールドのリスト",
"Select the e-commerce store": "Eコマースストアを選択",
"Email address to search for": "検索するメールアドレス",
"Number of records to return (max 1000)": "Number of records to return (max 1000)",
"Number of records to skip for pagination": "ページネーションをスキップするレコード数",
"Search query to filter tags (optional - if empty, returns all tags)": "タグをフィルタするクエリを検索します(任意の場合は、すべてのタグを返します)",
"Email address of the subscriber to search for": "検索する購読者のメールアドレス",
"Fields to include in the response (leave empty for all fields). Use dot notation for nested fields (e.g., \"merge_fields.FNAME\")": "レスポンスに含めるフィールド (すべてのフィールドで空白のままにしてください) 入れ子になったフィールドにドット表記を使用します (例: \"merge_fields.FNAME\")",
"Fields to exclude from the response. Use dot notation for nested fields": "応答から除外するフィールド。入れ子のフィールドにドット表記を使用します。",
"Subscribed": "購読中",
"Unsubscribed": "購読解除済み",
"Cleaned": "Cleaned",
"Pending": "処理待ち",
"Transactional": "取引",
"HTML": "HTML",
"Text": "テキスト",
"Regular": "標準",
"Plain Text": "プレーンテキスト",
"A/B Test": "A/B テスト",
"RSS": "RSS",
"Variate": "Variate",
"Template": "テンプレート",
"URL": "URL",
"Multichannel": "マルチチャンネル",
"Member Subscribed to Audience": "会員がオーディエンスを購読しました",
"Member Unsubscribed from Audience": "会員登録解除のお知らせ",
"New Campaign": "新規キャンペーン",
"Link Clicked": "リンクがクリックされました",
"Email Opened": "メールが開かれました",
"Subscriber Updated": "購読者の更新",
"New Customer": "新規顧客",
"New Order": "新規注文",
"New Segment Tag Subscriber": "新しいセグメントタグの購読",
"Fires when a new subscriber joins your Mailchimp audience. This trigger captures new subscriptions, opt-ins, and audience growth events with comprehensive subscriber information.": "新規加入者があなたのMailchimpオーディエンスに加入したときに発生します。このトリガーは、購読者の包括的な情報を使用して、新しい加入者、オプトイン、およびオーディエンスの成長イベントをキャプチャします。",
"Fires when a subscriber unsubscribes from your Mailchimp audience. This trigger captures unsubscribe events, opt-outs, and audience churn with comprehensive subscriber information for retention analysis.": "購読者が Mailchimp オーディエンスの購読を解除したときに発生します。このトリガーは保持分析のための包括的な購読者情報を含むイベントの購読解除、オプトアウト、およびオーディエンスの解除を取得します。",
"Fires when a new campaign is created or sent": "新しいキャンペーンが作成または送信されたときに発生します。",
"Fires when a recipient clicks a specified link in a campaign": "キャンペーン内で指定されたリンクを受信者がクリックしたときに発生します。",
"Fires when a recipient opens a an email in a specific campaign": "受信者が特定のキャンペーンで電子メールを開いたときに発行します。",
"Fires when a subscriber profile is updated, including changes to merge fields, interests, or contact information. This trigger captures profile updates, new subscriptions, and subscriber modifications.": "加入者プロファイルが更新されたときに、差し込み項目、権益、連絡先情報への変更などが発生します。 このトリガーは、プロファイルの更新、新しいサブスクリプション、および購読者の変更を取得します。",
"Fires when a new customer is added to a connected store": "新しい顧客が接続された店舗に追加されたときに発生します",
"Fires when a new order is created in the connected store": "接続されたストアで新しい注文が作成されたときに発生します。",
"Fires when a subscriber joins a specific segment or tag": "購読者が特定のセグメントまたはタグに参加したときに発行されます",
"Segment ID (Optional)": "セグメント ID (オプション)",
"Tag Name (Optional)": "タグ名(オプション)",
"The specific segment ID to monitor. Leave empty to monitor all segments.": "監視する特定のセグメント ID をすべてのセグメントを監視するには空白のままにします。",
"The specific tag name to monitor. Leave empty to monitor all tags.": "監視する特定のタグ名。すべてのタグを監視するには空のままにします。"
}

View File

@@ -0,0 +1,188 @@
{
"All-in-One integrated marketing platform for managing audiences, sending campaigns, tracking engagement, and automating lifecycle communications.": "All-in-One geïntegreerd marketingplatform voor het beheren van audio's, het verzenden van campagnes, het volgen van een engagement, en het automatiseren van levenscycluscommunicatie.",
"Add or Update Subscriber": "Voeg of update abonnee toe",
"Add Note to Subscriber": "Notitie toevoegen aan abonnee",
"Add Subscriber to Tag": "Voeg abonnee toe aan tag",
"Remove Subscriber from Tag": "Verwijder Abonnee uit Tag",
"Update Member in an Audience (List)": "Werk lid bij in een Audience (List)",
"Create Campaign": "Nieuwe campagne",
"Get Campaign Report": "Krijg Campagne Rapport",
"Create Audience": "Maak Audience",
"Archive Subscriber": "Archiveer abonnee",
"Unsubscribe Email": "E-mail afmelden",
"Find Campaign": "Vind campagne",
"Find Customer": "Klant zoeken",
"Find Tag": "Tag zoeken",
"Find Subscriber": "Abonnee zoeken",
"Add a new subscriber to an audience or update existing subscriber": "Nieuwe abonnee toevoegen aan een publiek of bestaande abonnee bijwerken",
"Add a note to a subscriber in your Mailchimp audience.": "Voeg een notitie toe aan een abonnee in uw Mailchimp publiek.",
"Add a subscriber to a specific tag in your Mailchimp audience.": "Voeg een abonnee toe aan een specifieke tag in uw publiek voor Mailchimp.",
"Remove a subscriber from a specific tag in your Mailchimp audience.": "Verwijder een abonnee van een specifieke tag in uw Mailchimp publiek.",
"Update a member in an existing Mailchimp audience (list)": "Een lid in een bestaand Mailchimp publiek (lijst) bijwerken",
"Create a new Mailchimp campaign": "Maak een nieuwe Mailchimp campagne",
"Get comprehensive report details for a specific sent campaign including opens, clicks, bounces, and performance metrics": "Krijg uitgebreide rapportgegevens voor een specifieke verzonden campagne inclusief openingen, klikken, bounces en prestatiestatistieken",
"Create a new audience (list) in your Mailchimp account": "Maak een nieuw publiek (lijst) aan in uw Mailchimp account",
"Archive an existing audience member": "Een bestaand publiek lid archiveren",
"Unsubscribe an email address from an audience": "Een e-mailadres van een publiek uitschrijven",
"Search all campaigns for the specified query terms": "Zoek in alle campagnes voor de opgegeven query voorwaarden",
"Find a customer by email address in a store": "Zoek een klant op e-mailadres in een winkel",
"Search for tags on a list by name": "Zoeken naar tags in een lijst op naam",
"Search for subscribers across all lists or within a specific list. This action provides comprehensive subscriber information including merge fields, interests, and activity data.": "Zoeken naar abonnees in alle lijsten of binnen een specifieke lijst. Deze actie biedt uitgebreide abonnee-informatie inclusief samenvoegvelden, interesses en activiteitsgegevens.",
"Audience": "Auditie",
"Email Address": "Uw e-mailadres",
"Status if New": "Status als nieuw",
"Email Type": "E-mail type",
"Status": "status",
"First Name": "Voornaam",
"Last Name": "Achternaam",
"Language": "Taal",
"VIP": "VIP-instellingen",
"Skip Merge Validation": "Validatie samenvoegen overslaan",
"Note Content": "Notitie inhoud",
"Tag Name": "Tag naam",
"Email": "E-mail",
"Campaign Type": "Campagne Type",
"Subject Line": "Onderwerp regel",
"Campaign Title": "Campagne titel",
"From Name": "Afzender naam",
"From Email": "Van e-mail",
"Reply To Email": "Beantwoord e-mail",
"To Name": "Naar naam",
"Content Type": "Type inhoud",
"Content URL": "Content URL",
"Template ID": "Sjabloon ID",
"HTML Content": "HTML inhoud",
"Campaign": "Campagne",
"Include Fields": "Velden opnemen",
"Exclude Fields": "Velden uitsluiten",
"List Name": "Lijst Naam",
"Company": "Bedrijfsnaam",
"Address Line 1": "Adresregel 1",
"Address Line 2": "Adresregel 2",
"City": "Woonplaats",
"State/Province": "Staat/provincie",
"ZIP/Postal Code": "Postcode",
"Country": "Land:",
"Phone": "Telefoonnummer",
"Permission Reminder": "Toestemming herinnering",
"Default From Name": "Standaard naam",
"Default From Email": "Standaard afzender e-mail",
"Default Subject": "Standaard onderwerp",
"Email Type Option": "E-mail Type optie",
"Use Archive Bar": "Gebruik Archief Balk",
"Notify on Subscribe": "Melding bij abonneren",
"Notify on Unsubscribe": "Notificatie bij uitschrijven",
"Double Opt-in": "Double opt-in",
"Marketing Permissions": "Marketing rechten",
"Subscriber Hash or Email": "Hash of e-mail voor abonnee",
"Skip Duplicate Check": "Dubbele controle overslaan",
"Update Existing": "Update bestaande",
"Search Query": "Zoek query",
"Fields": "Velden",
"Store": "Winkel",
"Count": "Aantal",
"Offset": "Verschuiving",
"Audience you want to add the contact to": "Audience waaraan u de contactpersoon wilt toevoegen",
"Email address for the subscriber": "E-mailadres voor de abonnee",
"Status for new subscribers": "Status van nieuwe abonnees",
"Type of email this member wants to receive": "Type e-mail dat dit lid wil ontvangen",
"Current status of subscriber (for updates)": "Huidige status van abonnee (voor updates)",
"First name of the subscriber": "Voornaam van de abonnee",
"Last name of the subscriber": "Achternaam van de abonnee",
"Subscriber language (e.g., \"en\", \"es\", \"fr\")": "Abonnee taal (bijv. \"en\", \"es\", \"fr\")",
"VIP status for subscriber": "VIP-status voor ontvanger",
"Accept member data without merge field values even if required": "Accepteer lidgegevens zonder samenvoegveld waardes zelfs indien vereist",
"The email address of the subscriber to add a note to": "Het e-mailadres van de abonnee om een notitie toe te voegen aan",
"The note content to add to the subscriber": "De notitie inhoud die aan de abonnee moet worden toegevoegd",
"The email address of the subscriber to add to the tag": "Het e-mailadres van de abonnee om toe te voegen aan de tag",
"The name of the tag to add the subscriber to": "De naam van de tag waaraan de abonnee moet worden toegevoegd",
"The email address of the subscriber to remove from the tag": "Het e-mailadres van de te verwijderen abonnee van de tag",
"The name of the tag to remove the subscriber from": "De naam van de tag om de abonnee van te verwijderen",
"Email of the new contact": "E-mail van de nieuwe contactpersoon",
"The type of campaign to create": "Het te maken type campagne",
"The subject line for the campaign": "Het onderwerp van de campagne",
"The title of the campaign": "De titel van de campagne",
"The name that will appear in the \"From\" field": "De naam die zal verschijnen in het veld \"Van\"",
"The email address that will appear in the \"From\" field": "Het e-mailadres dat wordt weergegeven in het veld \"Van\"",
"The email address that will receive replies": "Het e-mailadres dat antwoorden zal ontvangen",
"The name that will appear in the \"To\" field (e.g., *|FNAME|*)": "De naam die wordt weergegeven in het \"Aan\" veld (bijv. *|FNAME|*)",
"How the campaign content is put together": "Hoe de campagne inhoud wordt samengevoegd",
"The URL where the campaign content is hosted (required if content_type is \"url\")": "De URL waar de inhoud van de campagne wordt gehost (vereist als content_type \"url\") is",
"The ID of the template to use (required if content_type is \"template\")": "De te gebruiken template ID (verplicht als content_type \"template\")",
"The HTML content for the campaign (required if content_type is \"html\")": "De HTML-inhoud voor de campagne (vereist als content_type \"html\") is",
"Select the campaign to get information for": "Selecteer de campagne om informatie te krijgen voor",
"Comma-separated list of fields to return (e.g., \"opens.unique_opens,clicks.click_rate\")": "Kommagescheiden lijst van te retourneren velden (bijv. \"opens.unique_opens,clicks.click_rate\")",
"Comma-separated list of fields to exclude (e.g., \"timeseries,_links\")": "Kommagescheiden lijst van uit te sluiten velden (bijv. \"timeseries,_links\")",
"The name of the list": "De naam van de lijst",
"Company name for list contact information": "Bedrijfsnaam voor de lijst met contactgegevens",
"Street address for list contact information": "Adres voor contactinformatie in de lijst",
"Additional address information (optional)": "Extra adresinformatie (optioneel)",
"City for list contact information": "Stad voor het lijst met contactinformatie",
"State or province for list contact information": "Staat of provincie voor lijst contactinformatie",
"ZIP or postal code for list contact information": "Postcode voor contactinformatie in de lijst",
"Country for list contact information": "Land voor lijst contactgegevens",
"Phone number for list contact information (optional)": "Telefoonnummer voor lijstcontactinformatie (optioneel)",
"The permission reminder for the list": "Herinnering van de machtiging voor de lijst",
"Default from name for campaigns": "Standaard van naam voor campagnes",
"Default from email address for campaigns": "Standaard van e-mailadres voor campagnes",
"Default subject line for campaigns": "Standaard onderwerp regel voor campagnes",
"Default language for campaigns (e.g., \"en\", \"es\", \"fr\")": "Standaard taal voor campagnes (bijv. \"en\", \"es\", \"fr\")",
"Whether the list supports multiple email formats (HTML/plain text)": "Of de lijst meerdere e-mailformaten ondersteunt (HTML/plain text)",
"Whether campaigns use the Archive Bar in archives by default": "Of campagnes standaard gebruik maken van de archiefbalk in archieven",
"Email address to send subscribe notifications to (optional)": "E-mailadres om abonnermeldingen te verzenden naar (optioneel)",
"Email address to send unsubscribe notifications to (optional)": "E-mailadres om afmeldmeldingen te verzenden naar (optioneel)",
"Whether to require subscriber confirmation via email": "Vereist een bevestiging van de abonnee via e-mail",
"Whether the list has marketing permissions (GDPR) enabled": "Of de lijst marketingrechten heeft (GDPR) ingeschakeld heeft",
"MD5 hash of the lowercase email address, email address, or contact_id": "MD5 hash van het kleine letter e-mailadres, e-mailadres of contact_id",
"Email address to unsubscribe": "E-mailadres om uit te schrijven",
"Ignore duplicates in the request": "Negeer duplicaten in de aanvraag",
"Change existing members subscription status": "Verander de huidige abonnementstatus van leden",
"Search terms to find campaigns": "Zoek termen om campagnes te vinden",
"Comma-separated list of fields to return": "Kommagescheiden lijst van te retourneren velden",
"Comma-separated list of fields to exclude": "Door komma's gescheiden lijst van uit te sluiten velden",
"Select the e-commerce store": "Selecteer de webshop",
"Email address to search for": "E-mailadres om naar te zoeken",
"Number of records to return (max 1000)": "Aantal terugkerende records (max 1000)",
"Number of records to skip for pagination": "Aantal records dat moet worden overgeslagen voor paginering",
"Search query to filter tags (optional - if empty, returns all tags)": "Zoek query om tags te filteren (optioneel - indien leeg, retourneert alle tags)",
"Email address of the subscriber to search for": "E-mailadres van de abonnee om naar te zoeken",
"Fields to include in the response (leave empty for all fields). Use dot notation for nested fields (e.g., \"merge_fields.FNAME\")": "Velden om op te nemen in het antwoord (laat leeg voor alle velden). Gebruik punt notatie voor geneste velden (bijv. \"merge_fields.FNAME\")",
"Fields to exclude from the response. Use dot notation for nested fields": "Velden om uit te sluiten van het antwoord. Gebruik punt notatie voor geneste velden",
"Subscribed": "Ingeschreven",
"Unsubscribed": "Uitgeschreven",
"Cleaned": "Opgeschoond",
"Pending": "In behandeling",
"Transactional": "Transactionele",
"HTML": "HTML",
"Text": "Tekstveld",
"Regular": "Normaal",
"Plain Text": "Onopgemaakte tekst",
"A/B Test": "A/B test",
"RSS": "RSS",
"Variate": "Variëren",
"Template": "Sjabloon",
"URL": "URL",
"Multichannel": "Multikanaal",
"Member Subscribed to Audience": "Lid geabonneerd op Audience",
"Member Unsubscribed from Audience": "Lid is afgemeld van Audience",
"New Campaign": "Nieuwe campagne",
"Link Clicked": "Link aangeklikt",
"Email Opened": "E-mail geopend",
"Subscriber Updated": "Abonnee bijgewerkt",
"New Customer": "Nieuwe klant",
"New Order": "Nieuwe bestelling",
"New Segment Tag Subscriber": "Nieuwe Segment Tag Abonnee",
"Fires when a new subscriber joins your Mailchimp audience. This trigger captures new subscriptions, opt-ins, and audience growth events with comprehensive subscriber information.": "Krijgt wanneer een nieuwe abonnee meedoet met uw Mailchimp publiek. Deze trigger neemt nieuwe abonnementen, opt-ins en publiek groei-gebeurtenissen op met uitgebreide informatie voor abonnees.",
"Fires when a subscriber unsubscribes from your Mailchimp audience. This trigger captures unsubscribe events, opt-outs, and audience churn with comprehensive subscriber information for retention analysis.": "Vuurt wanneer een abonnee zich uitschrijft van uw Mailchimp publiek. Deze trigger neemt afmeldingen, opt-outs en publiek kerk met uitgebreide abonnementinformatie voor bewaaranalyses op.",
"Fires when a new campaign is created or sent": "Vuurt wanneer een nieuwe campagne wordt gemaakt of verzonden",
"Fires when a recipient clicks a specified link in a campaign": "Vuurt wanneer een ontvanger op een opgegeven link in een campagne klikt",
"Fires when a recipient opens a an email in a specific campaign": "Vuurt wanneer een ontvanger een e-mail opent in een specifieke campagne",
"Fires when a subscriber profile is updated, including changes to merge fields, interests, or contact information. This trigger captures profile updates, new subscriptions, and subscriber modifications.": "Vuurt wanneer een abonneprofiel is bijgewerkt, inclusief wijzigingen in samenvoegenvelden, interesses of contactinformatie. Deze trigger wijzigingen, nieuwe abonnementen en aanpassingen van het activiteitenprofiel van abonnees.",
"Fires when a new customer is added to a connected store": "Vuurt wanneer een nieuwe klant is toegevoegd aan een verbonden winkel",
"Fires when a new order is created in the connected store": "Vuurt wanneer een nieuwe bestelling wordt aangemaakt in de verbonden winkel",
"Fires when a subscriber joins a specific segment or tag": "Vuurt wanneer een abonnee een specifiek segment of tag betreedt",
"Segment ID (Optional)": "Segment-ID (optioneel)",
"Tag Name (Optional)": "Labelnaam (optioneel)",
"The specific segment ID to monitor. Leave empty to monitor all segments.": "Het specifieke segment ID om te monitoren. Laat leeg om alle segmenten te controleren.",
"The specific tag name to monitor. Leave empty to monitor all tags.": "De specifieke tag naam om te monitoren. Laat leeg om alle tags te monitoren."
}

View File

@@ -0,0 +1,188 @@
{
"All-in-One integrated marketing platform for managing audiences, sending campaigns, tracking engagement, and automating lifecycle communications.": "Plataforma de marketing integrada para gerenciar audiências, enviar campanhas, engajamento de rastreamento e automatizar comunicações de ciclo de vida.",
"Add or Update Subscriber": "Adicionar ou Atualizar Assinante",
"Add Note to Subscriber": "Adicionar Nota a Assinante",
"Add Subscriber to Tag": "Adicionar Assinante à Tag",
"Remove Subscriber from Tag": "Remover Assinante da Tag",
"Update Member in an Audience (List)": "Atualizar Membro em uma Audiência (List)",
"Create Campaign": "Criar Campanha",
"Get Campaign Report": "Obter Relatório de Campanha",
"Create Audience": "Criar Audiência",
"Archive Subscriber": "Arquivar Assinante",
"Unsubscribe Email": "Desinscrever e-mail",
"Find Campaign": "Encontrar Campanha",
"Find Customer": "Encontrar o cliente",
"Find Tag": "Encontrar Etiqueta",
"Find Subscriber": "Encontrar Assinante",
"Add a new subscriber to an audience or update existing subscriber": "Adicionar um novo assinante a um público ou atualizar um assinante existente",
"Add a note to a subscriber in your Mailchimp audience.": "Adicione uma nota a um assinante na audiência do Mailchimp.",
"Add a subscriber to a specific tag in your Mailchimp audience.": "Adicione um assinante a uma tag específica na audiência do Mailchimp.",
"Remove a subscriber from a specific tag in your Mailchimp audience.": "Remover um assinante de uma tag específica na audiência do Mailchimp.",
"Update a member in an existing Mailchimp audience (list)": "Atualizar um membro em um público existente de Mailchimp (lista)",
"Create a new Mailchimp campaign": "Criar uma nova campanha Mailchimp",
"Get comprehensive report details for a specific sent campaign including opens, clicks, bounces, and performance metrics": "Obtenha detalhes completos do relatório para uma campanha enviada, incluindo abertas, cliques, saltos e métricas de desempenho",
"Create a new audience (list) in your Mailchimp account": "Criar um novo público (lista) em sua conta do Mailchimp",
"Archive an existing audience member": "Arquivar um membro de público existente",
"Unsubscribe an email address from an audience": "Cancelar inscrição de um endereço de e-mail de um público",
"Search all campaigns for the specified query terms": "Pesquisar todas as campanhas pelos termos de consulta especificados",
"Find a customer by email address in a store": "Encontrar um cliente por endereço de e-mail em uma loja",
"Search for tags on a list by name": "Pesquisar tags em uma lista por nome",
"Search for subscribers across all lists or within a specific list. This action provides comprehensive subscriber information including merge fields, interests, and activity data.": "Pesquisar assinantes em todas as listas ou dentro de uma lista específica. Esta ação fornece informações abrangentes de assinantes, incluindo campos de mesclagem, interesses e dados de atividade.",
"Audience": "Público",
"Email Address": "Endereço de e-mail",
"Status if New": "Status se Novo",
"Email Type": "Tipo de e-mail",
"Status": "Estado",
"First Name": "Nome",
"Last Name": "Sobrenome",
"Language": "IDIOMA",
"VIP": "VIP",
"Skip Merge Validation": "Pular Validação de Mesclagem",
"Note Content": "Conteúdo da Nota",
"Tag Name": "Nome do Marcador",
"Email": "e-mail",
"Campaign Type": "Tipo De Campanha",
"Subject Line": "Linha De Assunto",
"Campaign Title": "Título da Campanha",
"From Name": "Nome do Remetente",
"From Email": "E-mail do Remetente",
"Reply To Email": "Responder para o e-mail",
"To Name": "Para o Nome",
"Content Type": "Tipo de Conteúdo",
"Content URL": "URL do conteúdo",
"Template ID": "ID do modelo",
"HTML Content": "Conteúdo HTML",
"Campaign": "Campanha",
"Include Fields": "Incluir campos",
"Exclude Fields": "Excluir Campos",
"List Name": "Lista de nomes",
"Company": "Empresas",
"Address Line 1": "Linha de Endereço 1",
"Address Line 2": "Linha de Endereço 2",
"City": "cidade",
"State/Province": "Estado/província",
"ZIP/Postal Code": "Código Postal",
"Country": "País/região",
"Phone": "Smartphone",
"Permission Reminder": "Lembrete de permissão",
"Default From Name": "Nome Padrão De",
"Default From Email": "E-mail de Origem Padrão",
"Default Subject": "Assunto Padrão",
"Email Type Option": "Opção Tipo de E-mail",
"Use Archive Bar": "Usar barra de arquivo",
"Notify on Subscribe": "Notificar ao assinar",
"Notify on Unsubscribe": "Notificar ao cancelar a inscrição",
"Double Opt-in": "Double Opt-in",
"Marketing Permissions": "Permissões de Marketing",
"Subscriber Hash or Email": "Hash ou e-mail do assinante",
"Skip Duplicate Check": "Pular verificação duplicada",
"Update Existing": "Atualizar Existente",
"Search Query": "Consulta de Pesquisa",
"Fields": "campos",
"Store": "Armazém",
"Count": "Contagem",
"Offset": "Deslocamento",
"Audience you want to add the contact to": "Audiência em que você deseja adicionar o contato",
"Email address for the subscriber": "Endereço de email para o assinante",
"Status for new subscribers": "Status para novos assinantes",
"Type of email this member wants to receive": "Tipo de e-mail que este membro deseja receber",
"Current status of subscriber (for updates)": "Status atual do assinante (para atualizações)",
"First name of the subscriber": "Primeiro nome do assinante",
"Last name of the subscriber": "Último nome do assinante",
"Subscriber language (e.g., \"en\", \"es\", \"fr\")": "Idioma do assinante (por exemplo, \"en\", \"es\", \"fr\")",
"VIP status for subscriber": "Status VIP para assinante",
"Accept member data without merge field values even if required": "Aceitar dados de membros sem campos de mesclagem mesmo se necessário",
"The email address of the subscriber to add a note to": "O endereço de e-mail do assinante para adicionar uma nota",
"The note content to add to the subscriber": "Nota de conteúdo para adicionar ao membro",
"The email address of the subscriber to add to the tag": "O endereço de e-mail do assinante a adicionar à tag",
"The name of the tag to add the subscriber to": "O nome da tag à qual adicionar o assinante",
"The email address of the subscriber to remove from the tag": "O endereço de e-mail do assinante a ser removido da tag",
"The name of the tag to remove the subscriber from": "O nome da tag para remover o assinante de",
"Email of the new contact": "E-mail do novo contato",
"The type of campaign to create": "O tipo de campanha para criar",
"The subject line for the campaign": "O assunto da campanha",
"The title of the campaign": "O título da campanha",
"The name that will appear in the \"From\" field": "O nome que irá aparecer no campo \"De\"",
"The email address that will appear in the \"From\" field": "O endereço de e-mail que aparecerá no campo \"De\"",
"The email address that will receive replies": "O endereço de email que receberá as respostas",
"The name that will appear in the \"To\" field (e.g., *|FNAME|*)": "O nome que irá aparecer no campo \"Para\" (por exemplo, *|FNAME|*)",
"How the campaign content is put together": "Como o conteúdo da campanha é montado",
"The URL where the campaign content is hosted (required if content_type is \"url\")": "A URL onde o conteúdo da campanha está hospedado (obrigatório se o content_type é \"url\")",
"The ID of the template to use (required if content_type is \"template\")": "A ID do template a ser usado (obrigatório se content_type é \"template\")",
"The HTML content for the campaign (required if content_type is \"html\")": "O conteúdo HTML para a campanha (obrigatório se content_type for \"html\")",
"Select the campaign to get information for": "Selecione a campanha para obter informação para",
"Comma-separated list of fields to return (e.g., \"opens.unique_opens,clicks.click_rate\")": "Lista de campos a retornar separados por vírgula (ex: \"opens.único_opens,clicks.click_rate\")",
"Comma-separated list of fields to exclude (e.g., \"timeseries,_links\")": "Lista de campos separados por vírgula a serem excluídos (por exemplo, \"timeseries,_links\")",
"The name of the list": "O nome da lista",
"Company name for list contact information": "Nome da empresa para informações de contato da lista",
"Street address for list contact information": "Endereço da rua para as informações de contato da lista",
"Additional address information (optional)": "Informações adicionais de endereço (opcional)",
"City for list contact information": "Cidade para informações de contato",
"State or province for list contact information": "Estado ou província para listar informações de contato",
"ZIP or postal code for list contact information": "ZIP ou código postal para informações de contato da lista",
"Country for list contact information": "País para informações de contato da lista",
"Phone number for list contact information (optional)": "Número de telefone para informações de contato da lista (opcional)",
"The permission reminder for the list": "O lembrete de permissão para a lista",
"Default from name for campaigns": "Padrão a partir do nome para campanhas",
"Default from email address for campaigns": "Padrão do endereço de e-mail para campanhas",
"Default subject line for campaigns": "Linha de assunto padrão para campanhas",
"Default language for campaigns (e.g., \"en\", \"es\", \"fr\")": "Idioma padrão para campanhas (ex.: \"en\", \"es\", \"fr\")",
"Whether the list supports multiple email formats (HTML/plain text)": "Se a lista suporta vários formatos de e-mail (HTML/texto simples)",
"Whether campaigns use the Archive Bar in archives by default": "Se as campanhas usam a Barra de Arquivos em arquivos por padrão",
"Email address to send subscribe notifications to (optional)": "Endereço de e-mail para enviar notificações de inscrição para (opcional)",
"Email address to send unsubscribe notifications to (optional)": "Endereço de email para enviar notificações de cancelamento (opcional)",
"Whether to require subscriber confirmation via email": "Exigir confirmação de assinante por e-mail",
"Whether the list has marketing permissions (GDPR) enabled": "Se a lista tem permissões de marketing (GDPR) ativado",
"MD5 hash of the lowercase email address, email address, or contact_id": "MD5 hash do endereço de e-mail em minúsculas, endereço de email ou contact_id",
"Email address to unsubscribe": "Endereço de e-mail para descadastrar",
"Ignore duplicates in the request": "Ignorar duplicatas no pedido",
"Change existing members subscription status": "Alterar status de assinatura de membros existentes",
"Search terms to find campaigns": "Pesquisar termos para localizar campanhas",
"Comma-separated list of fields to return": "Lista de campos separados por vírgula para retornar",
"Comma-separated list of fields to exclude": "Lista de campos separados por vírgula para excluir",
"Select the e-commerce store": "Selecione a loja de e-commerce",
"Email address to search for": "Endereço de email para procurar",
"Number of records to return (max 1000)": "Número de registros a retornar (máx. 1000)",
"Number of records to skip for pagination": "Número de registros para pular para paginação",
"Search query to filter tags (optional - if empty, returns all tags)": "Consulta de pesquisa para filtrar tags (opcional - se vazia, retorna todas as tags)",
"Email address of the subscriber to search for": "Endereço de email do assinante para procurar",
"Fields to include in the response (leave empty for all fields). Use dot notation for nested fields (e.g., \"merge_fields.FNAME\")": "Campos para incluir na resposta (deixe em branco para todos os campos). Use notação de ponto para campos aninhados (por exemplo, \"merge_fields.FNAME\")",
"Fields to exclude from the response. Use dot notation for nested fields": "Campos para excluir da resposta. Use notação do ponto para campos aninhados",
"Subscribed": "Subscrito",
"Unsubscribed": "Cancelada",
"Cleaned": "Limpo",
"Pending": "Pendente",
"Transactional": "Transações",
"HTML": "HTML",
"Text": "texto",
"Regular": "Padrão",
"Plain Text": "Texto sem Formatação",
"A/B Test": "Teste A/B",
"RSS": "Resposta",
"Variate": "Variação",
"Template": "Modelo",
"URL": "URL:",
"Multichannel": "Multicanal",
"Member Subscribed to Audience": "Membro inscrito para Audiência",
"Member Unsubscribed from Audience": "Membro não inscrito na audiência",
"New Campaign": "Nova Campanha",
"Link Clicked": "Link clicado",
"Email Opened": "E-mail aberto",
"Subscriber Updated": "Assinante atualizado",
"New Customer": "Novo Cliente",
"New Order": "Novo Pedido",
"New Segment Tag Subscriber": "Novo Assinante de Tag do segmento",
"Fires when a new subscriber joins your Mailchimp audience. This trigger captures new subscriptions, opt-ins, and audience growth events with comprehensive subscriber information.": "Atira quando um novo assinante se junta ao seu público do Mailchimp. Isto desencadeia novas assinaturas, opt-ins e eventos de crescimento de público com informações abrangentes de assinante.",
"Fires when a subscriber unsubscribes from your Mailchimp audience. This trigger captures unsubscribe events, opt-outs, and audience churn with comprehensive subscriber information for retention analysis.": "Atira quando um assinante cancela a inscrição na sua audiência do Mailchimp. Isto desencadeia captura eventos de cancelamento de assinatura, exclusão e audiência organizada com informações completas de assinante para análise de retenção.",
"Fires when a new campaign is created or sent": "Dispara quando uma nova campanha é criada ou enviada",
"Fires when a recipient clicks a specified link in a campaign": "Atira quando um destinatário clica em um link especificado em uma campanha",
"Fires when a recipient opens a an email in a specific campaign": "Atira quando um destinatário abre um email em uma campanha específica",
"Fires when a subscriber profile is updated, including changes to merge fields, interests, or contact information. This trigger captures profile updates, new subscriptions, and subscriber modifications.": "Atira quando um perfil de membro é atualizado, incluindo alterações em campos de mesclagem, interesses ou informações de contato. Este gatilho captura atualizações de perfil, novas assinaturas e modificações de assinantes.",
"Fires when a new customer is added to a connected store": "aciona quando um novo cliente é adicionado a uma loja conectada",
"Fires when a new order is created in the connected store": "Atira quando uma nova ordem é criada na loja conectada",
"Fires when a subscriber joins a specific segment or tag": "Ativa quando um assinante entra em um segmento ou tag específico",
"Segment ID (Optional)": "ID do segmento (opcional)",
"Tag Name (Optional)": "Nome da Tag (Opcional)",
"The specific segment ID to monitor. Leave empty to monitor all segments.": "O ID do segmento específico para monitorar. Deixe em branco para monitorar todos os segmentos.",
"The specific tag name to monitor. Leave empty to monitor all tags.": "O nome da tag específica para monitorar. Deixe em branco para monitorar todas as tags."
}

View File

@@ -0,0 +1,37 @@
{
"Mailchimp": "Mailchimp",
"All-in-One integrated marketing platform": "Встроенная маркетинговая платформа",
"Add Member to an Audience (List)": "Добавить участника в аудиторию (списк)",
"Add Note to Subscriber": "Добавить примечание к подписчику",
"Add Subscriber to a tag": "Добавить подписчика к тегу",
"Remove Subscriber from a tag": "Удалить подписчика из тега",
"Update Member in an Audience (List)": "Обновить участника аудитории (списка)",
"Add a member to an existing Mailchimp audience (list)": "Добавить участника к существующей аудитории Mailchimp (список)",
"Add a note to a subscriber": "Добавить заметку подписчику",
"Adds a subscriber to a tag. This will fail if the user is not subscribed to the audience.": "Добавляет подписчика к тегу. Это не сработает, если пользователь не подписан на аудиторию.",
"Removes a subscriber from a tag": "Удаляет подписчика из тега",
"Update a member in an existing Mailchimp audience (list)": "Обновить участника из существующей аудитории Mailchimp (список)",
"First Name": "First Name",
"Last Name": "Last Name",
"Email": "Почта",
"Audience": "Аудитория",
"Status": "Статус",
"Note": "Примечание",
"Tag Name": "Имя тега",
"First name of the new contact": "Имя нового контакта",
"Last name of the new contact": "Фамилия нового контакта",
"Email of the new contact": "Email нового контакта",
"Audience you want to add the contact to": "Аудитория, к которой вы хотите добавить контакт",
"Email of the subscriber": "Email подписчика",
"Note to add to the subscriber": "Примечание для добавления подписчику",
"Tag name to add to the subscriber": "Имя тега для добавления подписчику",
"Subscribed": "Подписан",
"Unsubscribed": "Отписано",
"Cleaned": "Очищено",
"Pending": "В ожидании",
"Transactional": "Трансакционный",
"Member Subscribed to Audience": "Подписка на аудиторию",
"Member Unsubscribed to Audience": "Участник отписался от аудитории",
"Runs when an Audience subscriber is added.": "Выполняется при добавлении абонента аудитории.",
"Runs when a member unsubscribes.": "Выполняется при отказе от подписки."
}

View File

@@ -0,0 +1,188 @@
{
"All-in-One integrated marketing platform for managing audiences, sending campaigns, tracking engagement, and automating lifecycle communications.": "All-in-One integrated marketing platform for managing audiences, sending campaigns, tracking engagement, and automating lifecycle communications.",
"Add or Update Subscriber": "Add or Update Subscriber",
"Add Note to Subscriber": "Add Note to Subscriber",
"Add Subscriber to Tag": "Add Subscriber to Tag",
"Remove Subscriber from Tag": "Remove Subscriber from Tag",
"Update Member in an Audience (List)": "Update Member in an Audience (List)",
"Create Campaign": "Create Campaign",
"Get Campaign Report": "Get Campaign Report",
"Create Audience": "Create Audience",
"Archive Subscriber": "Archive Subscriber",
"Unsubscribe Email": "Unsubscribe Email",
"Find Campaign": "Find Campaign",
"Find Customer": "Find Customer",
"Find Tag": "Find Tag",
"Find Subscriber": "Find Subscriber",
"Add a new subscriber to an audience or update existing subscriber": "Add a new subscriber to an audience or update existing subscriber",
"Add a note to a subscriber in your Mailchimp audience.": "Add a note to a subscriber in your Mailchimp audience.",
"Add a subscriber to a specific tag in your Mailchimp audience.": "Add a subscriber to a specific tag in your Mailchimp audience.",
"Remove a subscriber from a specific tag in your Mailchimp audience.": "Remove a subscriber from a specific tag in your Mailchimp audience.",
"Update a member in an existing Mailchimp audience (list)": "Update a member in an existing Mailchimp audience (list)",
"Create a new Mailchimp campaign": "Create a new Mailchimp campaign",
"Get comprehensive report details for a specific sent campaign including opens, clicks, bounces, and performance metrics": "Get comprehensive report details for a specific sent campaign including opens, clicks, bounces, and performance metrics",
"Create a new audience (list) in your Mailchimp account": "Create a new audience (list) in your Mailchimp account",
"Archive an existing audience member": "Archive an existing audience member",
"Unsubscribe an email address from an audience": "Unsubscribe an email address from an audience",
"Search all campaigns for the specified query terms": "Search all campaigns for the specified query terms",
"Find a customer by email address in a store": "Find a customer by email address in a store",
"Search for tags on a list by name": "Search for tags on a list by name",
"Search for subscribers across all lists or within a specific list. This action provides comprehensive subscriber information including merge fields, interests, and activity data.": "Search for subscribers across all lists or within a specific list. This action provides comprehensive subscriber information including merge fields, interests, and activity data.",
"Audience": "Audience",
"Email Address": "Email Address",
"Status if New": "Status if New",
"Email Type": "Email Type",
"Status": "Status",
"First Name": "First Name",
"Last Name": "Last Name",
"Language": "Language",
"VIP": "VIP",
"Skip Merge Validation": "Skip Merge Validation",
"Note Content": "Note Content",
"Tag Name": "Tag Name",
"Email": "Email",
"Campaign Type": "Campaign Type",
"Subject Line": "Subject Line",
"Campaign Title": "Campaign Title",
"From Name": "From Name",
"From Email": "From Email",
"Reply To Email": "Reply To Email",
"To Name": "To Name",
"Content Type": "Content Type",
"Content URL": "Content URL",
"Template ID": "Template ID",
"HTML Content": "HTML Content",
"Campaign": "Campaign",
"Include Fields": "Include Fields",
"Exclude Fields": "Exclude Fields",
"List Name": "List Name",
"Company": "Company",
"Address Line 1": "Address Line 1",
"Address Line 2": "Address Line 2",
"City": "City",
"State/Province": "State/Province",
"ZIP/Postal Code": "ZIP/Postal Code",
"Country": "Country",
"Phone": "Phone",
"Permission Reminder": "Permission Reminder",
"Default From Name": "Default From Name",
"Default From Email": "Default From Email",
"Default Subject": "Default Subject",
"Email Type Option": "Email Type Option",
"Use Archive Bar": "Use Archive Bar",
"Notify on Subscribe": "Notify on Subscribe",
"Notify on Unsubscribe": "Notify on Unsubscribe",
"Double Opt-in": "Double Opt-in",
"Marketing Permissions": "Marketing Permissions",
"Subscriber Hash or Email": "Subscriber Hash or Email",
"Skip Duplicate Check": "Skip Duplicate Check",
"Update Existing": "Update Existing",
"Search Query": "Search Query",
"Fields": "Fields",
"Store": "Store",
"Count": "Count",
"Offset": "Offset",
"Audience you want to add the contact to": "Audience you want to add the contact to",
"Email address for the subscriber": "Email address for the subscriber",
"Status for new subscribers": "Status for new subscribers",
"Type of email this member wants to receive": "Type of email this member wants to receive",
"Current status of subscriber (for updates)": "Current status of subscriber (for updates)",
"First name of the subscriber": "First name of the subscriber",
"Last name of the subscriber": "Last name of the subscriber",
"Subscriber language (e.g., \"en\", \"es\", \"fr\")": "Subscriber language (e.g., \"en\", \"es\", \"fr\")",
"VIP status for subscriber": "VIP status for subscriber",
"Accept member data without merge field values even if required": "Accept member data without merge field values even if required",
"The email address of the subscriber to add a note to": "The email address of the subscriber to add a note to",
"The note content to add to the subscriber": "The note content to add to the subscriber",
"The email address of the subscriber to add to the tag": "The email address of the subscriber to add to the tag",
"The name of the tag to add the subscriber to": "The name of the tag to add the subscriber to",
"The email address of the subscriber to remove from the tag": "The email address of the subscriber to remove from the tag",
"The name of the tag to remove the subscriber from": "The name of the tag to remove the subscriber from",
"Email of the new contact": "Email of the new contact",
"The type of campaign to create": "The type of campaign to create",
"The subject line for the campaign": "The subject line for the campaign",
"The title of the campaign": "The title of the campaign",
"The name that will appear in the \"From\" field": "The name that will appear in the \"From\" field",
"The email address that will appear in the \"From\" field": "The email address that will appear in the \"From\" field",
"The email address that will receive replies": "The email address that will receive replies",
"The name that will appear in the \"To\" field (e.g., *|FNAME|*)": "The name that will appear in the \"To\" field (e.g., *|FNAME|*)",
"How the campaign content is put together": "How the campaign content is put together",
"The URL where the campaign content is hosted (required if content_type is \"url\")": "The URL where the campaign content is hosted (required if content_type is \"url\")",
"The ID of the template to use (required if content_type is \"template\")": "The ID of the template to use (required if content_type is \"template\")",
"The HTML content for the campaign (required if content_type is \"html\")": "The HTML content for the campaign (required if content_type is \"html\")",
"Select the campaign to get information for": "Select the campaign to get information for",
"Comma-separated list of fields to return (e.g., \"opens.unique_opens,clicks.click_rate\")": "Comma-separated list of fields to return (e.g., \"opens.unique_opens,clicks.click_rate\")",
"Comma-separated list of fields to exclude (e.g., \"timeseries,_links\")": "Comma-separated list of fields to exclude (e.g., \"timeseries,_links\")",
"The name of the list": "The name of the list",
"Company name for list contact information": "Company name for list contact information",
"Street address for list contact information": "Street address for list contact information",
"Additional address information (optional)": "Additional address information (optional)",
"City for list contact information": "City for list contact information",
"State or province for list contact information": "State or province for list contact information",
"ZIP or postal code for list contact information": "ZIP or postal code for list contact information",
"Country for list contact information": "Country for list contact information",
"Phone number for list contact information (optional)": "Phone number for list contact information (optional)",
"The permission reminder for the list": "The permission reminder for the list",
"Default from name for campaigns": "Default from name for campaigns",
"Default from email address for campaigns": "Default from email address for campaigns",
"Default subject line for campaigns": "Default subject line for campaigns",
"Default language for campaigns (e.g., \"en\", \"es\", \"fr\")": "Default language for campaigns (e.g., \"en\", \"es\", \"fr\")",
"Whether the list supports multiple email formats (HTML/plain text)": "Whether the list supports multiple email formats (HTML/plain text)",
"Whether campaigns use the Archive Bar in archives by default": "Whether campaigns use the Archive Bar in archives by default",
"Email address to send subscribe notifications to (optional)": "Email address to send subscribe notifications to (optional)",
"Email address to send unsubscribe notifications to (optional)": "Email address to send unsubscribe notifications to (optional)",
"Whether to require subscriber confirmation via email": "Whether to require subscriber confirmation via email",
"Whether the list has marketing permissions (GDPR) enabled": "Whether the list has marketing permissions (GDPR) enabled",
"MD5 hash of the lowercase email address, email address, or contact_id": "MD5 hash of the lowercase email address, email address, or contact_id",
"Email address to unsubscribe": "Email address to unsubscribe",
"Ignore duplicates in the request": "Ignore duplicates in the request",
"Change existing members subscription status": "Change existing members subscription status",
"Search terms to find campaigns": "Search terms to find campaigns",
"Comma-separated list of fields to return": "Comma-separated list of fields to return",
"Comma-separated list of fields to exclude": "Comma-separated list of fields to exclude",
"Select the e-commerce store": "Select the e-commerce store",
"Email address to search for": "Email address to search for",
"Number of records to return (max 1000)": "Number of records to return (max 1000)",
"Number of records to skip for pagination": "Number of records to skip for pagination",
"Search query to filter tags (optional - if empty, returns all tags)": "Search query to filter tags (optional - if empty, returns all tags)",
"Email address of the subscriber to search for": "Email address of the subscriber to search for",
"Fields to include in the response (leave empty for all fields). Use dot notation for nested fields (e.g., \"merge_fields.FNAME\")": "Fields to include in the response (leave empty for all fields). Use dot notation for nested fields (e.g., \"merge_fields.FNAME\")",
"Fields to exclude from the response. Use dot notation for nested fields": "Fields to exclude from the response. Use dot notation for nested fields",
"Subscribed": "Subscribed",
"Unsubscribed": "Unsubscribed",
"Cleaned": "Cleaned",
"Pending": "Pending",
"Transactional": "Transactional",
"HTML": "HTML",
"Text": "Text",
"Regular": "Regular",
"Plain Text": "Plain Text",
"A/B Test": "A/B Test",
"RSS": "RSS",
"Variate": "Variate",
"Template": "Template",
"URL": "URL",
"Multichannel": "Multichannel",
"Member Subscribed to Audience": "Member Subscribed to Audience",
"Member Unsubscribed from Audience": "Member Unsubscribed from Audience",
"New Campaign": "New Campaign",
"Link Clicked": "Link Clicked",
"Email Opened": "Email Opened",
"Subscriber Updated": "Subscriber Updated",
"New Customer": "New Customer",
"New Order": "New Order",
"New Segment Tag Subscriber": "New Segment Tag Subscriber",
"Fires when a new subscriber joins your Mailchimp audience. This trigger captures new subscriptions, opt-ins, and audience growth events with comprehensive subscriber information.": "Fires when a new subscriber joins your Mailchimp audience. This trigger captures new subscriptions, opt-ins, and audience growth events with comprehensive subscriber information.",
"Fires when a subscriber unsubscribes from your Mailchimp audience. This trigger captures unsubscribe events, opt-outs, and audience churn with comprehensive subscriber information for retention analysis.": "Fires when a subscriber unsubscribes from your Mailchimp audience. This trigger captures unsubscribe events, opt-outs, and audience churn with comprehensive subscriber information for retention analysis.",
"Fires when a new campaign is created or sent": "Fires when a new campaign is created or sent",
"Fires when a recipient clicks a specified link in a campaign": "Fires when a recipient clicks a specified link in a campaign",
"Fires when a recipient opens a an email in a specific campaign": "Fires when a recipient opens a an email in a specific campaign",
"Fires when a subscriber profile is updated, including changes to merge fields, interests, or contact information. This trigger captures profile updates, new subscriptions, and subscriber modifications.": "Fires when a subscriber profile is updated, including changes to merge fields, interests, or contact information. This trigger captures profile updates, new subscriptions, and subscriber modifications.",
"Fires when a new customer is added to a connected store": "Fires when a new customer is added to a connected store",
"Fires when a new order is created in the connected store": "Fires when a new order is created in the connected store",
"Fires when a subscriber joins a specific segment or tag": "Fires when a subscriber joins a specific segment or tag",
"Segment ID (Optional)": "Segment ID (Optional)",
"Tag Name (Optional)": "Tag Name (Optional)",
"The specific segment ID to monitor. Leave empty to monitor all segments.": "The specific segment ID to monitor. Leave empty to monitor all segments.",
"The specific tag name to monitor. Leave empty to monitor all tags.": "The specific tag name to monitor. Leave empty to monitor all tags."
}

View File

@@ -0,0 +1,37 @@
{
"Mailchimp": "Mailchimp",
"All-in-One integrated marketing platform": "All-in-One integrated marketing platform",
"Add Member to an Audience (List)": "Add Member to an Audience (List)",
"Add Note to Subscriber": "Add Note to Subscriber",
"Add Subscriber to a tag": "Add Subscriber to a tag",
"Remove Subscriber from a tag": "Remove Subscriber from a tag",
"Update Member in an Audience (List)": "Update Member in an Audience (List)",
"Add a member to an existing Mailchimp audience (list)": "Add a member to an existing Mailchimp audience (list)",
"Add a note to a subscriber": "Add a note to a subscriber",
"Adds a subscriber to a tag. This will fail if the user is not subscribed to the audience.": "Adds a subscriber to a tag. This will fail if the user is not subscribed to the audience.",
"Removes a subscriber from a tag": "Removes a subscriber from a tag",
"Update a member in an existing Mailchimp audience (list)": "Update a member in an existing Mailchimp audience (list)",
"First Name": "First Name",
"Last Name": "Last Name",
"Email": "Email",
"Audience": "Audience",
"Status": "Status",
"Note": "Note",
"Tag Name": "Tag Name",
"First name of the new contact": "First name of the new contact",
"Last name of the new contact": "Last name of the new contact",
"Email of the new contact": "Email of the new contact",
"Audience you want to add the contact to": "Audience you want to add the contact to",
"Email of the subscriber": "Email of the subscriber",
"Note to add to the subscriber": "Note to add to the subscriber",
"Tag name to add to the subscriber": "Tag name to add to the subscriber",
"Subscribed": "Subscribed",
"Unsubscribed": "Unsubscribed",
"Cleaned": "Cleaned",
"Pending": "Đang chờ",
"Transactional": "Transactional",
"Member Subscribed to Audience": "Member Subscribed to Audience",
"Member Unsubscribed to Audience": "Member Unsubscribed to Audience",
"Runs when an Audience subscriber is added.": "Runs when an Audience subscriber is added.",
"Runs when a member unsubscribes.": "Runs when a member unsubscribes."
}

View File

@@ -0,0 +1,188 @@
{
"All-in-One integrated marketing platform for managing audiences, sending campaigns, tracking engagement, and automating lifecycle communications.": "All-in-One integrated marketing platform for managing audiences, sending campaigns, tracking engagement, and automating lifecycle communications.",
"Add or Update Subscriber": "Add or Update Subscriber",
"Add Note to Subscriber": "Add Note to Subscriber",
"Add Subscriber to Tag": "Add Subscriber to Tag",
"Remove Subscriber from Tag": "Remove Subscriber from Tag",
"Update Member in an Audience (List)": "Update Member in an Audience (List)",
"Create Campaign": "Create Campaign",
"Get Campaign Report": "Get Campaign Report",
"Create Audience": "Create Audience",
"Archive Subscriber": "Archive Subscriber",
"Unsubscribe Email": "Unsubscribe Email",
"Find Campaign": "Find Campaign",
"Find Customer": "Find Customer",
"Find Tag": "Find Tag",
"Find Subscriber": "Find Subscriber",
"Add a new subscriber to an audience or update existing subscriber": "Add a new subscriber to an audience or update existing subscriber",
"Add a note to a subscriber in your Mailchimp audience.": "Add a note to a subscriber in your Mailchimp audience.",
"Add a subscriber to a specific tag in your Mailchimp audience.": "Add a subscriber to a specific tag in your Mailchimp audience.",
"Remove a subscriber from a specific tag in your Mailchimp audience.": "Remove a subscriber from a specific tag in your Mailchimp audience.",
"Update a member in an existing Mailchimp audience (list)": "Update a member in an existing Mailchimp audience (list)",
"Create a new Mailchimp campaign": "Create a new Mailchimp campaign",
"Get comprehensive report details for a specific sent campaign including opens, clicks, bounces, and performance metrics": "Get comprehensive report details for a specific sent campaign including opens, clicks, bounces, and performance metrics",
"Create a new audience (list) in your Mailchimp account": "Create a new audience (list) in your Mailchimp account",
"Archive an existing audience member": "Archive an existing audience member",
"Unsubscribe an email address from an audience": "Unsubscribe an email address from an audience",
"Search all campaigns for the specified query terms": "Search all campaigns for the specified query terms",
"Find a customer by email address in a store": "Find a customer by email address in a store",
"Search for tags on a list by name": "Search for tags on a list by name",
"Search for subscribers across all lists or within a specific list. This action provides comprehensive subscriber information including merge fields, interests, and activity data.": "Search for subscribers across all lists or within a specific list. This action provides comprehensive subscriber information including merge fields, interests, and activity data.",
"Audience": "Audience",
"Email Address": "Email Address",
"Status if New": "Status if New",
"Email Type": "Email Type",
"Status": "状态",
"First Name": "名字",
"Last Name": "名字",
"Language": "Language",
"VIP": "VIP",
"Skip Merge Validation": "Skip Merge Validation",
"Note Content": "Note Content",
"Tag Name": "Tag Name",
"Email": "电子邮件地址",
"Campaign Type": "Campaign Type",
"Subject Line": "Subject Line",
"Campaign Title": "Campaign Title",
"From Name": "From Name",
"From Email": "From Email",
"Reply To Email": "Reply To Email",
"To Name": "To Name",
"Content Type": "Content Type",
"Content URL": "Content URL",
"Template ID": "Template ID",
"HTML Content": "HTML Content",
"Campaign": "Campaign",
"Include Fields": "Include Fields",
"Exclude Fields": "Exclude Fields",
"List Name": "List Name",
"Company": "Company",
"Address Line 1": "Address Line 1",
"Address Line 2": "Address Line 2",
"City": "City",
"State/Province": "State/Province",
"ZIP/Postal Code": "ZIP/Postal Code",
"Country": "Country",
"Phone": "Phone",
"Permission Reminder": "Permission Reminder",
"Default From Name": "Default From Name",
"Default From Email": "Default From Email",
"Default Subject": "Default Subject",
"Email Type Option": "Email Type Option",
"Use Archive Bar": "Use Archive Bar",
"Notify on Subscribe": "Notify on Subscribe",
"Notify on Unsubscribe": "Notify on Unsubscribe",
"Double Opt-in": "Double Opt-in",
"Marketing Permissions": "Marketing Permissions",
"Subscriber Hash or Email": "Subscriber Hash or Email",
"Skip Duplicate Check": "Skip Duplicate Check",
"Update Existing": "Update Existing",
"Search Query": "Search Query",
"Fields": "Fields",
"Store": "Store",
"Count": "计数",
"Offset": "Offset",
"Audience you want to add the contact to": "Audience you want to add the contact to",
"Email address for the subscriber": "Email address for the subscriber",
"Status for new subscribers": "Status for new subscribers",
"Type of email this member wants to receive": "Type of email this member wants to receive",
"Current status of subscriber (for updates)": "Current status of subscriber (for updates)",
"First name of the subscriber": "First name of the subscriber",
"Last name of the subscriber": "Last name of the subscriber",
"Subscriber language (e.g., \"en\", \"es\", \"fr\")": "Subscriber language (e.g., \"en\", \"es\", \"fr\")",
"VIP status for subscriber": "VIP status for subscriber",
"Accept member data without merge field values even if required": "Accept member data without merge field values even if required",
"The email address of the subscriber to add a note to": "The email address of the subscriber to add a note to",
"The note content to add to the subscriber": "The note content to add to the subscriber",
"The email address of the subscriber to add to the tag": "The email address of the subscriber to add to the tag",
"The name of the tag to add the subscriber to": "The name of the tag to add the subscriber to",
"The email address of the subscriber to remove from the tag": "The email address of the subscriber to remove from the tag",
"The name of the tag to remove the subscriber from": "The name of the tag to remove the subscriber from",
"Email of the new contact": "Email of the new contact",
"The type of campaign to create": "The type of campaign to create",
"The subject line for the campaign": "The subject line for the campaign",
"The title of the campaign": "The title of the campaign",
"The name that will appear in the \"From\" field": "The name that will appear in the \"From\" field",
"The email address that will appear in the \"From\" field": "The email address that will appear in the \"From\" field",
"The email address that will receive replies": "The email address that will receive replies",
"The name that will appear in the \"To\" field (e.g., *|FNAME|*)": "The name that will appear in the \"To\" field (e.g., *|FNAME|*)",
"How the campaign content is put together": "How the campaign content is put together",
"The URL where the campaign content is hosted (required if content_type is \"url\")": "The URL where the campaign content is hosted (required if content_type is \"url\")",
"The ID of the template to use (required if content_type is \"template\")": "The ID of the template to use (required if content_type is \"template\")",
"The HTML content for the campaign (required if content_type is \"html\")": "The HTML content for the campaign (required if content_type is \"html\")",
"Select the campaign to get information for": "Select the campaign to get information for",
"Comma-separated list of fields to return (e.g., \"opens.unique_opens,clicks.click_rate\")": "Comma-separated list of fields to return (e.g., \"opens.unique_opens,clicks.click_rate\")",
"Comma-separated list of fields to exclude (e.g., \"timeseries,_links\")": "Comma-separated list of fields to exclude (e.g., \"timeseries,_links\")",
"The name of the list": "The name of the list",
"Company name for list contact information": "Company name for list contact information",
"Street address for list contact information": "Street address for list contact information",
"Additional address information (optional)": "Additional address information (optional)",
"City for list contact information": "City for list contact information",
"State or province for list contact information": "State or province for list contact information",
"ZIP or postal code for list contact information": "ZIP or postal code for list contact information",
"Country for list contact information": "Country for list contact information",
"Phone number for list contact information (optional)": "Phone number for list contact information (optional)",
"The permission reminder for the list": "The permission reminder for the list",
"Default from name for campaigns": "Default from name for campaigns",
"Default from email address for campaigns": "Default from email address for campaigns",
"Default subject line for campaigns": "Default subject line for campaigns",
"Default language for campaigns (e.g., \"en\", \"es\", \"fr\")": "Default language for campaigns (e.g., \"en\", \"es\", \"fr\")",
"Whether the list supports multiple email formats (HTML/plain text)": "Whether the list supports multiple email formats (HTML/plain text)",
"Whether campaigns use the Archive Bar in archives by default": "Whether campaigns use the Archive Bar in archives by default",
"Email address to send subscribe notifications to (optional)": "Email address to send subscribe notifications to (optional)",
"Email address to send unsubscribe notifications to (optional)": "Email address to send unsubscribe notifications to (optional)",
"Whether to require subscriber confirmation via email": "Whether to require subscriber confirmation via email",
"Whether the list has marketing permissions (GDPR) enabled": "Whether the list has marketing permissions (GDPR) enabled",
"MD5 hash of the lowercase email address, email address, or contact_id": "MD5 hash of the lowercase email address, email address, or contact_id",
"Email address to unsubscribe": "Email address to unsubscribe",
"Ignore duplicates in the request": "Ignore duplicates in the request",
"Change existing members subscription status": "Change existing members subscription status",
"Search terms to find campaigns": "Search terms to find campaigns",
"Comma-separated list of fields to return": "Comma-separated list of fields to return",
"Comma-separated list of fields to exclude": "Comma-separated list of fields to exclude",
"Select the e-commerce store": "Select the e-commerce store",
"Email address to search for": "Email address to search for",
"Number of records to return (max 1000)": "Number of records to return (max 1000)",
"Number of records to skip for pagination": "Number of records to skip for pagination",
"Search query to filter tags (optional - if empty, returns all tags)": "Search query to filter tags (optional - if empty, returns all tags)",
"Email address of the subscriber to search for": "Email address of the subscriber to search for",
"Fields to include in the response (leave empty for all fields). Use dot notation for nested fields (e.g., \"merge_fields.FNAME\")": "Fields to include in the response (leave empty for all fields). Use dot notation for nested fields (e.g., \"merge_fields.FNAME\")",
"Fields to exclude from the response. Use dot notation for nested fields": "Fields to exclude from the response. Use dot notation for nested fields",
"Subscribed": "Subscribed",
"Unsubscribed": "Unsubscribed",
"Cleaned": "Cleaned",
"Pending": "待處理",
"Transactional": "Transactional",
"HTML": "HTML",
"Text": "文本",
"Regular": "Regular",
"Plain Text": "Plain Text",
"A/B Test": "A/B Test",
"RSS": "RSS",
"Variate": "Variate",
"Template": "模板",
"URL": "URL",
"Multichannel": "Multichannel",
"Member Subscribed to Audience": "Member Subscribed to Audience",
"Member Unsubscribed from Audience": "Member Unsubscribed from Audience",
"New Campaign": "New Campaign",
"Link Clicked": "Link Clicked",
"Email Opened": "Email Opened",
"Subscriber Updated": "Subscriber Updated",
"New Customer": "New Customer",
"New Order": "New Order",
"New Segment Tag Subscriber": "New Segment Tag Subscriber",
"Fires when a new subscriber joins your Mailchimp audience. This trigger captures new subscriptions, opt-ins, and audience growth events with comprehensive subscriber information.": "Fires when a new subscriber joins your Mailchimp audience. This trigger captures new subscriptions, opt-ins, and audience growth events with comprehensive subscriber information.",
"Fires when a subscriber unsubscribes from your Mailchimp audience. This trigger captures unsubscribe events, opt-outs, and audience churn with comprehensive subscriber information for retention analysis.": "Fires when a subscriber unsubscribes from your Mailchimp audience. This trigger captures unsubscribe events, opt-outs, and audience churn with comprehensive subscriber information for retention analysis.",
"Fires when a new campaign is created or sent": "Fires when a new campaign is created or sent",
"Fires when a recipient clicks a specified link in a campaign": "Fires when a recipient clicks a specified link in a campaign",
"Fires when a recipient opens a an email in a specific campaign": "Fires when a recipient opens a an email in a specific campaign",
"Fires when a subscriber profile is updated, including changes to merge fields, interests, or contact information. This trigger captures profile updates, new subscriptions, and subscriber modifications.": "Fires when a subscriber profile is updated, including changes to merge fields, interests, or contact information. This trigger captures profile updates, new subscriptions, and subscriber modifications.",
"Fires when a new customer is added to a connected store": "Fires when a new customer is added to a connected store",
"Fires when a new order is created in the connected store": "Fires when a new order is created in the connected store",
"Fires when a subscriber joins a specific segment or tag": "Fires when a subscriber joins a specific segment or tag",
"Segment ID (Optional)": "Segment ID (Optional)",
"Tag Name (Optional)": "Tag Name (Optional)",
"The specific segment ID to monitor. Leave empty to monitor all segments.": "The specific segment ID to monitor. Leave empty to monitor all segments.",
"The specific tag name to monitor. Leave empty to monitor all tags.": "The specific tag name to monitor. Leave empty to monitor all tags."
}

View File

@@ -0,0 +1,71 @@
import { PieceAuth, createPiece } from '@activepieces/pieces-framework';
import { addMemberToList } from './lib/actions/add-member-to-list';
import { addNoteToSubscriber } from './lib/actions/add-note-to-subscriber';
import { removeSubscriberFromTag } from './lib/actions/remove-subscriber-from-tag';
import { updateSubscriberInList } from './lib/actions/update-subscriber-status';
import { addSubscriberToTag } from './lib/actions/add-subscriber-to-tag';
import { createCampaign } from './lib/actions/create-campaign';
import { getCampaignReport } from './lib/actions/get-campaign-report';
import { createAudience } from './lib/actions/create-audience';
import { archiveSubscriber } from './lib/actions/archive-subscriber';
import { unsubscribeEmail } from './lib/actions/unsubscribe-email';
import { findCampaign } from './lib/actions/find-campaign';
import { findCustomer } from './lib/actions/find-customer';
import { findTag } from './lib/actions/find-tag';
import { findSubscriber } from './lib/actions/find-subscriber';
import { PieceCategory } from '@activepieces/shared';
import { mailChimpSubscribeTrigger } from './lib/triggers/subscribe-trigger';
import { mailChimpUnsubscriberTrigger } from './lib/triggers/unsubscribe-trigger';
import { mailChimpNewCampaignTrigger } from './lib/triggers/new-campaign-trigger';
import { mailChimpLinkClickedTrigger } from './lib/triggers/link-clicked-trigger';
import { mailChimpEmailOpenedTrigger } from './lib/triggers/email-opened-trigger';
import { mailChimpSubscriberUpdatedTrigger } from './lib/triggers/subscriber-updated-trigger';
import { mailChimpNewCustomerTrigger } from './lib/triggers/new-customer-trigger';
import { mailChimpNewOrderTrigger } from './lib/triggers/new-order-trigger';
import { mailChimpNewSegmentTagSubscriberTrigger } from './lib/triggers/new-segment-tag-subscriber-trigger';
export const mailchimpAuth = PieceAuth.OAuth2({
description: '',
authUrl: 'https://login.mailchimp.com/oauth2/authorize',
tokenUrl: 'https://login.mailchimp.com/oauth2/token',
required: true,
scope: [],
});
export const mailchimp = createPiece({
displayName: 'Mailchimp',
description: 'All-in-One integrated marketing platform for managing audiences, sending campaigns, tracking engagement, and automating lifecycle communications.',
minimumSupportedRelease: '0.30.0',
logoUrl: 'https://cdn.activepieces.com/pieces/mailchimp.png',
authors: ["abdullahranginwala","TaskMagicKyle","kishanprmr","AbdulTheActivePiecer","khaledmashaly","abuaboud", "sparkybug", "onyedikachi-david"],
categories: [PieceCategory.MARKETING],
auth: mailchimpAuth,
actions: [
addMemberToList,
addNoteToSubscriber,
addSubscriberToTag,
removeSubscriberFromTag,
updateSubscriberInList,
createCampaign,
getCampaignReport,
createAudience,
archiveSubscriber,
unsubscribeEmail,
findCampaign,
findCustomer,
findTag,
findSubscriber,
],
triggers: [
mailChimpSubscribeTrigger,
mailChimpUnsubscriberTrigger,
mailChimpNewCampaignTrigger,
mailChimpLinkClickedTrigger,
mailChimpEmailOpenedTrigger,
mailChimpSubscriberUpdatedTrigger,
mailChimpNewCustomerTrigger,
mailChimpNewOrderTrigger,
mailChimpNewSegmentTagSubscriberTrigger,
],
});

View File

@@ -0,0 +1,178 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpCommon } from '../common';
import { mailchimpAuth } from '../..';
import mailchimp from '@mailchimp/mailchimp_marketing';
import { MailchimpClient } from '../common/types';
import crypto from 'crypto';
export const addMemberToList = createAction({
auth: mailchimpAuth,
name: 'add_member_to_list',
displayName: 'Add or Update Subscriber',
description: 'Add a new subscriber to an audience or update existing subscriber',
props: {
list_id: mailchimpCommon.mailChimpListIdDropdown,
email_address: Property.ShortText({
displayName: 'Email Address',
description: 'Email address for the subscriber',
required: true,
}),
status_if_new: Property.StaticDropdown({
displayName: 'Status if New',
description: 'Status for new subscribers',
required: true,
options: {
options: [
{ label: 'Subscribed', value: 'subscribed' },
{ label: 'Unsubscribed', value: 'unsubscribed' },
{ label: 'Cleaned', value: 'cleaned' },
{ label: 'Pending', value: 'pending' },
{ label: 'Transactional', value: 'transactional' },
],
},
}),
email_type: Property.StaticDropdown({
displayName: 'Email Type',
description: 'Type of email this member wants to receive',
required: false,
options: {
options: [
{ label: 'HTML', value: 'html' },
{ label: 'Text', value: 'text' },
],
},
}),
status: Property.StaticDropdown({
displayName: 'Status',
description: 'Current status of subscriber (for updates)',
required: false,
options: {
options: [
{ label: 'Subscribed', value: 'subscribed' },
{ label: 'Unsubscribed', value: 'unsubscribed' },
{ label: 'Cleaned', value: 'cleaned' },
{ label: 'Pending', value: 'pending' },
{ label: 'Transactional', value: 'transactional' },
],
},
}),
first_name: Property.ShortText({
displayName: 'First Name',
description: 'First name of the subscriber',
required: false,
}),
last_name: Property.ShortText({
displayName: 'Last Name',
description: 'Last name of the subscriber',
required: false,
}),
language: Property.ShortText({
displayName: 'Language',
description: 'Subscriber language (e.g., "en", "es", "fr")',
required: false,
}),
vip: Property.Checkbox({
displayName: 'VIP',
description: 'VIP status for subscriber',
required: false,
defaultValue: false,
}),
skip_merge_validation: Property.Checkbox({
displayName: 'Skip Merge Validation',
description: 'Accept member data without merge field values even if required',
required: false,
defaultValue: false,
}),
},
async run(context) {
const accessToken = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
const client = mailchimp as unknown as MailchimpClient;
client.setConfig({
accessToken: accessToken,
server: server,
});
try {
const subscriberHash = crypto.createHash('md5').update(context.propsValue.email_address.toLowerCase()).digest('hex');
const memberData: any = {
email_address: context.propsValue.email_address,
status_if_new: context.propsValue.status_if_new,
};
if (context.propsValue.email_type) {
memberData.email_type = context.propsValue.email_type;
}
if (context.propsValue.status) {
memberData.status = context.propsValue.status;
}
if (context.propsValue.first_name || context.propsValue.last_name) {
memberData.merge_fields = {};
if (context.propsValue.first_name) {
memberData.merge_fields.FNAME = context.propsValue.first_name;
}
if (context.propsValue.last_name) {
memberData.merge_fields.LNAME = context.propsValue.last_name;
}
}
if (context.propsValue.language) {
memberData.language = context.propsValue.language;
}
if (context.propsValue.vip !== undefined) {
memberData.vip = context.propsValue.vip;
}
const queryParams: any = {};
if (context.propsValue.skip_merge_validation) {
queryParams.skip_merge_validation = true;
}
const member = await client.lists.setListMember(
context.propsValue.list_id!,
subscriberHash,
memberData,
queryParams
);
return {
success: true,
id: member.id,
email_address: member.email_address,
unique_email_id: member.unique_email_id,
contact_id: member.contact_id,
full_name: member.full_name,
web_id: member.web_id,
email_type: member.email_type,
status: member.status,
merge_fields: member.merge_fields,
interests: member.interests,
stats: member.stats,
ip_signup: member.ip_signup,
timestamp_signup: member.timestamp_signup,
ip_opt: member.ip_opt,
timestamp_opt: member.timestamp_opt,
member_rating: member.member_rating,
last_changed: member.last_changed,
language: member.language,
vip: member.vip,
email_client: member.email_client,
location: member.location,
marketing_permissions: member.marketing_permissions,
source: member.source,
tags_count: member.tags_count,
tags: member.tags,
list_id: member.list_id,
_links: member._links,
};
} catch (error: any) {
throw new Error(`Failed to add or update subscriber: ${error.message || JSON.stringify(error)}`);
}
},
});

View File

@@ -0,0 +1,89 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpCommon } from '../common';
import { mailchimpAuth } from '../..';
export const addNoteToSubscriber = createAction({
auth: mailchimpAuth,
name: 'add_note_to_subscriber',
displayName: 'Add Note to Subscriber',
description: 'Add a note to a subscriber in your Mailchimp audience.',
props: {
list_id: mailchimpCommon.mailChimpListIdDropdown,
email: Property.ShortText({
displayName: 'Email Address',
description: 'The email address of the subscriber to add a note to',
required: true,
}),
note: Property.LongText({
displayName: 'Note Content',
description: 'The note content to add to the subscriber',
required: true,
}),
},
async run(context) {
const { list_id, email, note } = context.propsValue;
const accessToken = getAccessTokenOrThrow(context.auth);
try {
const serverPrefix = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
const subscriberHash = mailchimpCommon.getMD5EmailHash(email);
const url = `https://${serverPrefix}.api.mailchimp.com/3.0/lists/${list_id}/members/${subscriberHash}/notes`;
const response = await fetch(url, {
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
note: note,
}),
});
if (!response.ok) {
let errorMessage = `HTTP ${response.status}: ${response.statusText}`;
try {
const errorText = await response.text();
if (errorText && errorText.trim()) {
const errorData = JSON.parse(errorText);
errorMessage = errorData.detail || errorData.title || errorData.message || errorText;
}
} catch (parseError) {
const errorText = await response.text();
if (errorText && errorText.trim()) {
errorMessage = errorText;
}
}
throw new Error(`Failed to add note to subscriber: ${errorMessage}`);
}
let result;
try {
const responseText = await response.text();
if (responseText && responseText.trim()) {
result = JSON.parse(responseText);
} else {
result = { success: true };
}
} catch (parseError) {
result = { success: true };
}
return {
success: true,
message: `Successfully added note to subscriber ${email}`,
note_id: result.id,
note_content: result.note,
created_at: result.created_at,
_links: result._links || [],
};
} catch (error: any) {
console.error('Error adding note to subscriber:', error);
throw new Error(`Failed to add note to subscriber: ${error.message}`);
}
},
});

View File

@@ -0,0 +1,64 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpCommon } from '../common';
import { MailchimpClient } from '../common/types';
import { mailchimpAuth } from '../..';
import mailchimp from '@mailchimp/mailchimp_marketing';
export const addSubscriberToTag = createAction({
auth: mailchimpAuth,
name: 'add_subscriber_to_tag',
displayName: 'Add Subscriber to Tag',
description: 'Add a subscriber to a specific tag in your Mailchimp audience.',
props: {
list_id: mailchimpCommon.mailChimpListIdDropdown,
email: Property.ShortText({
displayName: 'Email Address',
description: 'The email address of the subscriber to add to the tag',
required: true,
}),
tag_name: Property.ShortText({
displayName: 'Tag Name',
description: 'The name of the tag to add the subscriber to',
required: true,
}),
},
async run(context) {
const { list_id, email, tag_name } = context.propsValue;
const accessToken = getAccessTokenOrThrow(context.auth);
try {
const serverPrefix = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
const subscriberHash = mailchimpCommon.getMD5EmailHash(email);
mailchimp.setConfig({
accessToken: accessToken,
server: serverPrefix,
});
const client = mailchimp as unknown as MailchimpClient;
const result = await client.lists.updateListMemberTags(
list_id as string,
subscriberHash,
{
tags: [
{
name: tag_name,
status: 'active',
},
],
}
);
return {
success: true,
message: `Successfully added subscriber ${email} to tag ${tag_name}`,
data: result,
};
} catch (error: any) {
console.error('Error adding subscriber to tag:', error);
throw new Error(`Failed to add subscriber to tag: ${error.message}`);
}
},
});

View File

@@ -0,0 +1,62 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpCommon } from '../common';
import { mailchimpAuth } from '../..';
import mailchimp from '@mailchimp/mailchimp_marketing';
import { MailchimpClient } from '../common/types';
import crypto from 'crypto';
export const archiveSubscriber = createAction({
auth: mailchimpAuth,
name: 'archive_subscriber',
displayName: 'Archive Subscriber',
description: 'Archive an existing audience member',
props: {
list_id: mailchimpCommon.mailChimpListIdDropdown,
subscriber_hash: Property.ShortText({
displayName: 'Subscriber Hash or Email',
description: 'MD5 hash of the lowercase email address, email address, or contact_id',
required: true,
}),
},
async run(context) {
const accessToken = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
const client = mailchimp as unknown as MailchimpClient;
client.setConfig({
accessToken: accessToken,
server: server,
});
try {
let subscriberHash = context.propsValue.subscriber_hash;
// If it looks like an email, convert to MD5 hash
if (subscriberHash.includes('@')) {
subscriberHash = crypto.createHash('md5').update(subscriberHash.toLowerCase()).digest('hex');
}
await client.lists.deleteListMember(context.propsValue.list_id!, subscriberHash);
return {
success: true,
message: 'Subscriber archived successfully',
list_id: context.propsValue.list_id,
subscriber_hash: subscriberHash,
archived_at: new Date().toISOString(),
};
} catch (error: any) {
if (error.status === 404) {
return {
success: false,
error: 'Subscriber not found',
message: 'The subscriber could not be found in the specified list.',
detail: error.detail || 'The requested resource could not be found',
};
}
throw new Error(`Failed to archive subscriber: ${error.message || JSON.stringify(error)}`);
}
},
});

View File

@@ -0,0 +1,190 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpCommon } from '../common';
import { mailchimpAuth } from '../..';
import mailchimp from '@mailchimp/mailchimp_marketing';
import { MailchimpClient } from '../common/types';
export const createAudience = createAction({
auth: mailchimpAuth,
name: 'create_audience',
displayName: 'Create Audience',
description: 'Create a new audience (list) in your Mailchimp account',
props: {
name: Property.ShortText({
displayName: 'List Name',
description: 'The name of the list',
required: true,
}),
company: Property.ShortText({
displayName: 'Company',
description: 'Company name for list contact information',
required: true,
}),
address1: Property.ShortText({
displayName: 'Address Line 1',
description: 'Street address for list contact information',
required: true,
}),
address2: Property.ShortText({
displayName: 'Address Line 2',
description: 'Additional address information (optional)',
required: false,
}),
city: Property.ShortText({
displayName: 'City',
description: 'City for list contact information',
required: true,
}),
state: Property.ShortText({
displayName: 'State/Province',
description: 'State or province for list contact information',
required: false,
}),
zip: Property.ShortText({
displayName: 'ZIP/Postal Code',
description: 'ZIP or postal code for list contact information',
required: false,
}),
country: Property.ShortText({
displayName: 'Country',
description: 'Country for list contact information',
required: true,
}),
phone: Property.ShortText({
displayName: 'Phone',
description: 'Phone number for list contact information (optional)',
required: false,
}),
permission_reminder: Property.LongText({
displayName: 'Permission Reminder',
description: 'The permission reminder for the list',
required: true,
defaultValue: 'You are receiving this email because you signed up for updates from us.',
}),
from_name: Property.ShortText({
displayName: 'Default From Name',
description: 'Default from name for campaigns',
required: true,
}),
from_email: Property.ShortText({
displayName: 'Default From Email',
description: 'Default from email address for campaigns',
required: true,
}),
subject: Property.ShortText({
displayName: 'Default Subject',
description: 'Default subject line for campaigns',
required: true,
}),
language: Property.ShortText({
displayName: 'Language',
description: 'Default language for campaigns (e.g., "en", "es", "fr")',
required: true,
defaultValue: 'en',
}),
email_type_option: Property.Checkbox({
displayName: 'Email Type Option',
description: 'Whether the list supports multiple email formats (HTML/plain text)',
required: false,
defaultValue: true,
}),
use_archive_bar: Property.Checkbox({
displayName: 'Use Archive Bar',
description: 'Whether campaigns use the Archive Bar in archives by default',
required: false,
defaultValue: false,
}),
notify_on_subscribe: Property.ShortText({
displayName: 'Notify on Subscribe',
description: 'Email address to send subscribe notifications to (optional)',
required: false,
}),
notify_on_unsubscribe: Property.ShortText({
displayName: 'Notify on Unsubscribe',
description: 'Email address to send unsubscribe notifications to (optional)',
required: false,
}),
double_optin: Property.Checkbox({
displayName: 'Double Opt-in',
description: 'Whether to require subscriber confirmation via email',
required: false,
defaultValue: false,
}),
marketing_permissions: Property.Checkbox({
displayName: 'Marketing Permissions',
description: 'Whether the list has marketing permissions (GDPR) enabled',
required: false,
defaultValue: false,
}),
},
async run(context) {
const accessToken = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
const client = mailchimp as unknown as MailchimpClient;
client.setConfig({
accessToken: accessToken,
server: server,
});
try {
const listData = {
name: context.propsValue.name,
contact: {
company: context.propsValue.company,
address1: context.propsValue.address1,
address2: context.propsValue.address2 || '',
city: context.propsValue.city,
state: context.propsValue.state || '',
zip: context.propsValue.zip || '',
country: context.propsValue.country,
phone: context.propsValue.phone || '',
},
permission_reminder: context.propsValue.permission_reminder,
campaign_defaults: {
from_name: context.propsValue.from_name,
from_email: context.propsValue.from_email,
subject: context.propsValue.subject,
language: context.propsValue.language,
},
email_type_option: context.propsValue.email_type_option,
use_archive_bar: context.propsValue.use_archive_bar,
notify_on_subscribe: context.propsValue.notify_on_subscribe || '',
notify_on_unsubscribe: context.propsValue.notify_on_unsubscribe || '',
double_optin: context.propsValue.double_optin,
marketing_permissions: context.propsValue.marketing_permissions,
};
const list = await client.lists.createList(listData);
return {
success: true,
id: list.id,
web_id: list.web_id,
name: list.name,
contact: list.contact,
permission_reminder: list.permission_reminder,
use_archive_bar: list.use_archive_bar,
campaign_defaults: list.campaign_defaults,
notify_on_subscribe: list.notify_on_subscribe,
notify_on_unsubscribe: list.notify_on_unsubscribe,
date_created: list.date_created,
list_rating: list.list_rating,
email_type_option: list.email_type_option,
subscribe_url_short: list.subscribe_url_short,
subscribe_url_long: list.subscribe_url_long,
beamer_address: list.beamer_address,
visibility: list.visibility,
double_optin: list.double_optin,
has_welcome: list.has_welcome,
marketing_permissions: list.marketing_permissions,
modules: list.modules,
stats: list.stats,
_links: list._links,
};
} catch (error: any) {
throw new Error(`Failed to create list: ${error.message || JSON.stringify(error)}`);
}
},
});

View File

@@ -0,0 +1,153 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpCommon } from '../common';
import { mailchimpAuth } from '../..';
import mailchimp from '@mailchimp/mailchimp_marketing';
import { MailchimpClient, CampaignCreateData, CampaignContentData } from '../common/types';
export const createCampaign = createAction({
auth: mailchimpAuth,
name: 'create_campaign',
displayName: 'Create Campaign',
description: 'Create a new Mailchimp campaign',
props: {
campaign_type: Property.StaticDropdown({
displayName: 'Campaign Type',
description: 'The type of campaign to create',
required: true,
options: {
options: [
{ label: 'Regular', value: 'regular' },
{ label: 'Plain Text', value: 'plaintext' },
{ label: 'A/B Test', value: 'ab' },
{ label: 'RSS', value: 'rss' },
{ label: 'Variate', value: 'variate' },
],
},
}),
list_id: mailchimpCommon.mailChimpListIdDropdown,
subject_line: Property.ShortText({
displayName: 'Subject Line',
description: 'The subject line for the campaign',
required: true,
}),
title: Property.ShortText({
displayName: 'Campaign Title',
description: 'The title of the campaign',
required: true,
}),
from_name: Property.ShortText({
displayName: 'From Name',
description: 'The name that will appear in the "From" field',
required: true,
}),
from_email: Property.ShortText({
displayName: 'From Email',
description: 'The email address that will appear in the "From" field',
required: true,
}),
reply_to: Property.ShortText({
displayName: 'Reply To Email',
description: 'The email address that will receive replies',
required: true,
}),
to_name: Property.ShortText({
displayName: 'To Name',
description: 'The name that will appear in the "To" field (e.g., *|FNAME|*)',
required: false,
}),
content_type: Property.StaticDropdown({
displayName: 'Content Type',
description: 'How the campaign content is put together',
required: true,
options: {
options: [
{ label: 'Template', value: 'template' },
{ label: 'HTML', value: 'html' },
{ label: 'URL', value: 'url' },
{ label: 'Multichannel', value: 'multichannel' },
],
},
}),
content_url: Property.ShortText({
displayName: 'Content URL',
description: 'The URL where the campaign content is hosted (required if content_type is "url")',
required: false,
}),
template_id: Property.ShortText({
displayName: 'Template ID',
description: 'The ID of the template to use (required if content_type is "template")',
required: false,
}),
html_content: Property.LongText({
displayName: 'HTML Content',
description: 'The HTML content for the campaign (required if content_type is "html")',
required: false,
}),
},
async run(context) {
const accessToken = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
try {
const client = mailchimp as unknown as MailchimpClient;
client.setConfig({
accessToken: accessToken,
server: server,
});
const campaignData: CampaignCreateData = {
type: context.propsValue.campaign_type,
recipients: {
list_id: context.propsValue.list_id as string,
},
settings: {
subject_line: context.propsValue.subject_line,
title: context.propsValue.title,
from_name: context.propsValue.from_name,
from_email: context.propsValue.from_email,
reply_to: context.propsValue.reply_to,
to_name: context.propsValue.to_name || '',
},
};
const campaign = await client.campaigns.create(campaignData);
// Set campaign content based on content type
const contentData: CampaignContentData = {};
if (context.propsValue.content_type === 'html' && context.propsValue.html_content) {
contentData.html = context.propsValue.html_content;
} else if (context.propsValue.content_type === 'url' && context.propsValue.content_url) {
contentData.url = context.propsValue.content_url;
} else if (context.propsValue.content_type === 'template' && context.propsValue.template_id) {
contentData.template = {
id: context.propsValue.template_id,
};
}
// Set content if any content data is provided
if (Object.keys(contentData).length > 0) {
await client.campaigns.setContent(campaign.id, contentData);
}
return {
success: true,
campaign_id: campaign.id,
campaign_web_id: campaign.web_id,
campaign_title: campaign.settings?.title,
campaign_subject: campaign.settings?.subject_line,
campaign_status: campaign.status,
campaign_type: campaign.type,
created_at: campaign.create_time,
archive_url: campaign.archive_url,
_links: campaign._links || [],
};
} catch (error: any) {
console.error('Error creating campaign:', error);
throw new Error(`Failed to create campaign: ${error.message || JSON.stringify(error)}`);
}
},
});

View File

@@ -0,0 +1,66 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpCommon } from '../common';
import { mailchimpAuth } from '../..';
import mailchimp from '@mailchimp/mailchimp_marketing';
import { MailchimpClient, CampaignGetOptions } from '../common/types';
export const findCampaign = createAction({
auth: mailchimpAuth,
name: 'find_campaign',
displayName: 'Find Campaign',
description: 'Search all campaigns for the specified query terms',
props: {
query: Property.ShortText({
displayName: 'Search Query',
description: 'Search terms to find campaigns',
required: true,
}),
fields: Property.LongText({
displayName: 'Fields',
description: 'Comma-separated list of fields to return',
required: false,
}),
exclude_fields: Property.LongText({
displayName: 'Exclude Fields',
description: 'Comma-separated list of fields to exclude',
required: false,
}),
},
async run(context) {
const accessToken = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
const client = mailchimp as unknown as MailchimpClient;
client.setConfig({
accessToken: accessToken,
server: server,
});
try {
const searchParams: any = {
query: context.propsValue.query,
};
if (context.propsValue.fields) {
searchParams.fields = context.propsValue.fields.split(',').map(f => f.trim());
}
if (context.propsValue.exclude_fields) {
searchParams.exclude_fields = context.propsValue.exclude_fields.split(',').map(f => f.trim());
}
const searchResult = await client.searchCampaigns.search(searchParams);
return {
success: true,
query: context.propsValue.query,
results: searchResult.results,
total_items: searchResult.total_items,
_links: searchResult._links,
};
} catch (error: any) {
throw new Error(`Failed to search campaigns: ${error.message || JSON.stringify(error)}`);
}
},
});

View File

@@ -0,0 +1,86 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpCommon } from '../common';
import { mailchimpAuth } from '../..';
import mailchimp from '@mailchimp/mailchimp_marketing';
import { MailchimpClient } from '../common/types';
export const findCustomer = createAction({
auth: mailchimpAuth,
name: 'find_customer',
displayName: 'Find Customer',
description: 'Find a customer by email address in a store',
props: {
store_id: mailchimpCommon.mailChimpStoreIdDropdown,
email_address: Property.ShortText({
displayName: 'Email Address',
description: 'Email address to search for',
required: true,
}),
fields: Property.LongText({
displayName: 'Include Fields',
description: 'Comma-separated list of fields to return',
required: false,
}),
exclude_fields: Property.LongText({
displayName: 'Exclude Fields',
description: 'Comma-separated list of fields to exclude',
required: false,
}),
count: Property.Number({
displayName: 'Count',
description: 'Number of records to return (max 1000)',
required: false,
defaultValue: 10,
}),
offset: Property.Number({
displayName: 'Offset',
description: 'Number of records to skip for pagination',
required: false,
defaultValue: 0,
}),
},
async run(context) {
const accessToken = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
const client = mailchimp as unknown as MailchimpClient;
client.setConfig({
accessToken: accessToken,
server: server,
});
try {
const options: any = {
email_address: context.propsValue.email_address,
count: context.propsValue.count || 10,
offset: context.propsValue.offset || 0,
};
if (context.propsValue.fields) {
options.fields = context.propsValue.fields.split(',').map(f => f.trim());
}
if (context.propsValue.exclude_fields) {
options.exclude_fields = context.propsValue.exclude_fields.split(',').map(f => f.trim());
}
const result = await client.ecommerce.getAllStoreCustomers(
context.propsValue.store_id!,
options
);
return {
success: true,
store_id: result.store_id,
customers: result.customers,
total_items: result.total_items,
search_email: context.propsValue.email_address,
found_customers: result.customers.length,
_links: result._links,
};
} catch (error: any) {
throw new Error(`Failed to find customer: ${error.message || JSON.stringify(error)}`);
}
},
});

View File

@@ -0,0 +1,305 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { mailchimpAuth } from '../..';
import { mailchimpCommon } from '../common';
import mailchimp from '@mailchimp/mailchimp_marketing';
export const findSubscriber = createAction({
auth: mailchimpAuth,
name: 'find_subscriber',
displayName: 'Find Subscriber',
description: 'Search for subscribers across all lists or within a specific list. This action provides comprehensive subscriber information including merge fields, interests, and activity data.',
props: {
list_id: mailchimpCommon.mailChimpListIdDropdown,
email: Property.ShortText({
displayName: 'Email Address',
description: 'Email address of the subscriber to search for',
required: true,
}),
include_fields: Property.Array({
displayName: 'Include Fields',
description: 'Fields to include in the response (leave empty for all fields). Use dot notation for nested fields (e.g., "merge_fields.FNAME")',
required: false,
}),
exclude_fields: Property.Array({
displayName: 'Exclude Fields',
description: 'Fields to exclude from the response. Use dot notation for nested fields',
required: false,
}),
},
async run(context) {
const access_token = context.auth.access_token;
const mailChimpServerPrefix = await mailchimpCommon.getMailChimpServerPrefix(access_token);
mailchimp.setConfig({
accessToken: access_token,
server: mailChimpServerPrefix,
});
try {
const searchEmail = context.propsValue.email!;
const listId = context.propsValue.list_id;
const options: any = {};
if (context.propsValue.include_fields && context.propsValue.include_fields.length > 0) {
options.fields = context.propsValue.include_fields.join(',');
}
if (context.propsValue.exclude_fields && context.propsValue.exclude_fields.length > 0) {
options.exclude_fields = context.propsValue.exclude_fields.join(',');
}
if (listId) {
try {
const subscriberHash = mailchimpCommon.getMD5EmailHash(searchEmail);
const subscriber = await (mailchimp as any).lists.getListMember(listId, subscriberHash, options);
return {
success: true,
found: true,
match_type: 'exact',
search_query: searchEmail,
search_scope: `List: ${listId}`,
total_matches: 1,
subscribers: [{
id: subscriber.id,
email_address: subscriber.email_address,
unique_email_id: subscriber.unique_email_id,
email_type: subscriber.email_type,
status: subscriber.status,
merge_fields: subscriber.merge_fields,
interests: subscriber.interests,
stats: subscriber.stats,
ip_signup: subscriber.ip_signup,
timestamp_signup: subscriber.timestamp_signup,
ip_opt: subscriber.ip_opt,
timestamp_opt: subscriber.timestamp_opt,
member_rating: subscriber.member_rating,
last_changed: subscriber.last_changed,
language: subscriber.language,
vip: subscriber.vip,
email_client: subscriber.email_client,
location: subscriber.location,
tags_count: subscriber.tags_count,
list_id: subscriber.list_id,
}],
primary_subscriber: {
id: subscriber.id,
email_address: subscriber.email_address,
status: subscriber.status,
list_id: subscriber.list_id,
full_name: subscriber.merge_fields?.FNAME && subscriber.merge_fields?.LNAME ?
`${subscriber.merge_fields.FNAME} ${subscriber.merge_fields.LNAME}` :
subscriber.merge_fields?.FNAME || subscriber.merge_fields?.LNAME || 'N/A',
company: subscriber.merge_fields?.COMPANY || 'N/A',
phone: subscriber.merge_fields?.PHONE || 'N/A',
member_since: subscriber.timestamp_signup ?
new Date(subscriber.timestamp_signup).toLocaleDateString() : 'N/A',
last_activity: subscriber.last_changed ?
new Date(subscriber.last_changed).toLocaleDateString() : 'N/A',
member_rating: subscriber.member_rating || 0,
vip_status: subscriber.vip ? 'VIP' : 'Standard',
email_type: subscriber.email_type || 'html',
language: subscriber.language || 'en',
},
search_summary: {
query: searchEmail,
scope: `Limited to list: ${listId}`,
exact_matches: 1,
partial_matches: 0,
total_results: 1,
},
};
} catch (listError: any) {
if (listError.status === 404) {
return {
success: true,
found: false,
match_type: 'none',
search_query: searchEmail,
search_scope: `List: ${listId}`,
message: `Subscriber with email "${searchEmail}" not found in the specified list`,
search_summary: {
query: searchEmail,
scope: `Limited to list: ${listId}`,
exact_matches: 0,
partial_matches: 0,
total_results: 0,
suggestions: [
'Verify the email address is spelled correctly',
'Check if the subscriber exists in a different list',
'Ensure the subscriber has not been unsubscribed or deleted',
'Try searching without specifying a list ID to search across all lists',
],
},
};
}
throw listError;
}
} else {
const allLists = await (mailchimp as any).lists.getAllLists({
fields: ['lists.id', 'lists.name'],
count: 1000,
});
const foundSubscribers: any[] = [];
const searchPromises = allLists.lists.map(async (list: any) => {
try {
const subscriberHash = mailchimpCommon.getMD5EmailHash(searchEmail);
const subscriber = await (mailchimp as any).lists.getListMember(list.id, subscriberHash, options);
return {
id: subscriber.id,
email_address: subscriber.email_address,
unique_email_id: subscriber.unique_email_id,
email_type: subscriber.email_type,
status: subscriber.status,
merge_fields: subscriber.merge_fields,
interests: subscriber.interests,
stats: subscriber.stats,
ip_signup: subscriber.ip_signup,
timestamp_signup: subscriber.timestamp_signup,
ip_opt: subscriber.ip_opt,
timestamp_opt: subscriber.timestamp_opt,
member_rating: subscriber.member_rating,
last_changed: subscriber.last_changed,
language: subscriber.language,
vip: subscriber.vip,
email_client: subscriber.email_client,
location: subscriber.location,
tags_count: subscriber.tags_count,
list_id: subscriber.list_id,
list_name: list.name,
};
} catch (error: any) {
if (error.status === 404) {
return null;
}
return {
list_id: list.id,
list_name: list.name,
error: `Failed to check list: ${error.message}`,
};
}
});
const results = await Promise.all(searchPromises);
const validSubscribers = results.filter(result => result && !result.error);
const errors = results.filter(result => result && result.error);
if (validSubscribers.length > 0) {
return {
success: true,
found: true,
match_type: 'exact',
search_query: searchEmail,
search_scope: 'All Lists',
total_matches: validSubscribers.length,
subscribers: validSubscribers,
primary_subscriber: {
id: validSubscribers[0].id,
email_address: validSubscribers[0].email_address,
status: validSubscribers[0].status,
list_id: validSubscribers[0].list_id,
list_name: validSubscribers[0].list_name,
full_name: validSubscribers[0].merge_fields?.FNAME && validSubscribers[0].merge_fields?.LNAME ?
`${validSubscribers[0].merge_fields.FNAME} ${validSubscribers[0].merge_fields.LNAME}` :
validSubscribers[0].merge_fields?.FNAME || validSubscribers[0].merge_fields?.LNAME || 'N/A',
company: validSubscribers[0].merge_fields?.COMPANY || 'N/A',
phone: validSubscribers[0].merge_fields?.PHONE || 'N/A',
member_since: validSubscribers[0].timestamp_signup ?
new Date(validSubscribers[0].timestamp_signup).toLocaleDateString() : 'N/A',
last_activity: validSubscribers[0].last_changed ?
new Date(validSubscribers[0].last_changed).toLocaleDateString() : 'N/A',
member_rating: validSubscribers[0].member_rating || 0,
vip_status: validSubscribers[0].vip ? 'VIP' : 'Standard',
email_type: validSubscribers[0].email_type || 'html',
language: validSubscribers[0].language || 'en',
},
search_summary: {
query: searchEmail,
scope: 'Searched across all lists',
exact_matches: validSubscribers.length,
partial_matches: 0,
total_results: validSubscribers.length,
lists_searched: allLists.lists.length,
search_errors: errors.length > 0 ? errors : undefined,
},
};
} else {
return {
success: true,
found: false,
match_type: 'none',
search_query: searchEmail,
search_scope: 'All Lists',
message: `No subscribers found matching the email: ${searchEmail}`,
search_summary: {
query: searchEmail,
scope: 'Searched across all lists',
exact_matches: 0,
partial_matches: 0,
total_results: 0,
lists_searched: allLists.lists.length,
search_errors: errors.length > 0 ? errors : undefined,
suggestions: [
'Verify the email address is spelled correctly',
'Check if the subscriber exists in a different list',
'Ensure the subscriber has not been unsubscribed or deleted',
'Consider checking if the email was entered with different capitalization',
'Verify the subscriber is not in an archived or deleted list',
],
},
};
}
}
} catch (error: any) {
if (error.status === 400) {
return {
success: false,
error: 'Invalid search request',
message: 'The search request was invalid. This could be due to malformed search parameters or invalid list ID.',
detail: error.detail || 'Bad request',
suggestions: [
'Verify the email address format is correct',
'Check that the list ID (if provided) is valid',
'Ensure all required parameters are provided',
'Validate the field names in include/exclude fields',
],
};
}
if (error.status === 403) {
return {
success: false,
error: 'Access denied',
message: 'You do not have permission to search for subscribers. Check your API key permissions.',
detail: error.detail || 'Forbidden',
suggestions: [
'Verify your API key has the necessary permissions',
'Check that you have access to the specified list (if provided)',
'Ensure your account is active and in good standing',
'Confirm you have subscriber read permissions enabled',
],
};
}
if (error.status === 404 && context.propsValue.list_id) {
return {
success: false,
error: 'List not found',
message: `The list with ID "${context.propsValue.list_id}" could not be found.`,
detail: error.detail || 'The requested resource could not be found',
suggestions: [
'Verify the list ID is correct and exists in your Mailchimp account',
'Check that you have access to the specified list',
'Ensure the list has not been deleted or archived',
'Try searching without specifying a list ID to search across all lists',
],
};
}
throw new Error(`Failed to search for subscriber: ${error.message || JSON.stringify(error)}`);
}
},
});

View File

@@ -0,0 +1,55 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpCommon } from '../common';
import { mailchimpAuth } from '../..';
import mailchimp from '@mailchimp/mailchimp_marketing';
import { MailchimpClient } from '../common/types';
export const findTag = createAction({
auth: mailchimpAuth,
name: 'find_tag',
displayName: 'Find Tag',
description: 'Search for tags on a list by name',
props: {
list_id: mailchimpCommon.mailChimpListIdDropdown,
name: Property.ShortText({
displayName: 'Tag Name',
description: 'Search query to filter tags (optional - if empty, returns all tags)',
required: false,
}),
},
async run(context) {
const accessToken = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
const client = mailchimp as unknown as MailchimpClient;
client.setConfig({
accessToken: accessToken,
server: server,
});
try {
const options: any = {};
if (context.propsValue.name) {
options.name = context.propsValue.name;
}
const result = await client.lists.tagSearch(
context.propsValue.list_id!,
options
);
return {
success: true,
list_id: context.propsValue.list_id,
search_query: context.propsValue.name || 'All tags',
tags: result.tags,
total_items: result.total_items,
found_tags: result.tags.length,
};
} catch (error: any) {
throw new Error(`Failed to find tag: ${error.message || JSON.stringify(error)}`);
}
},
});

View File

@@ -0,0 +1,202 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpAuth } from '../..';
import { mailchimpCommon } from '../common';
import mailchimp from '@mailchimp/mailchimp_marketing';
import { MailchimpClient, CampaignReportOptions } from '../common/types';
export const getCampaignReport = createAction({
auth: mailchimpAuth,
name: 'get_campaign_report',
displayName: 'Get Campaign Report',
description: 'Get comprehensive report details for a specific sent campaign including opens, clicks, bounces, and performance metrics',
props: {
campaign_id: mailchimpCommon.mailChimpCampaignIdDropdown,
fields: Property.LongText({
displayName: 'Include Fields',
description: 'Comma-separated list of fields to return (e.g., "opens.unique_opens,clicks.click_rate")',
required: false,
}),
exclude_fields: Property.LongText({
displayName: 'Exclude Fields',
description: 'Comma-separated list of fields to exclude (e.g., "timeseries,_links")',
required: false,
}),
},
async run(context) {
const accessToken = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
const client = mailchimp as unknown as MailchimpClient;
client.setConfig({
accessToken: accessToken,
server: server,
});
try {
const options: CampaignReportOptions = {};
if (context.propsValue.fields && context.propsValue.fields.trim()) {
options.fields = context.propsValue.fields.trim();
}
if (context.propsValue.exclude_fields && context.propsValue.exclude_fields.trim()) {
options.exclude_fields = context.propsValue.exclude_fields.trim();
}
const report = await client.reports.getCampaignReport(context.propsValue.campaign_id!, options);
return {
success: true,
report: {
id: report.id,
campaign_title: report.campaign_title,
type: report.type,
list_id: report.list_id,
list_is_active: report.list_is_active,
list_name: report.list_name,
subject_line: report.subject_line,
preview_text: report.preview_text,
emails_sent: report.emails_sent,
abuse_reports: report.abuse_reports,
unsubscribed: report.unsubscribed,
send_time: report.send_time,
rss_last_send: report.rss_last_send,
bounces: report.bounces,
forwards: report.forwards,
opens: report.opens,
clicks: report.clicks,
facebook_likes: report.facebook_likes,
industry_stats: report.industry_stats,
list_stats: report.list_stats,
ab_split: report.ab_split,
timewarp: report.timewarp,
timeseries: report.timeseries,
share_report: report.share_report,
ecommerce: report.ecommerce,
delivery_status: report.delivery_status,
_links: report._links,
},
summary: {
campaign_title: report.campaign_title,
subject_line: report.subject_line,
emails_sent: report.emails_sent,
unique_opens: report.opens?.unique_opens || 0,
unique_clicks: report.clicks?.unique_clicks || 0,
open_rate: report.opens?.open_rate || 0,
click_rate: report.clicks?.click_rate || 0,
bounce_rate: report.bounces ? ((report.bounces.hard_bounces + report.bounces.soft_bounces) / report.emails_sent * 100) : 0,
unsub_rate: report.unsubscribed ? (report.unsubscribed / report.emails_sent * 100) : 0,
abuse_rate: report.abuse_reports ? (report.abuse_reports / report.emails_sent * 100) : 0,
},
performance_metrics: {
opens: {
total: report.opens?.opens_total || 0,
unique: report.opens?.unique_opens || 0,
rate: report.opens?.open_rate || 0,
last_open: report.opens?.last_open,
proxy_excluded: {
total: report.opens?.proxy_excluded_opens || 0,
unique: report.opens?.proxy_excluded_unique_opens || 0,
rate: report.opens?.proxy_excluded_open_rate || 0,
},
},
clicks: {
total: report.clicks?.clicks_total || 0,
unique: report.clicks?.unique_clicks || 0,
unique_subscribers: report.clicks?.unique_subscriber_clicks || 0,
rate: report.clicks?.click_rate || 0,
last_click: report.clicks?.last_click,
},
bounces: {
hard: report.bounces?.hard_bounces || 0,
soft: report.bounces?.soft_bounces || 0,
syntax_errors: report.bounces?.syntax_errors || 0,
total: (report.bounces?.hard_bounces || 0) + (report.bounces?.soft_bounces || 0) + (report.bounces?.syntax_errors || 0),
},
engagement: {
forwards: {
count: report.forwards?.forwards_count || 0,
opens: report.forwards?.forwards_opens || 0,
},
facebook_likes: {
recipient_likes: report.facebook_likes?.recipient_likes || 0,
unique_likes: report.facebook_likes?.unique_likes || 0,
facebook_likes: report.facebook_likes?.facebook_likes || 0,
},
},
},
industry_comparison: report.industry_stats ? {
industry_type: report.industry_stats.type,
open_rate: report.industry_stats.open_rate,
click_rate: report.industry_stats.click_rate,
bounce_rate: report.industry_stats.bounce_rate,
unopen_rate: report.industry_stats.unopen_rate,
unsub_rate: report.industry_stats.unsub_rate,
abuse_rate: report.industry_stats.abuse_rate,
} : null,
list_performance: report.list_stats ? {
subscription_rate: report.list_stats.sub_rate,
unsubscription_rate: report.list_stats.unsub_rate,
open_rate: report.list_stats.open_rate,
proxy_excluded_open_rate: report.list_stats.proxy_excluded_open_rate,
click_rate: report.list_stats.click_rate,
} : null,
ecommerce_data: report.ecommerce ? {
total_orders: report.ecommerce.total_orders,
total_spent: report.ecommerce.total_spent,
total_revenue: report.ecommerce.total_revenue,
currency_code: report.ecommerce.currency_code,
} : null,
delivery_status: report.delivery_status ? {
enabled: report.delivery_status.enabled,
can_cancel: report.delivery_status.can_cancel,
status: report.delivery_status.status,
emails_sent: report.delivery_status.emails_sent,
emails_canceled: report.delivery_status.emails_canceled,
} : null,
ab_split_data: report.ab_split ? {
group_a: {
bounces: report.ab_split.a?.bounces || 0,
abuse_reports: report.ab_split.a?.abuse_reports || 0,
unsubs: report.ab_split.a?.unsubs || 0,
recipient_clicks: report.ab_split.a?.recipient_clicks || 0,
forwards: report.ab_split.a?.forwards || 0,
forwards_opens: report.ab_split.a?.forwards_opens || 0,
opens: report.ab_split.a?.opens || 0,
last_open: report.ab_split.a?.last_open,
unique_opens: report.ab_split.a?.unique_opens || 0,
},
group_b: {
bounces: report.ab_split.b?.bounces || 0,
abuse_reports: report.ab_split.b?.abuse_reports || 0,
unsubs: report.ab_split.b?.unsubs || 0,
recipient_clicks: report.ab_split.b?.recipient_clicks || 0,
forwards: report.ab_split.b?.forwards || 0,
forwards_opens: report.ab_split.b?.forwards_opens || 0,
opens: report.ab_split.b?.opens || 0,
last_open: report.ab_split.b?.last_open,
unique_opens: report.ab_split.b?.unique_opens || 0,
},
} : null,
timewarp_data: report.timewarp || [],
timeseries_data: report.timeseries || [],
share_report: report.share_report ? {
share_url: report.share_report.share_url,
share_password: report.share_report.share_password,
} : null,
};
} catch (error: any) {
if (error.status === 404) {
return {
success: false,
error: 'Campaign report not found',
message: 'The requested campaign report could not be found. Make sure the campaign has been sent and the campaign ID is correct.',
detail: error.detail || 'The requested resource could not be found',
};
}
throw new Error(`Failed to get campaign report: ${error.message || JSON.stringify(error)}`);
}
},
});

View File

@@ -0,0 +1,92 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpCommon } from '../common';
import { mailchimpAuth } from '../..';
export const removeSubscriberFromTag = createAction({
auth: mailchimpAuth,
name: 'remove_subscriber_from_tag',
displayName: 'Remove Subscriber from Tag',
description: 'Remove a subscriber from a specific tag in your Mailchimp audience.',
props: {
list_id: mailchimpCommon.mailChimpListIdDropdown,
email: Property.ShortText({
displayName: 'Email Address',
description: 'The email address of the subscriber to remove from the tag',
required: true,
}),
tag_name: Property.ShortText({
displayName: 'Tag Name',
description: 'The name of the tag to remove the subscriber from',
required: true,
}),
},
async run(context) {
const { list_id, email, tag_name } = context.propsValue;
const accessToken = getAccessTokenOrThrow(context.auth);
try {
const serverPrefix = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
const subscriberHash = mailchimpCommon.getMD5EmailHash(email);
const url = `https://${serverPrefix}.api.mailchimp.com/3.0/lists/${list_id}/members/${subscriberHash}/tags`;
const response = await fetch(url, {
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
tags: [
{
name: tag_name,
status: 'inactive',
},
],
}),
});
if (!response.ok) {
let errorMessage = `HTTP ${response.status}: ${response.statusText}`;
try {
const errorText = await response.text();
if (errorText && errorText.trim()) {
const errorData = JSON.parse(errorText);
errorMessage = errorData.detail || errorData.title || errorData.message || errorText;
}
} catch (parseError) {
const errorText = await response.text();
if (errorText && errorText.trim()) {
errorMessage = errorText;
}
}
throw new Error(`Failed to remove subscriber from tag: ${errorMessage}`);
}
let result;
try {
const responseText = await response.text();
if (responseText && responseText.trim()) {
result = JSON.parse(responseText);
} else {
result = { success: true };
}
} catch (parseError) {
result = { success: true };
}
return {
success: true,
message: `Successfully removed subscriber ${email} from tag ${tag_name}`,
data: result,
_links: result._links || [],
};
} catch (error: any) {
console.error('Error removing subscriber from tag:', error);
throw new Error(`Failed to remove subscriber from tag: ${error.message}`);
}
},
});

View File

@@ -0,0 +1,89 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpCommon } from '../common';
import { mailchimpAuth } from '../..';
import mailchimp from '@mailchimp/mailchimp_marketing';
import { MailchimpClient } from '../common/types';
export const unsubscribeEmail = createAction({
auth: mailchimpAuth,
name: 'unsubscribe_email',
displayName: 'Unsubscribe Email',
description: 'Unsubscribe an email address from an audience',
props: {
list_id: mailchimpCommon.mailChimpListIdDropdown,
email_address: Property.ShortText({
displayName: 'Email Address',
description: 'Email address to unsubscribe',
required: true,
}),
skip_merge_validation: Property.Checkbox({
displayName: 'Skip Merge Validation',
description: 'Accept member data without merge field values even if required',
required: false,
defaultValue: false,
}),
skip_duplicate_check: Property.Checkbox({
displayName: 'Skip Duplicate Check',
description: 'Ignore duplicates in the request',
required: false,
defaultValue: false,
}),
update_existing: Property.Checkbox({
displayName: 'Update Existing',
description: 'Change existing members subscription status',
required: false,
defaultValue: true,
}),
},
async run(context) {
const accessToken = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
const client = mailchimp as unknown as MailchimpClient;
client.setConfig({
accessToken: accessToken,
server: server,
});
try {
const batchData = {
members: [
{
email_address: context.propsValue.email_address,
status: 'unsubscribed',
},
],
update_existing: context.propsValue.update_existing,
};
const queryParams: any = {};
if (context.propsValue.skip_merge_validation) {
queryParams.skip_merge_validation = true;
}
if (context.propsValue.skip_duplicate_check) {
queryParams.skip_duplicate_check = true;
}
const result = await client.lists.batchListMembers(
context.propsValue.list_id!,
batchData,
queryParams
);
return {
success: true,
message: `Email ${context.propsValue.email_address} has been unsubscribed`,
new_members: result.new_members,
updated_members: result.updated_members,
errors: result.errors,
total_created: result.total_created,
total_updated: result.total_updated,
error_count: result.error_count,
_links: result._links,
};
} catch (error: any) {
throw new Error(`Failed to unsubscribe email: ${error.message || JSON.stringify(error)}`);
}
},
});

View File

@@ -0,0 +1,51 @@
import { mailchimpCommon } from '../common';
import mailchimp from '@mailchimp/mailchimp_marketing';
import { createAction, Property } from '@activepieces/pieces-framework';
import { mailchimpAuth } from '../..';
export const updateSubscriberInList = createAction({
auth: mailchimpAuth,
name: 'update_member_in_list',
displayName: 'Update Member in an Audience (List)',
description: 'Update a member in an existing Mailchimp audience (list)',
props: {
email: Property.ShortText({
displayName: 'Email',
description: 'Email of the new contact',
required: true,
}),
list_id: mailchimpCommon.mailChimpListIdDropdown,
status: Property.StaticDropdown<
'subscribed' | 'unsubscribed' | 'cleaned' | 'pending' | 'transactional'
>({
displayName: 'Status',
required: true,
options: {
options: [
{ label: 'Subscribed', value: 'subscribed' },
{ label: 'Unsubscribed', value: 'unsubscribed' },
{ label: 'Cleaned', value: 'cleaned' },
{ label: 'Pending', value: 'pending' },
{ label: 'Transactional', value: 'transactional' },
],
},
}),
},
async run(context) {
const { list_id, email, status } = context.propsValue;
const access_token = context.auth.access_token;
const mailChimpServerPrefix =
await mailchimpCommon.getMailChimpServerPrefix(access_token);
mailchimp.setConfig({
accessToken: access_token,
server: mailChimpServerPrefix,
});
return await mailchimp.lists.updateListMember(
list_id as string,
email!,
{
status: status!,
}
);
},
});

View File

@@ -0,0 +1,232 @@
import { Property, OAuth2PropertyValue } from '@activepieces/pieces-framework';
import {
HttpRequest,
HttpMethod,
httpClient,
} from '@activepieces/pieces-common';
import mailchimp from '@mailchimp/mailchimp_marketing';
import { AuthenticationType } from '@activepieces/pieces-common';
import crypto from 'crypto';
import { mailchimpAuth } from '../..';
export const mailchimpCommon = {
mailChimpListIdDropdown: Property.Dropdown<string,true,typeof mailchimpAuth>({
auth: mailchimpAuth,
displayName: 'Audience',
refreshers: [],
description: 'Audience you want to add the contact to',
required: true,
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please select a connection',
};
}
const authProp = auth as OAuth2PropertyValue;
const listResponse = (await mailchimpCommon.getUserLists(
authProp
)) as any;
const options = listResponse.lists.map((list: any) => ({
label: list.name,
value: list.id,
}));
return {
disabled: false,
options,
};
},
}),
getUserLists: async (authProp: OAuth2PropertyValue) => {
const access_token = authProp.access_token;
const mailChimpServerPrefix =
await mailchimpCommon.getMailChimpServerPrefix(access_token!);
mailchimp.setConfig({
accessToken: access_token,
server: mailChimpServerPrefix,
});
// mailchimp types are not complete this is from the docs.
return await (mailchimp as any).lists.getAllLists({
fields: ['lists.id', 'lists.name', 'total_items'],
count: 1000,
});
},
mailChimpCampaignIdDropdown: Property.Dropdown<string,true,typeof mailchimpAuth >({
auth: mailchimpAuth,
displayName: 'Campaign',
refreshers: [],
description: 'Select the campaign to get information for',
required: true,
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please select a connection',
};
}
const authProp = auth as OAuth2PropertyValue;
const campaignResponse = (await mailchimpCommon.getUserCampaigns(
authProp
)) as any;
const options = campaignResponse.campaigns.map((campaign: any) => ({
label: `${campaign.settings?.title || campaign.id} (${campaign.status})`,
value: campaign.id,
}));
return {
disabled: false,
options,
};
},
}),
getUserCampaigns: async (authProp: OAuth2PropertyValue) => {
const access_token = authProp.access_token;
const mailChimpServerPrefix =
await mailchimpCommon.getMailChimpServerPrefix(access_token!);
mailchimp.setConfig({
accessToken: access_token,
server: mailChimpServerPrefix,
});
// Get campaigns with essential fields for dropdown
return await (mailchimp as any).campaigns.list({
fields: ['campaigns.id', 'campaigns.settings.title', 'campaigns.status', 'total_items'],
count: 1000,
});
},
mailChimpStoreIdDropdown: Property.Dropdown<string,true,typeof mailchimpAuth >({
auth: mailchimpAuth,
displayName: 'Store',
refreshers: [],
description: 'Select the e-commerce store',
required: true,
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please select a connection',
};
}
const authProp = auth as OAuth2PropertyValue;
const storeResponse = (await mailchimpCommon.getUserStores(
authProp
)) as any;
const options = storeResponse.stores.map((store: any) => ({
label: `${store.name} (${store.id})`,
value: store.id,
}));
return {
disabled: false,
options,
};
},
}),
getUserStores: async (authProp: OAuth2PropertyValue) => {
const access_token = authProp.access_token;
const mailChimpServerPrefix =
await mailchimpCommon.getMailChimpServerPrefix(access_token!);
mailchimp.setConfig({
accessToken: access_token,
server: mailChimpServerPrefix,
});
// Get stores with essential fields for dropdown
return await (mailchimp as any).ecommerce.stores({
fields: ['stores.id', 'stores.name', 'total_items'],
count: 1000,
});
},
getMailChimpServerPrefix: async (access_token: string) => {
const mailChimpMetaDataRequest: HttpRequest<{ dc: string }> = {
method: HttpMethod.GET,
url: 'https://login.mailchimp.com/oauth2/metadata',
headers: {
Authorization: `OAuth ${access_token}`,
},
};
return (await httpClient.sendRequest(mailChimpMetaDataRequest)).body['dc'];
},
enableWebhookRequest: async ({
server,
token,
listId,
webhookUrl,
events,
}: EnableTriggerRequestParams): Promise<string> => {
const response = await httpClient.sendRequest<EnableTriggerResponse>({
method: HttpMethod.POST,
url: `https://${server}.api.mailchimp.com/3.0/lists/${listId}/webhooks`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token,
},
body: {
url: webhookUrl,
events,
sources: {
user: true,
admin: true,
api: true,
},
},
});
const { id: webhookId } = response.body;
return webhookId;
},
disableWebhookRequest: async ({
server,
token,
listId,
webhookId,
}: DisableTriggerRequestParams): Promise<void> => {
await httpClient.sendRequest<EnableTriggerResponse>({
method: HttpMethod.DELETE,
url: `https://${server}.api.mailchimp.com/3.0/lists/${listId}/webhooks/${webhookId}`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token,
},
});
},
getMD5EmailHash: (email: string) => {
return crypto.createHash('md5').update(email.toLowerCase()).digest('hex');
},
};
type TriggerRequestParams = {
server: string;
token: string;
listId: string;
};
type EnableTriggerRequestParams = TriggerRequestParams & {
webhookUrl: string;
events: object;
};
type DisableTriggerRequestParams = TriggerRequestParams & {
webhookId: string;
};
type EnableTriggerResponse = {
id: string;
url: string;
list_id: string;
};

View File

@@ -0,0 +1,387 @@
export enum MailChimpWebhookType {
/**
* triggers when a list subscriber is added.
*/
SUBSCRIBE = 'subscribe',
/**
* triggers when a list member unsubscribes.
*/
UNSUBSCRIBE = 'unsubscribe',
/**
* triggers when a subscriber's profile is updated.
*/
PROFILE = 'profile',
/**
* triggers when a subscriber's email address is cleaned from the list.
*/
CLEANED = 'cleaned',
/**
* triggers when a subscriber's email address is changed.
*/
UP_EMAIL = 'upemail',
/**
* triggers when a campaign is sent or cancelled.
*/
CAMPAIGN = 'campaign',
/**
* triggers when a subscriber's email address is changed.
*/
PENDING = 'pending',
/**
* transactional
*/
TRANSACTIONAL = 'transactional',
/**
* triggers when a subscriber clicks a link in a campaign.
*/
CLICK = 'click',
/**
* triggers when a subscriber opens an email in a campaign.
*/
OPEN = 'open',
}
export enum MailChimpEmailType {
HTML = 'html',
TEXT = 'text',
}
export type MailChimpWebhookRequest<Type extends MailChimpWebhookType, Data> = {
type: Type;
fired_at: string;
data: Data;
};
export type MailChimpSubscribeWebhookData = {
id: string;
list_id: string;
email: string;
email_type: MailChimpEmailType;
ip_opt: string;
ip_signup: string;
merges: Record<string, string>;
};
export type MailChimpSubscribeWebhookRequest = MailChimpWebhookRequest<
MailChimpWebhookType.SUBSCRIBE,
MailChimpSubscribeWebhookData
>;
export type MailChimpClickWebhookData = {
id: string;
list_id: string;
campaign_id: string;
email: string;
url: string;
ip: string;
user_agent: string;
timestamp?: string;
link_id?: string;
click_count?: number;
is_first_click?: boolean;
};
export type MailChimpClickWebhookRequest = MailChimpWebhookRequest<
MailChimpWebhookType.CLICK,
MailChimpClickWebhookData
>;
export type MailChimpOpenWebhookData = {
id: string;
list_id: string;
campaign_id: string;
email: string;
ip: string;
user_agent: string;
timestamp: string;
};
export type MailChimpOpenWebhookRequest = MailChimpWebhookRequest<
MailChimpWebhookType.OPEN,
MailChimpOpenWebhookData
>;
export type MailChimpCampaignWebhookData = {
id: string;
list_id: string;
campaign_id: string;
campaign_title: string;
campaign_subject: string;
campaign_send_time: string;
campaign_status: string;
};
export type MailChimpCampaignWebhookRequest = MailChimpWebhookRequest<
MailChimpWebhookType.CAMPAIGN,
MailChimpCampaignWebhookData
>;
// Extended Mailchimp API types since the official @types/mailchimp__mailchimp_marketing package is incomplete
export interface MailchimpClient {
setConfig(config: MailchimpConfig): void;
campaigns: MailchimpCampaignsApi;
lists: MailchimpListsApi;
reports: MailchimpReportsApi;
searchCampaigns: MailchimpSearchCampaignsApi;
ecommerce: MailchimpEcommerceApi;
}
export interface MailchimpSearchCampaignsApi {
search(params: any): Promise<any>;
}
export interface MailchimpEcommerceApi {
getAllStoreCustomers(storeId: string, opts?: any): Promise<any>;
stores(opts?: any): Promise<any>;
}
export interface MailchimpConfig {
accessToken: string;
server: string;
}
export interface MailchimpCampaignsApi {
create(data: CampaignCreateData): Promise<Campaign>;
get(campaignId: string, opts?: CampaignGetOptions): Promise<Campaign>;
update(campaignId: string, data: Partial<CampaignCreateData>): Promise<Campaign>;
remove(campaignId: string): Promise<void>;
send(campaignId: string): Promise<void>;
setContent(campaignId: string, content: CampaignContentData): Promise<any>;
list(opts?: any): Promise<any>;
}
export interface MailchimpListsApi {
createList(data: any): Promise<any>;
deleteListMember(listId: string, subscriberHash: string): Promise<void>;
addListMember(listId: string, data: any): Promise<any>;
updateListMember(listId: string, subscriberHash: string, data: any): Promise<any>;
setListMember(listId: string, subscriberHash: string, data: any, opts?: any): Promise<any>;
batchListMembers(listId: string, data: any, opts?: any): Promise<any>;
getAllLists(options?: any): Promise<any>;
tagSearch(listId: string, opts?: any): Promise<any>;
updateListMemberTags(listId: string, subscriberHash: string, data: any): Promise<any>;
}
export interface MailchimpReportsApi {
getCampaignReport(campaignId: string, opts?: CampaignReportOptions): Promise<CampaignReport>;
getAllCampaignReports(opts?: any): Promise<any>;
}
export interface CampaignCreateData {
type: string;
recipients: {
list_id: string;
};
settings: {
subject_line: string;
title: string;
from_name: string;
from_email: string;
reply_to: string;
to_name?: string;
};
}
export interface CampaignContentData {
html?: string;
plain_text?: string;
url?: string;
template?: {
id: string;
sections?: Record<string, any>;
};
}
export interface CampaignGetOptions {
fields?: string;
exclude_fields?: string;
}
export interface CampaignReportOptions {
fields?: string;
exclude_fields?: string;
}
export interface CampaignReport {
id: string;
campaign_title: string;
type: string;
list_id: string;
list_is_active: boolean;
list_name: string;
subject_line: string;
preview_text?: string;
emails_sent: number;
abuse_reports: number;
unsubscribed: number;
send_time?: string;
rss_last_send?: string;
bounces?: {
hard_bounces: number;
soft_bounces: number;
syntax_errors: number;
};
forwards?: {
forwards_count: number;
forwards_opens: number;
};
opens?: {
opens_total: number;
unique_opens: number;
open_rate: number;
last_open?: string;
proxy_excluded_opens?: number;
proxy_excluded_unique_opens?: number;
proxy_excluded_open_rate?: number;
};
clicks?: {
clicks_total: number;
unique_clicks: number;
unique_subscriber_clicks: number;
click_rate: number;
last_click?: string;
};
facebook_likes?: {
recipient_likes: number;
unique_likes: number;
facebook_likes: number;
};
industry_stats?: {
type: string;
open_rate: number;
click_rate: number;
bounce_rate: number;
unopen_rate: number;
unsub_rate: number;
abuse_rate: number;
};
list_stats?: {
sub_rate: number;
unsub_rate: number;
open_rate: number;
proxy_excluded_open_rate: number;
click_rate: number;
};
ab_split?: {
a?: {
bounces: number;
abuse_reports: number;
unsubs: number;
recipient_clicks: number;
forwards: number;
forwards_opens: number;
opens: number;
last_open?: string;
unique_opens: number;
};
b?: {
bounces: number;
abuse_reports: number;
unsubs: number;
recipient_clicks: number;
forwards: number;
forwards_opens: number;
opens: number;
last_open?: string;
unique_opens: number;
};
};
timewarp?: Array<{
gmt_offset: number;
opens: number;
last_open?: string;
unique_opens: number;
clicks: number;
last_click?: string;
unique_clicks: number;
bounces: number;
}>;
timeseries?: Array<{
timestamp: string;
emails_sent: number;
unique_opens: number;
proxy_excluded_unique_opens: number;
recipients_clicks: number;
}>;
share_report?: {
share_url: string;
share_password: string;
};
ecommerce?: {
total_orders: number;
total_spent: number;
total_revenue: number;
currency_code: string;
};
delivery_status?: {
enabled: boolean;
can_cancel: boolean;
status: string;
emails_sent: number;
emails_canceled: number;
};
_links?: Array<{
rel: string;
href: string;
method: string;
}>;
}
export interface Campaign {
id: string;
web_id: number;
parent_campaign_id?: string;
type: string;
create_time: string;
archive_url: string;
long_archive_url?: string;
status: string;
emails_sent: number;
send_time?: string;
content_type: string;
needs_block_refresh?: boolean;
resendable?: boolean;
recipients: {
list_id: string;
list_is_active: boolean;
list_name: string;
segment_text: string;
recipient_count: number;
};
settings: {
subject_line: string;
title: string;
from_name: string;
reply_to: string;
to_name: string;
content_type: string;
content_url?: string;
template_id?: number;
};
variate_settings?: any;
tracking?: any;
rss_opts?: any;
ab_split_opts?: any;
social_card?: any;
report_summary?: any;
delivery_status?: any;
resend_shortcut_eligibility?: any;
resend_shortcut_usage?: any;
_links: Array<{
rel: string;
href: string;
method: string;
targetSchema?: string;
schema?: string;
}>;
}

View File

@@ -0,0 +1,213 @@
import { createTrigger, TriggerStrategy, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpCommon } from '../common';
import { MailChimpOpenWebhookRequest } from '../common/types';
import { mailchimpAuth } from '../..';
const WEBHOOK_DATA_STORE_KEY = 'mail_chimp_email_opened_webhook_data';
type WebhookData = {
id: string;
listId: string;
};
const getEmailOpenEventSummary = (request: any): any => {
const data = request.data || {};
return {
email: data.email || 'N/A',
subscriber_id: data.id || 'N/A',
list_id: data.list_id || 'N/A',
campaign_id: data.campaign_id || 'N/A',
ip_address: data.ip || 'N/A',
user_agent: data.user_agent || 'N/A',
timestamp: data.timestamp || request.fired_at || 'N/A',
location_data: extractLocationData(data),
device_info: extractDeviceInfo(data.user_agent),
engagement_metrics: calculateEngagementMetrics(data),
};
};
const extractLocationData = (data: any): any => {
return {
ip_address: data.ip || 'N/A',
country: data.country || 'N/A',
region: data.region || 'N/A',
city: data.city || 'N/A',
timezone: data.timezone || 'N/A',
latitude: data.latitude || 'N/A',
longitude: data.longitude || 'N/A',
};
};
const extractDeviceInfo = (userAgent: string): any => {
if (!userAgent) return { device_type: 'Unknown', browser: 'Unknown', os: 'Unknown' };
const isMobile = /Mobile|Android|iPhone|iPad|Windows Phone/i.test(userAgent);
const isTablet = /iPad|Android(?=.*\bMobile\b)(?=.*\bSafari\b)/i.test(userAgent);
let deviceType = 'Desktop';
if (isTablet) deviceType = 'Tablet';
else if (isMobile) deviceType = 'Mobile';
return {
device_type: deviceType,
user_agent: userAgent,
is_mobile: isMobile,
is_tablet: isTablet,
is_desktop: !isMobile && !isTablet,
};
};
const calculateEngagementMetrics = (data: any): any => {
return {
open_count: data.open_count || 1,
is_first_open: data.is_first_open || false,
open_rate: data.open_rate || 0,
engagement_score: data.member_rating || 0,
vip_status: data.vip || false,
};
};
const assessEngagementLevel = (data: any): string => {
const rating = data.member_rating || 0;
const isVip = data.vip || false;
const openCount = data.open_count || 1;
if (isVip || rating >= 4) return 'High';
if (rating >= 2 || openCount > 1) return 'Medium';
return 'Low';
};
const identifyAutomationOpportunities = (data: any): string[] => {
const opportunities = [];
if (data.is_first_open) {
opportunities.push('First-time opener - welcome series opportunity');
}
if (data.member_rating && data.member_rating >= 4) {
opportunities.push('High engagement - upsell opportunity');
}
if (data.vip) {
opportunities.push('VIP subscriber - exclusive content opportunity');
}
return opportunities.length > 0 ? opportunities : ['Standard engagement tracking'];
};
export const mailChimpEmailOpenedTrigger = createTrigger({
auth: mailchimpAuth,
name: 'email_opened',
displayName: 'Email Opened',
description: 'Fires when a recipient opens a an email in a specific campaign',
type: TriggerStrategy.WEBHOOK,
props: {
list_id: mailchimpCommon.mailChimpListIdDropdown,
},
sampleData: {
type: 'open',
fired_at: '2024-01-15T10:30:00Z',
data: {
id: '8a25ff1d98',
list_id: 'a6b5da1054',
campaign_id: 'campaign_123',
email: 'user@example.com',
ip: '192.168.1.100',
user_agent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
timestamp: '2024-01-15T10:30:00Z',
open_count: 1,
is_first_open: true,
open_rate: 0.85,
member_rating: 4,
vip: false,
country: 'US',
region: 'CA',
city: 'San Francisco',
timezone: 'America/Los_Angeles',
latitude: 37.7749,
longitude: -122.4194,
},
},
async onEnable(context): Promise<void> {
try {
const accessToken = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
const enabledWebhookId = await mailchimpCommon.enableWebhookRequest({
server,
listId: context.propsValue.list_id as string,
token: accessToken,
webhookUrl: context.webhookUrl!,
events: {
open: true,
},
});
await context.store?.put<WebhookData>(WEBHOOK_DATA_STORE_KEY, {
id: enabledWebhookId,
listId: context.propsValue.list_id as string,
});
} catch (error: any) {
throw new Error(`Failed to enable email opened webhook: ${error.message || JSON.stringify(error)}`);
}
},
async onDisable(context): Promise<void> {
try {
const webhookData = await context.store?.get<WebhookData>(WEBHOOK_DATA_STORE_KEY);
if (webhookData === undefined || webhookData === null) {
return;
}
const token = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(token);
await mailchimpCommon.disableWebhookRequest({
server,
token,
listId: webhookData.listId,
webhookId: webhookData.id,
});
} catch (error: any) {
console.error(`Failed to disable email opened webhook: ${error.message || JSON.stringify(error)}`);
}
},
async run(context): Promise<unknown[]> {
try {
const request = context.payload.body as MailChimpOpenWebhookRequest;
if (!request || request.type !== 'open') {
return [];
}
const enhancedRequest = {
...request,
trigger_type: 'email_opened',
event_category: 'Email Engagement',
processed_at: new Date().toISOString(),
open_summary: getEmailOpenEventSummary(request),
business_context: {
email_engagement: true,
performance_tracking: true,
subscriber_behavior: true,
automation_trigger: true,
},
engagement_insights: {
device_type: extractDeviceInfo(request.data?.user_agent).device_type,
location: extractLocationData(request.data),
engagement_level: assessEngagementLevel(request.data),
automation_potential: identifyAutomationOpportunities(request.data),
},
};
return [enhancedRequest];
} catch (error: any) {
console.error(`Error processing email opened webhook: ${error.message || JSON.stringify(error)}`);
return [];
}
},
});

View File

@@ -0,0 +1,241 @@
import { createTrigger, TriggerStrategy, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpCommon } from '../common';
import { MailChimpClickWebhookRequest } from '../common/types';
import { mailchimpAuth } from '../..';
const WEBHOOK_DATA_STORE_KEY = 'mail_chimp_link_clicked_webhook_data';
type WebhookData = {
id: string;
listId: string;
};
const getLinkClickEventSummary = (request: MailChimpClickWebhookRequest): any => {
const data = request.data || {};
return {
email: data.email || 'N/A',
subscriber_id: data.id || 'N/A',
list_id: data.list_id || 'N/A',
campaign_id: data.campaign_id || 'N/A',
url: data.url || 'N/A',
ip_address: data.ip || 'N/A',
user_agent: data.user_agent || 'N/A',
timestamp: data.timestamp || request.fired_at || 'N/A',
click_data: {
url: data.url || 'N/A',
link_id: data.link_id || 'N/A',
click_count: data.click_count || 1,
is_first_click: data.is_first_click || false,
},
location_data: extractLocationData(data),
device_info: extractDeviceInfo(data.user_agent),
engagement_metrics: calculateClickMetrics(data),
};
};
const extractLocationData = (data: any): any => {
return {
ip_address: data.ip || 'N/A',
country: data.country || 'N/A',
region: data.region || 'N/A',
city: data.city || 'N/A',
timezone: data.timezone || 'N/A',
latitude: data.latitude || 'N/A',
longitude: data.longitude || 'N/A',
};
};
const extractDeviceInfo = (userAgent: string): any => {
if (!userAgent) return { device_type: 'Unknown', browser: 'Unknown', os: 'Unknown' };
const isMobile = /Mobile|Android|iPhone|iPad|Windows Phone/i.test(userAgent);
const isTablet = /iPad|Android(?=.*\bMobile\b)(?=.*\bSafari\b)/i.test(userAgent);
let deviceType = 'Desktop';
if (isTablet) deviceType = 'Tablet';
else if (isMobile) deviceType = 'Mobile';
return {
device_type: deviceType,
user_agent: userAgent,
is_mobile: isMobile,
is_tablet: isTablet,
is_desktop: !isMobile && !isTablet,
};
};
const calculateClickMetrics = (data: any): any => {
return {
click_count: data.click_count || 1,
is_first_click: data.is_first_click || false,
click_rate: data.click_rate || 0,
engagement_score: data.member_rating || 0,
vip_status: data.vip || false,
link_engagement: data.url ? 'High' : 'Low',
};
};
const assessClickEngagementLevel = (data: any): string => {
const rating = data.member_rating || 0;
const isVip = data.vip || false;
const clickCount = data.click_count || 1;
if (isVip || rating >= 4) return 'High';
if (rating >= 2 || clickCount > 1) return 'Medium';
return 'Low';
};
const identifyClickAutomationOpportunities = (data: any): string[] => {
const opportunities = [];
if (data.is_first_click) {
opportunities.push('First-time clicker - conversion funnel opportunity');
}
if (data.member_rating && data.member_rating >= 4) {
opportunities.push('High engagement - product recommendation opportunity');
}
if (data.vip) {
opportunities.push('VIP subscriber - exclusive offer opportunity');
}
if (data.url && data.url.includes('product')) {
opportunities.push('Product page click - purchase intent opportunity');
}
return opportunities.length > 0 ? opportunities : ['Standard click tracking'];
};
const assessConversionPotential = (data: any): string => {
if (data.url?.includes('product') || data.url?.includes('shop')) {
return 'High - Product page engagement';
}
if (data.url?.includes('checkout') || data.url?.includes('cart')) {
return 'Very High - Purchase intent';
}
if (data.url?.includes('signup') || data.url?.includes('register')) {
return 'High - Registration intent';
}
return 'Medium - General engagement';
};
export const mailChimpLinkClickedTrigger = createTrigger({
auth: mailchimpAuth,
name: 'link_clicked',
displayName: 'Link Clicked',
description: 'Fires when a recipient clicks a specified link in a campaign',
type: TriggerStrategy.WEBHOOK,
props: {
list_id: mailchimpCommon.mailChimpListIdDropdown,
},
sampleData: {
type: 'click',
fired_at: '2024-01-15T10:30:00Z',
data: {
id: '8a25ff1d98',
list_id: 'a6b5da1054',
campaign_id: 'campaign_123',
email: 'user@example.com',
url: 'https://example.com/product-page',
link_id: 'link_456',
ip: '192.168.1.100',
user_agent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
timestamp: '2024-01-15T10:30:00Z',
click_count: 1,
is_first_click: true,
click_rate: 0.25,
member_rating: 4,
vip: false,
country: 'US',
region: 'CA',
city: 'San Francisco',
timezone: 'America/Los_Angeles',
latitude: 37.7749,
longitude: -122.4194,
},
},
async onEnable(context): Promise<void> {
try {
const accessToken = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
const enabledWebhookId = await mailchimpCommon.enableWebhookRequest({
server,
listId: context.propsValue.list_id as string,
token: accessToken,
webhookUrl: context.webhookUrl!,
events: {
click: true,
},
});
await context.store?.put<WebhookData>(WEBHOOK_DATA_STORE_KEY, {
id: enabledWebhookId,
listId: context.propsValue.list_id as string,
});
} catch (error: any) {
throw new Error(`Failed to enable link clicked webhook: ${error.message || JSON.stringify(error)}`);
}
},
async onDisable(context): Promise<void> {
try {
const webhookData = await context.store?.get<WebhookData>(WEBHOOK_DATA_STORE_KEY);
if (webhookData === undefined || webhookData === null) {
return;
}
const token = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(token);
await mailchimpCommon.disableWebhookRequest({
server,
token,
listId: webhookData.listId,
webhookId: webhookData.id,
});
} catch (error: any) {
console.error(`Failed to disable link clicked webhook: ${error.message || JSON.stringify(error)}`);
}
},
async run(context): Promise<unknown[]> {
try {
const request = context.payload.body as MailChimpClickWebhookRequest;
if (!request || request.type !== 'click') {
return [];
}
const enhancedRequest = {
...request,
trigger_type: 'link_clicked',
event_category: 'Link Engagement',
processed_at: new Date().toISOString(),
click_summary: getLinkClickEventSummary(request),
business_context: {
link_engagement: true,
conversion_tracking: true,
subscriber_behavior: true,
automation_trigger: true,
},
click_insights: {
device_type: extractDeviceInfo(request.data?.user_agent).device_type,
location: extractLocationData(request.data),
engagement_level: assessClickEngagementLevel(request.data),
automation_potential: identifyClickAutomationOpportunities(request.data),
conversion_opportunity: assessConversionPotential(request.data),
},
};
return [enhancedRequest];
} catch (error: any) {
console.error(`Error processing link clicked webhook: ${error.message || JSON.stringify(error)}`);
return [];
}
},
});

View File

@@ -0,0 +1,146 @@
import { createTrigger, TriggerStrategy, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpCommon } from '../common';
import { MailChimpCampaignWebhookRequest } from '../common/types';
import { mailchimpAuth } from '../..';
const WEBHOOK_DATA_STORE_KEY = 'mail_chimp_campaign_webhook_data';
type WebhookData = {
id: string;
listId: string;
};
const getCampaignEventSummary = (request: MailChimpCampaignWebhookRequest): any => {
const data = request.data;
return {
campaign_id: data.campaign_id,
campaign_title: data.campaign_title,
campaign_subject: data.campaign_subject,
campaign_send_time: data.campaign_send_time,
campaign_status: data.campaign_status,
list_id: data.list_id,
subscriber_id: data.id,
event_timestamp: request.fired_at,
campaign_type: inferCampaignType(data),
delivery_status: assessDeliveryStatus(data),
};
};
const inferCampaignType = (data: any): string => {
if (data.campaign_title?.toLowerCase().includes('welcome')) return 'Welcome Series';
if (data.campaign_title?.toLowerCase().includes('newsletter')) return 'Newsletter';
if (data.campaign_title?.toLowerCase().includes('promo')) return 'Promotional';
if (data.campaign_title?.toLowerCase().includes('abandoned')) return 'Abandoned Cart';
return 'Standard Campaign';
};
const assessDeliveryStatus = (data: any): string => {
const status = data.campaign_status || '';
if (status === 'sent') return 'Delivered';
if (status === 'sending') return 'In Progress';
if (status === 'scheduled') return 'Scheduled';
if (status === 'paused') return 'Paused';
if (status === 'canceled') return 'Canceled';
return 'Unknown';
};
// Note: Campaign webhook data doesn't include performance metrics
// These would need to be fetched separately via the campaigns API if needed
export const mailChimpNewCampaignTrigger = createTrigger({
auth: mailchimpAuth,
name: 'new_campaign',
displayName: 'New Campaign',
description: 'Fires when a new campaign is created or sent',
type: TriggerStrategy.WEBHOOK,
props: {
list_id: mailchimpCommon.mailChimpListIdDropdown,
},
sampleData: {
type: 'campaign',
fired_at: '2024-01-15T10:30:00Z',
data: {
id: '8a25ff1d98',
list_id: 'a6b5da1054',
campaign_id: 'campaign_123',
campaign_title: 'Welcome Campaign',
campaign_subject: 'Welcome to our newsletter',
campaign_send_time: '2024-01-15T10:30:00Z',
campaign_status: 'sent',
},
},
async onEnable(context): Promise<void> {
try {
const accessToken = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
const enabledWebhookId = await mailchimpCommon.enableWebhookRequest({
server,
listId: context.propsValue.list_id as string,
token: accessToken,
webhookUrl: context.webhookUrl!,
events: {
campaign: true,
},
});
await context.store?.put<WebhookData>(WEBHOOK_DATA_STORE_KEY, {
id: enabledWebhookId,
listId: context.propsValue.list_id as string,
});
} catch (error: any) {
throw new Error(`Failed to enable campaign webhook: ${error.message || JSON.stringify(error)}`);
}
},
async onDisable(context): Promise<void> {
try {
const webhookData = await context.store?.get<WebhookData>(WEBHOOK_DATA_STORE_KEY);
if (webhookData === undefined || webhookData === null) {
return;
}
const token = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(token);
await mailchimpCommon.disableWebhookRequest({
server,
token,
listId: webhookData.listId,
webhookId: webhookData.id,
});
} catch (error: any) {
console.error(`Failed to disable campaign webhook: ${error.message || JSON.stringify(error)}`);
}
},
async run(context): Promise<unknown[]> {
try {
const request = context.payload.body as MailChimpCampaignWebhookRequest;
if (!request || request.type !== 'campaign') {
return [];
}
const enhancedRequest = {
...request,
trigger_type: 'campaign_event',
event_category: 'Campaign Activity',
processed_at: new Date().toISOString(),
campaign_summary: getCampaignEventSummary(request),
campaign_insights: {
campaign_type: inferCampaignType(request.data),
delivery_status: assessDeliveryStatus(request.data),
},
};
return [enhancedRequest];
} catch (error: any) {
console.error(`Error processing campaign webhook: ${error.message || JSON.stringify(error)}`);
return [];
}
},
});

View File

@@ -0,0 +1,227 @@
import { createTrigger, TriggerStrategy, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpCommon } from '../common';
import { mailchimpAuth } from '../..';
const WEBHOOK_DATA_STORE_KEY = 'mail_chimp_new_customer_webhook_data';
type WebhookData = {
id: string;
listId: string;
};
const getNewCustomerEventSummary = (request: any): any => {
const data = request.data || {};
return {
customer_id: data.customer_id || data.id || 'N/A',
store_id: data.store_id || 'N/A',
email: data.email || 'N/A',
first_name: data.first_name || 'N/A',
last_name: data.last_name || 'N/A',
company: data.company || 'N/A',
phone: data.phone || 'N/A',
address: data.address || 'N/A',
created_at: data.created_at || request.fired_at || 'N/A',
customer_type: data.customer_type || 'new',
has_orders: data.orders_count > 0,
total_spent: data.total_spent || 0,
orders_count: data.orders_count || 0,
};
};
const extractCustomerAddress = (address: any): any => {
if (!address) return null;
return {
street_address: {
primary: address.address1 || 'N/A',
secondary: address.address2 || 'N/A',
},
city: address.city || 'N/A',
state_province: {
name: address.province || 'N/A',
code: address.province_code || 'N/A',
},
postal_code: address.postal_code || 'N/A',
country: {
name: address.country || 'N/A',
code: address.country_code || 'N/A',
},
full_address: [
address.address1,
address.address2,
address.city,
address.province,
address.postal_code,
address.country,
].filter(Boolean).join(', '),
};
};
const assessCustomerValue = (data: any): string => {
const totalSpent = data.total_spent || 0;
const ordersCount = data.orders_count || 0;
if (totalSpent >= 1000 || ordersCount >= 10) return 'High Value';
if (totalSpent >= 100 || ordersCount >= 3) return 'Medium Value';
return 'New Customer';
};
const identifyCustomerOpportunities = (data: any): string[] => {
const opportunities = [];
if (data.orders_count === 0) {
opportunities.push('First-time customer - welcome series opportunity');
}
if (data.total_spent > 0) {
opportunities.push('Returning customer - loyalty program opportunity');
}
if (data.company) {
opportunities.push('Business customer - B2B marketing opportunity');
}
if (data.address) {
opportunities.push('Geographic targeting opportunity');
}
return opportunities.length > 0 ? opportunities : ['Standard customer onboarding'];
};
const assessMarketingPotential = (data: any): string => {
if (data.opt_in_status && data.member_rating >= 4) {
return 'High - Opted in with high engagement';
}
if (data.opt_in_status) {
return 'Medium - Opted in for marketing';
}
if (data.company) {
return 'Medium - Business customer potential';
}
return 'Low - Limited marketing consent';
};
export const mailChimpNewCustomerTrigger = createTrigger({
auth: mailchimpAuth,
name: 'new_customer',
displayName: 'New Customer',
description: 'Fires when a new customer is added to a connected store',
type: TriggerStrategy.WEBHOOK,
props: {
list_id: mailchimpCommon.mailChimpListIdDropdown,
},
sampleData: {
type: 'customer',
fired_at: '2024-01-15T10:30:00Z',
data: {
id: 'customer_123',
customer_id: 'customer_123',
store_id: 'store_456',
email: 'customer@example.com',
first_name: 'John',
last_name: 'Doe',
company: 'Example Corp',
phone: '+1-555-0123',
address: {
address1: '123 Main St',
address2: 'Suite 100',
city: 'Anytown',
province: 'California',
province_code: 'CA',
postal_code: '12345',
country: 'United States',
country_code: 'US',
},
created_at: '2024-01-15T10:30:00Z',
customer_type: 'new',
orders_count: 0,
total_spent: 0,
opt_in_status: true,
tags: ['new-customer', 'ecommerce'],
member_rating: 5,
vip: false,
},
},
async onEnable(context): Promise<void> {
try {
const accessToken = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
const enabledWebhookId = await mailchimpCommon.enableWebhookRequest({
server,
listId: context.propsValue.list_id as string,
token: accessToken,
webhookUrl: context.webhookUrl!,
events: {
customer: true,
},
});
await context.store?.put<WebhookData>(WEBHOOK_DATA_STORE_KEY, {
id: enabledWebhookId,
listId: context.propsValue.list_id as string,
});
} catch (error: any) {
throw new Error(`Failed to enable new customer webhook: ${error.message || JSON.stringify(error)}`);
}
},
async onDisable(context): Promise<void> {
try {
const webhookData = await context.store?.get<WebhookData>(WEBHOOK_DATA_STORE_KEY);
if (webhookData === undefined || webhookData === null) {
return;
}
const token = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(token);
await mailchimpCommon.disableWebhookRequest({
server,
token,
listId: webhookData.listId,
webhookId: webhookData.id,
});
} catch (error: any) {
console.error(`Failed to disable new customer webhook: ${error.message || JSON.stringify(error)}`);
}
},
async run(context): Promise<unknown[]> {
try {
const request = context.payload.body as any;
if (!request || request.type !== 'customer') {
return [];
}
const enhancedRequest = {
...request,
trigger_type: 'new_customer',
event_category: 'Customer Registration',
processed_at: new Date().toISOString(),
customer_summary: getNewCustomerEventSummary(request),
business_context: {
customer_acquisition: true,
ecommerce_tracking: true,
onboarding_automation: true,
customer_segmentation: true,
},
customer_insights: {
customer_value: assessCustomerValue(request.data),
address_details: extractCustomerAddress(request.data?.address),
automation_opportunities: identifyCustomerOpportunities(request.data),
marketing_potential: assessMarketingPotential(request.data),
},
};
return [enhancedRequest];
} catch (error: any) {
console.error(`Error processing new customer webhook: ${error.message || JSON.stringify(error)}`);
return [];
}
},
});

View File

@@ -0,0 +1,285 @@
import { createTrigger, TriggerStrategy, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpCommon } from '../common';
import { mailchimpAuth } from '../..';
const WEBHOOK_DATA_STORE_KEY = 'mail_chimp_new_order_webhook_data';
type WebhookData = {
id: string;
storeId: string;
};
const getNewOrderEventSummary = (request: any): any => {
const data = request.data || {};
return {
order_id: data.order_id || data.id || 'N/A',
store_id: data.store_id || 'N/A',
customer_id: data.customer_id || 'N/A',
customer_email: data.customer_email || 'N/A',
order_total: data.order_total || 0,
currency: data.currency || 'USD',
order_status: data.order_status || 'pending',
created_at: data.created_at || request.fired_at || 'N/A',
items_count: data.items_count || 0,
shipping_total: data.shipping_total || 0,
tax_total: data.tax_total || 0,
discount_total: data.discount_total || 0,
};
};
const extractOrderItems = (items: any[]): any => {
if (!items || !Array.isArray(items)) return [];
return items.map(item => ({
product_id: item.product_id || 'N/A',
product_title: item.product_title || 'N/A',
product_variant_id: item.product_variant_id || 'N/A',
quantity: item.quantity || 1,
price: item.price || 0,
total: item.total || 0,
category: item.category || 'N/A',
tags: item.tags || [],
}));
};
const extractOrderAddress = (address: any): any => {
if (!address) return null;
return {
street_address: {
primary: address.address1 || 'N/A',
secondary: address.address2 || 'N/A',
},
city: address.city || 'N/A',
state_province: {
name: address.province || 'N/A',
code: address.province_code || 'N/A',
},
postal_code: address.postal_code || 'N/A',
country: {
name: address.country || 'N/A',
code: address.country_code || 'N/A',
},
full_address: [
address.address1,
address.address2,
address.city,
address.province,
address.postal_code,
address.country,
].filter(Boolean).join(', '),
};
};
const assessOrderValue = (data: any): string => {
const orderTotal = data.order_total || 0;
if (orderTotal >= 500) return 'High Value';
if (orderTotal >= 100) return 'Medium Value';
if (orderTotal >= 50) return 'Standard Value';
return 'Low Value';
};
const identifyOrderOpportunities = (data: any): string[] => {
const opportunities = [];
if (data.order_status === 'fulfilled') {
opportunities.push('Order fulfilled - follow-up opportunity');
}
if (data.order_status === 'shipped') {
opportunities.push('Order shipped - delivery tracking opportunity');
}
if (data.items_count > 1) {
opportunities.push('Multiple items - cross-sell opportunity');
}
if (data.order_total > 100) {
opportunities.push('High-value order - VIP treatment opportunity');
}
if (data.shipping_total > 0) {
opportunities.push('Shipping paid - loyalty program opportunity');
}
return opportunities.length > 0 ? opportunities : ['Standard order processing'];
};
const calculateOrderMetrics = (data: any): any => {
const orderTotal = data.order_total || 0;
const shippingTotal = data.shipping_total || 0;
const taxTotal = data.tax_total || 0;
const discountTotal = data.discount_total || 0;
return {
subtotal: orderTotal - shippingTotal - taxTotal + discountTotal,
net_revenue: orderTotal - discountTotal,
profit_margin: orderTotal > 0 ? ((orderTotal - discountTotal) / orderTotal) * 100 : 0,
average_item_value: data.items_count > 0 ? orderTotal / data.items_count : 0,
shipping_percentage: orderTotal > 0 ? (shippingTotal / orderTotal) * 100 : 0,
};
};
export const mailChimpNewOrderTrigger = createTrigger({
auth: mailchimpAuth,
name: 'new_order',
displayName: 'New Order',
description: 'Fires when a new order is created in the connected store',
type: TriggerStrategy.WEBHOOK,
props: {
store_id: mailchimpCommon.mailChimpStoreIdDropdown,
},
sampleData: {
type: 'order',
fired_at: '2024-01-15T10:30:00Z',
data: {
id: 'order_123',
order_id: 'order_123',
store_id: 'store_456',
customer_id: 'customer_789',
customer_email: 'customer@example.com',
order_total: 299.99,
currency: 'USD',
order_status: 'pending',
created_at: '2024-01-15T10:30:00Z',
items_count: 3,
shipping_total: 15.99,
tax_total: 24.00,
discount_total: 25.00,
items: [
{
product_id: 'prod_001',
product_title: 'Premium Widget',
product_variant_id: 'var_001',
quantity: 2,
price: 89.99,
total: 179.98,
category: 'Widgets',
tags: ['premium', 'bestseller'],
},
{
product_id: 'prod_002',
product_title: 'Standard Widget',
product_variant_id: 'var_002',
quantity: 1,
price: 119.99,
total: 119.99,
category: 'Widgets',
tags: ['standard'],
},
],
shipping_address: {
address1: '123 Main St',
address2: 'Suite 100',
city: 'Anytown',
province: 'California',
province_code: 'CA',
postal_code: '12345',
country: 'United States',
country_code: 'US',
},
billing_address: {
address1: '123 Main St',
address2: 'Suite 100',
city: 'Anytown',
province: 'California',
province_code: 'CA',
postal_code: '12345',
country: 'United States',
country_code: 'US',
},
customer: {
first_name: 'John',
last_name: 'Doe',
company: 'Example Corp',
phone: '+1-555-0123',
},
},
},
async onEnable(context): Promise<void> {
try {
const accessToken = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
const enabledWebhookId = await mailchimpCommon.enableWebhookRequest({
server,
listId: context.propsValue.store_id!,
token: accessToken,
webhookUrl: context.webhookUrl!,
events: {
order: true,
customer: true,
},
});
await context.store?.put<WebhookData>(WEBHOOK_DATA_STORE_KEY, {
id: enabledWebhookId,
storeId: context.propsValue.store_id!,
});
} catch (error: any) {
throw new Error(`Failed to enable new order webhook: ${error.message || JSON.stringify(error)}`);
}
},
async onDisable(context): Promise<void> {
try {
const webhookData = await context.store?.get<WebhookData>(WEBHOOK_DATA_STORE_KEY);
if (webhookData === undefined || webhookData === null) {
return;
}
const token = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(token);
await mailchimpCommon.disableWebhookRequest({
server,
token,
listId: webhookData.storeId,
webhookId: webhookData.id,
});
} catch (error: any) {
console.error(`Failed to disable new order webhook: ${error.message || JSON.stringify(error)}`);
}
},
async run(context): Promise<unknown[]> {
try {
const request = context.payload.body as any;
if (request === undefined || request.type !== 'order') {
return [];
}
const enhancedRequest = {
...request,
trigger_type: 'new_order',
event_category: 'Order Creation',
processed_at: new Date().toISOString(),
order_summary: getNewOrderEventSummary(request),
business_context: {
order_management: true,
ecommerce_tracking: true,
revenue_tracking: true,
customer_engagement: true,
},
order_insights: {
order_value: assessOrderValue(request.data),
order_items: extractOrderItems(request.data?.items),
shipping_address: extractOrderAddress(request.data?.shipping_address),
billing_address: extractOrderAddress(request.data?.billing_address),
automation_opportunities: identifyOrderOpportunities(request.data),
financial_metrics: calculateOrderMetrics(request.data),
},
};
return [enhancedRequest];
} catch (error: any) {
console.error(`Error processing new order webhook: ${error.message || JSON.stringify(error)}`);
return [];
}
},
});

View File

@@ -0,0 +1,283 @@
import { createTrigger, TriggerStrategy, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpCommon } from '../common';
import { mailchimpAuth } from '../..';
const WEBHOOK_DATA_STORE_KEY = 'mail_chimp_segment_tag_subscriber_webhook_data';
type WebhookData = {
id: string;
listId: string;
segmentId?: string;
tagName?: string;
};
const getSegmentTagEventSummary = (request: any): any => {
const data = request.data || {};
return {
subscriber_id: data.id || 'N/A',
list_id: data.list_id || 'N/A',
email: data.email || 'N/A',
segment_id: data.segment_id || 'N/A',
segment_name: data.segment_name || 'N/A',
tag_name: data.tag_name || 'N/A',
tag_category: data.tag_category || 'N/A',
event_type: data.event_type || 'segment_join',
timestamp: data.timestamp || request.fired_at || 'N/A',
merge_fields: data.merges || {},
member_rating: data.member_rating || 0,
vip_status: data.vip || false,
language: data.language || 'en',
};
};
const extractSegmentInfo = (data: any): any => {
return {
segment_id: data.segment_id || 'N/A',
segment_name: data.segment_name || 'N/A',
segment_type: data.segment_type || 'static',
segment_match: data.segment_match || 'any',
segment_conditions: data.segment_conditions || [],
segment_count: data.segment_count || 0,
segment_created: data.segment_created || 'N/A',
segment_updated: data.segment_updated || 'N/A',
};
};
const extractTagInfo = (data: any): any => {
return {
tag_name: data.tag_name || 'N/A',
tag_category: data.tag_category || 'N/A',
tag_color: data.tag_color || 'N/A',
tag_count: data.tag_count || 0,
tag_created: data.tag_created || 'N/A',
tag_updated: data.tag_updated || 'N/A',
tag_notes: data.tag_notes || 'N/A',
};
};
const assessSegmentEngagement = (data: any): string => {
const rating = data.member_rating || 0;
const isVip = data.vip || false;
const segmentCount = data.segment_count || 0;
if (isVip || rating >= 4) return 'High Engagement';
if (rating >= 2 || segmentCount > 1) return 'Medium Engagement';
return 'New to Segment';
};
const identifySegmentOpportunities = (data: any): string[] => {
const opportunities = [];
if (data.event_type === 'segment_join') {
opportunities.push('New segment member - welcome series opportunity');
}
if (data.event_type === 'tag_added') {
opportunities.push('New tag applied - targeted content opportunity');
}
if (data.member_rating >= 4) {
opportunities.push('High engagement - premium content opportunity');
}
if (data.vip) {
opportunities.push('VIP member - exclusive segment opportunity');
}
if (data.segment_type === 'dynamic') {
opportunities.push('Dynamic segment - automated targeting opportunity');
}
return opportunities.length > 0 ? opportunities : ['Standard segment engagement'];
};
const calculateSegmentMetrics = (data: any): any => {
return {
segment_member_count: data.segment_count || 0,
segment_growth_rate: data.growth_rate || 0,
segment_engagement_score: data.engagement_score || 0,
segment_activity_level: data.activity_level || 'low',
segment_retention_rate: data.retention_rate || 0,
segment_conversion_rate: data.conversion_rate || 0,
};
};
const getEventCategory = (eventType: string): string => {
switch (eventType) {
case 'segment':
return 'Segment Membership';
case 'tag':
return 'Tag Application';
case 'profile':
return 'Profile Update';
case 'subscribe':
return 'New Subscription';
default:
return 'Unknown Event';
}
};
export const mailChimpNewSegmentTagSubscriberTrigger = createTrigger({
auth: mailchimpAuth,
name: 'new_segment_tag_subscriber',
displayName: 'New Segment Tag Subscriber',
description: 'Fires when a subscriber joins a specific segment or tag',
type: TriggerStrategy.WEBHOOK,
props: {
list_id: mailchimpCommon.mailChimpListIdDropdown,
segment_id: Property.ShortText({
displayName: 'Segment ID (Optional)',
description: 'The specific segment ID to monitor. Leave empty to monitor all segments.',
required: false,
}),
tag_name: Property.ShortText({
displayName: 'Tag Name (Optional)',
description: 'The specific tag name to monitor. Leave empty to monitor all tags.',
required: false,
}),
},
sampleData: {
type: 'segment_tag',
fired_at: '2024-01-15T10:30:00Z',
data: {
id: '8a25ff1d98',
list_id: 'a6b5da1054',
email: 'subscriber@example.com',
segment_id: 'segment_123',
segment_name: 'High Value Customers',
segment_type: 'static',
segment_match: 'all',
segment_conditions: [
{
condition_type: 'EmailAddress',
op: 'is',
field: 'EMAIL',
value: 'subscriber@example.com',
},
],
segment_count: 150,
segment_created: '2024-01-01T00:00:00Z',
segment_updated: '2024-01-15T10:30:00Z',
tag_name: 'premium',
tag_category: 'customer_type',
tag_color: '#FF6B6B',
tag_count: 75,
tag_created: '2024-01-01T00:00:00Z',
tag_updated: '2024-01-15T10:30:00Z',
tag_notes: 'Premium customer segment',
event_type: 'segment_join',
timestamp: '2024-01-15T10:30:00Z',
merges: {
EMAIL: 'subscriber@example.com',
FNAME: 'John',
LNAME: 'Doe',
COMPANY: 'Example Corp',
PHONE: '+1-555-0123',
INTERESTS: 'Premium,High-Value',
},
member_rating: 5,
vip: true,
language: 'en',
growth_rate: 0.15,
engagement_score: 0.85,
activity_level: 'high',
retention_rate: 0.92,
conversion_rate: 0.08,
},
},
async onEnable(context): Promise<void> {
try {
const accessToken = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
const enabledWebhookId = await mailchimpCommon.enableWebhookRequest({
server,
listId: context.propsValue.list_id as string,
token: accessToken,
webhookUrl: context.webhookUrl!,
events: {
profile: true,
},
});
await context.store?.put<WebhookData>(WEBHOOK_DATA_STORE_KEY, {
id: enabledWebhookId,
listId: context.propsValue.list_id as string,
segmentId: context.propsValue.segment_id,
tagName: context.propsValue.tag_name,
});
} catch (error: any) {
throw new Error(`Failed to enable segment tag subscriber webhook: ${error.message || JSON.stringify(error)}`);
}
},
async onDisable(context): Promise<void> {
try {
const webhookData = await context.store?.get<WebhookData>(WEBHOOK_DATA_STORE_KEY);
if (webhookData === undefined || webhookData === null) {
return;
}
const token = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(token);
await mailchimpCommon.disableWebhookRequest({
server,
token,
listId: webhookData.listId,
webhookId: webhookData.id,
});
} catch (error: any) {
console.error(`Failed to disable segment tag subscriber webhook: ${error.message || JSON.stringify(error)}`);
}
},
async run(context): Promise<unknown[]> {
try {
const request = context.payload.body as any;
if (request === undefined || !['segment', 'tag', 'profile', 'subscribe'].includes(request.type)) {
return [];
}
const webhookData = await context.store?.get<WebhookData>(WEBHOOK_DATA_STORE_KEY);
if (webhookData) {
if (webhookData.segmentId && request.data?.segment_id !== webhookData.segmentId) {
return [];
}
if (webhookData.tagName && request.data?.tag_name !== webhookData.tagName) {
return [];
}
}
const enhancedRequest = {
...request,
trigger_type: 'segment_tag_subscriber',
event_category: getEventCategory(request.type),
processed_at: new Date().toISOString(),
segment_tag_summary: getSegmentTagEventSummary(request),
business_context: {
audience_segmentation: true,
targeted_marketing: true,
automation_trigger: true,
customer_insights: true,
},
segment_tag_insights: {
segment_info: extractSegmentInfo(request.data),
tag_info: extractTagInfo(request.data),
engagement_level: assessSegmentEngagement(request.data),
automation_opportunities: identifySegmentOpportunities(request.data),
segment_metrics: calculateSegmentMetrics(request.data),
},
};
return [enhancedRequest];
} catch (error: any) {
console.error(`Error processing segment tag subscriber webhook: ${error.message || JSON.stringify(error)}`);
return [];
}
},
});

View File

@@ -0,0 +1,156 @@
import { createTrigger, TriggerStrategy, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpCommon } from '../common';
import { MailChimpSubscribeWebhookRequest } from '../common/types';
import { mailchimpAuth } from '../..';
const WEBHOOK_DATA_STORE_KEY = 'mail_chimp_subscribe_webhook_data';
type WebhookData = {
id: string;
listId: string;
};
const getSubscribeEventSummary = (request: any): any => {
const data = request.data || {};
return {
email: data.email || 'N/A',
subscriber_id: data.id || 'N/A',
list_id: data.list_id || 'N/A',
email_type: data.email_type || 'html',
ip_address: data.ip_opt || data.ip_signup || 'N/A',
signup_timestamp: data.timestamp_signup || 'N/A',
opt_in_timestamp: data.timestamp_opt || 'N/A',
has_merge_fields: !!data.merges,
merge_field_count: data.merges ? Object.keys(data.merges).length : 0,
merge_fields_summary: data.merges ? {
first_name: data.merges.FNAME || 'N/A',
last_name: data.merges.LNAME || 'N/A',
company: data.merges.COMPANY || 'N/A',
phone: data.merges.PHONE || 'N/A',
interests: data.merges.INTERESTS || 'N/A',
has_address: !!data.merges.ADDRESS,
} : null,
};
};
export const mailChimpSubscribeTrigger = createTrigger({
auth: mailchimpAuth,
name: 'subscribe',
displayName: 'Member Subscribed to Audience',
description: 'Fires when a new subscriber joins your Mailchimp audience. This trigger captures new subscriptions, opt-ins, and audience growth events with comprehensive subscriber information.',
type: TriggerStrategy.WEBHOOK,
props: {
list_id: mailchimpCommon.mailChimpListIdDropdown,
},
sampleData: {
type: 'subscribe',
fired_at: '2024-01-15T10:30:00Z',
data: {
id: '8a25ff1d98',
list_id: 'a6b5da1054',
email: 'api@mailchimp.com',
email_type: 'html',
ip_opt: '192.168.1.100',
ip_signup: '192.168.1.100',
timestamp_signup: '2024-01-15T10:30:00Z',
timestamp_opt: '2024-01-15T10:30:00Z',
merges: {
EMAIL: 'api@mailchimp.com',
FNAME: 'Mailchimp',
LNAME: 'API',
COMPANY: 'Mailchimp Inc',
PHONE: '+1-555-0123',
INTERESTS: 'Group1,Group2',
ADDRESS: {
addr1: '675 Ponce de Leon Ave NE',
addr2: 'Suite 5000',
city: 'Atlanta',
state: 'GA',
zip: '30308',
country: 'US',
},
},
member_rating: 5,
vip: false,
language: 'en',
source: 'api',
tags: ['api-signup', 'new-subscriber'],
},
},
async onEnable(context): Promise<void> {
try {
const accessToken = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
const enabledWebhookId = await mailchimpCommon.enableWebhookRequest({
server,
listId: context.propsValue.list_id as string,
token: accessToken,
webhookUrl: context.webhookUrl!,
events: {
subscribe: true,
},
});
await context.store?.put<WebhookData>(WEBHOOK_DATA_STORE_KEY, {
id: enabledWebhookId,
listId: context.propsValue.list_id as string,
});
} catch (error: any) {
throw new Error(`Failed to enable subscribe webhook: ${error.message || JSON.stringify(error)}`);
}
},
async onDisable(context): Promise<void> {
try {
const webhookData = await context.store?.get<WebhookData>(WEBHOOK_DATA_STORE_KEY);
if (webhookData === undefined || webhookData === null) {
return;
}
const token = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(token);
await mailchimpCommon.disableWebhookRequest({
server,
token,
listId: webhookData.listId,
webhookId: webhookData.id,
});
} catch (error: any) {
console.error(`Failed to disable subscribe webhook: ${error.message || JSON.stringify(error)}`);
}
},
async run(context): Promise<unknown[]> {
try {
const request = context.payload.body as MailChimpSubscribeWebhookRequest;
if (!request || request.type !== 'subscribe') {
return [];
}
const enhancedRequest = {
...request,
trigger_type: 'member_subscribed',
event_category: 'New Subscription',
processed_at: new Date().toISOString(),
subscription_summary: getSubscribeEventSummary(request),
business_context: {
audience_growth: true,
new_lead: true,
marketing_opportunity: true,
engagement_potential: 'high',
},
};
return [enhancedRequest];
} catch (error: any) {
console.error(`Error processing subscribe webhook: ${error.message || JSON.stringify(error)}`);
return [];
}
},
});

View File

@@ -0,0 +1,162 @@
import { createTrigger, TriggerStrategy, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpCommon } from '../common';
import { mailchimpAuth } from '../..';
const WEBHOOK_DATA_STORE_KEY = 'mail_chimp_subscriber_updated_webhook_data';
type WebhookData = {
id: string;
listId: string;
};
const getEventCategory = (eventType: string): string => {
switch (eventType) {
case 'profile':
return 'Profile Update';
case 'subscribe':
return 'New Subscription';
case 'upemail':
return 'Email Change';
case 'cleaned':
return 'Email Cleanup';
default:
return 'Unknown Event';
}
};
const getSubscriberSummary = (request: any): any => {
const data = request.data || {};
return {
email: data.email || data.new_email || 'N/A',
subscriber_id: data.id || 'N/A',
list_id: data.list_id || 'N/A',
email_type: data.email_type || 'html',
member_rating: data.member_rating || 0,
vip_status: data.vip ? 'VIP' : 'Standard',
language: data.language || 'en',
has_merge_fields: !!data.merges,
merge_field_count: data.merges ? Object.keys(data.merges).length : 0,
last_activity: data.last_changed || data.timestamp_opt || data.timestamp_signup || 'N/A',
ip_address: data.ip_opt || data.ip_signup || 'N/A',
};
};
export const mailChimpSubscriberUpdatedTrigger = createTrigger({
auth: mailchimpAuth,
name: 'subscriber_updated',
displayName: 'Subscriber Updated',
description: 'Fires when a subscriber profile is updated, including changes to merge fields, interests, or contact information. This trigger captures profile updates, new subscriptions, and subscriber modifications.',
type: TriggerStrategy.WEBHOOK,
props: {
list_id: mailchimpCommon.mailChimpListIdDropdown,
},
sampleData: {
type: 'profile',
fired_at: '2024-01-15T10:30:00Z',
data: {
id: '8a25ff1d98',
list_id: 'a6b5da1054',
email: 'user@example.com',
email_type: 'html',
merges: {
EMAIL: 'user@example.com',
FNAME: 'John',
LNAME: 'Doe',
COMPANY: 'Example Corp',
PHONE: '+1-555-0123',
INTERESTS: 'Group1,Group2',
ADDRESS: {
addr1: '123 Main St',
addr2: 'Suite 100',
city: 'Anytown',
state: 'CA',
zip: '12345',
country: 'US',
},
},
new_email: 'newuser@example.com',
old_email: 'user@example.com',
member_rating: 5,
vip: false,
language: 'en',
ip_opt: '192.168.1.100',
ip_signup: '192.168.1.100',
timestamp_signup: '2024-01-01T09:00:00Z',
timestamp_opt: '2024-01-01T09:00:00Z',
last_changed: '2024-01-15T10:30:00Z',
},
},
async onEnable(context): Promise<void> {
try {
const accessToken = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
const enabledWebhookId = await mailchimpCommon.enableWebhookRequest({
server,
listId: context.propsValue.list_id as string,
token: accessToken,
webhookUrl: context.webhookUrl!,
events: {
profile: true,
subscribe: true,
upemail: true,
cleaned: true,
},
});
await context.store?.put<WebhookData>(WEBHOOK_DATA_STORE_KEY, {
id: enabledWebhookId,
listId: context.propsValue.list_id as string,
});
} catch (error: any) {
throw new Error(`Failed to enable subscriber updated webhook: ${error.message || JSON.stringify(error)}`);
}
},
async onDisable(context): Promise<void> {
try {
const webhookData = await context.store?.get<WebhookData>(WEBHOOK_DATA_STORE_KEY);
if (webhookData === undefined || webhookData === null) {
return;
}
const token = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(token);
await mailchimpCommon.disableWebhookRequest({
server,
token,
listId: webhookData.listId,
webhookId: webhookData.id,
});
} catch (error: any) {
console.error(`Failed to disable subscriber updated webhook: ${error.message || JSON.stringify(error)}`);
}
},
async run(context): Promise<unknown[]> {
try {
const request = context.payload.body as any;
if (request === undefined || !['profile', 'subscribe', 'upemail', 'cleaned'].includes(request.type)) {
return [];
}
const enhancedRequest = {
...request,
trigger_type: 'subscriber_updated',
event_category: getEventCategory(request.type),
processed_at: new Date().toISOString(),
subscriber_summary: getSubscriberSummary(request),
};
return [enhancedRequest];
} catch (error: any) {
console.error(`Error processing subscriber updated webhook: ${error.message || JSON.stringify(error)}`);
return [];
}
},
});

View File

@@ -0,0 +1,209 @@
import { createTrigger, TriggerStrategy, Property } from '@activepieces/pieces-framework';
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import { mailchimpCommon } from '../common';
import { mailchimpAuth } from '../..';
const WEBHOOK_DATA_STORE_KEY = 'mail_chimp_unsubscribe_webhook_data';
type WebhookData = {
id: string;
listId: string;
};
const getUnsubscribeEventSummary = (request: any): any => {
const data = request.data || {};
return {
email: data.email || 'N/A',
subscriber_id: data.id || 'N/A',
list_id: data.list_id || 'N/A',
email_type: data.email_type || 'html',
ip_address: data.ip_opt || data.ip_signup || 'N/A',
signup_timestamp: data.timestamp_signup || 'N/A',
opt_in_timestamp: data.timestamp_opt || 'N/A',
unsubscribe_timestamp: request.fired_at || 'N/A',
has_merge_fields: !!data.merges,
merge_field_count: data.merges ? Object.keys(data.merges).length : 0,
merge_fields_summary: data.merges ? {
first_name: data.merges.FNAME || 'N/A',
last_name: data.merges.LNAME || 'N/A',
company: data.merges.COMPANY || 'N/A',
phone: data.merges.PHONE || 'N/A',
interests: data.merges.INTERESTS || 'N/A',
has_address: !!data.merges.ADDRESS,
} : null,
member_rating: data.member_rating || 0,
vip_status: data.vip ? 'VIP' : 'Standard',
language: data.language || 'en',
};
};
const calculateSubscriberLifetime = (request: any): string => {
const data = request.data || {};
const signupTime = data.timestamp_signup ? new Date(data.timestamp_signup) : null;
const unsubscribeTime = request.fired_at ? new Date(request.fired_at) : null;
if (signupTime && unsubscribeTime) {
const diffTime = Math.abs(unsubscribeTime.getTime() - signupTime.getTime());
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
return `${diffDays} days`;
}
return 'Unknown';
};
const assessEngagementLevel = (request: any): string => {
const data = request.data || {};
const rating = data.member_rating || 0;
if (rating >= 4) return 'High';
if (rating >= 2) return 'Medium';
return 'Low';
};
const identifyChurnFactors = (request: any): string[] => {
const factors = [];
const data = request.data || {};
if (data.member_rating && data.member_rating < 3) {
factors.push('Low engagement rating');
}
if (request.unsubscribe_reason) {
factors.push(`Reason: ${request.unsubscribe_reason}`);
}
if (request.campaign_id) {
factors.push('Campaign-specific unsubscribe');
}
return factors.length > 0 ? factors : ['No specific factors identified'];
};
export const mailChimpUnsubscriberTrigger = createTrigger({
auth: mailchimpAuth,
name: 'unsubscribe',
displayName: 'Member Unsubscribed from Audience',
description: 'Fires when a subscriber unsubscribes from your Mailchimp audience. This trigger captures unsubscribe events, opt-outs, and audience churn with comprehensive subscriber information for retention analysis.',
type: TriggerStrategy.WEBHOOK,
props: {
list_id: mailchimpCommon.mailChimpListIdDropdown,
},
sampleData: {
type: 'unsubscribe',
fired_at: '2024-01-15T10:30:00Z',
data: {
id: '8a25ff1d98',
list_id: 'a6b5da1054',
email: 'api@mailchimp.com',
email_type: 'html',
ip_opt: '192.168.1.100',
ip_signup: '192.168.1.100',
timestamp_signup: '2024-01-01T09:00:00Z',
timestamp_opt: '2024-01-01T09:00:00Z',
merges: {
EMAIL: 'api@mailchimp.com',
FNAME: 'Mailchimp',
LNAME: 'API',
COMPANY: 'Mailchimp Inc',
PHONE: '+1-555-0123',
INTERESTS: 'Group1,Group2',
ADDRESS: {
addr1: '675 Ponce de Leon Ave NE',
addr2: 'Suite 5000',
city: 'Atlanta',
state: 'GA',
zip: '30308',
country: 'US',
},
},
member_rating: 3,
vip: false,
language: 'en',
source: 'api',
tags: ['api-signup', 'churned-subscriber'],
unsubscribe_reason: 'too_many_emails',
campaign_id: 'campaign_123',
campaign_title: 'Weekly Newsletter',
},
},
async onEnable(context): Promise<void> {
try {
const accessToken = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
const enabledWebhookId = await mailchimpCommon.enableWebhookRequest({
server,
listId: context.propsValue.list_id as string,
token: accessToken,
webhookUrl: context.webhookUrl!,
events: {
unsubscribe: true,
profile: true,
},
});
await context.store?.put<WebhookData>(WEBHOOK_DATA_STORE_KEY, {
id: enabledWebhookId,
listId: context.propsValue.list_id as string,
});
} catch (error: any) {
throw new Error(`Failed to enable unsubscribe webhook: ${error.message || JSON.stringify(error)}`);
}
},
async onDisable(context): Promise<void> {
try {
const webhookData = await context.store?.get<WebhookData>(WEBHOOK_DATA_STORE_KEY);
if (webhookData === undefined || webhookData === null) {
return;
}
const token = getAccessTokenOrThrow(context.auth);
const server = await mailchimpCommon.getMailChimpServerPrefix(token);
await mailchimpCommon.disableWebhookRequest({
server,
token,
listId: webhookData.listId,
webhookId: webhookData.id,
});
} catch (error: any) {
console.error(`Failed to disable unsubscribe webhook: ${error.message || JSON.stringify(error)}`);
}
},
async run(context): Promise<unknown[]> {
try {
const request = context.payload.body as any;
if (request === undefined || request.type !== 'unsubscribe') {
return [];
}
const enhancedRequest = {
...request,
trigger_type: 'member_unsubscribed',
event_category: 'Unsubscribe Event',
processed_at: new Date().toISOString(),
unsubscribe_summary: getUnsubscribeEventSummary(request),
business_context: {
audience_churn: true,
retention_concern: true,
feedback_opportunity: true,
re_engagement_potential: 'medium',
},
retention_insights: {
subscriber_lifetime: calculateSubscriberLifetime(request),
engagement_level: assessEngagementLevel(request),
churn_risk_factors: identifyChurnFactors(request),
},
};
return [enhancedRequest];
} catch (error: any) {
console.error(`Error processing unsubscribe webhook: ${error.message || JSON.stringify(error)}`);
return [];
}
},
});