|
\*Not directly supported indicates that this formatting your file will not automatically be transferred over as it is not achievable in markdown, but with example indicators the agent can still help achieve the desired formatting.
If you are interested in formatting that is not in the list above, please drop us a message and we can look into how Mary can learn new formatting skills.
***
**What file types are supported?**
Currently, we support Google Docs, Word Docs, and PDF files for the campaign brief. However, we recommend using Google Docs for the best experience as not all features are supported in other file types. If you have a specific file type in mind, please reach out to us and we can explore options.
| File Type | Formatting | Embedded Images | Image Links |
| :--------- | :--------- | :-------------- | :---------- |
| Google Doc | ✅ | ✅ | ✅ |
| Word Doc | ✅ | ❌ | ✅ |
| PDF | ✅ | ❌ | ✅ |
***
**Can buttons be created in emails with links to assets?**
Yes, we can support creating buttons and other links to gated content as part of an email in the campaign.
# Add Mary Instructions
Source: https://docs.allgoodhq.com/use-cases/email-builder/feature-add-mary-instructions
## Overview
You can tell Mary how you want to process your tokens. Mary will read “Mary instructions” and try to follow them.
There are some use cases:
* Append UTM parameters in every link
* Remove “https\://” or specific text in the brief doc.
* Validate specific token values
# Add document-level instructions
For example, add “Mary instructions” sections like this example.
# Add token-level instructions
You can add Mary instruction on the token level like this as well.
*Note: Marketo does not support emojis.*
# Email Layout Optimization
Source: https://docs.allgoodhq.com/use-cases/email-builder/feature-email-layout-optimization
Mary intelligently adjusts templates based on your content:
* **3-column layout → 2-column**: Automatically switches when you have fewer speakers or content blocks
* **Module Selection**: Picks the right combination of text, image, and CTA modules
Let’s remove token values in Feature 3 in [the sample campaign brief](https://docs.google.com/document/d/1B1DLehVMdtlGfqVqnzq8836Cs7b0wfLZui_wN-7buAs/edit?tab=t.0).
#### (Recommended) You can also add more explicit instructions on [Mary Instructions](./feature-add-mary-instructions) section.
This way, Mary has a more specific way to replace the modules, and will update the layout more reliably.
# Real-time Editing
Source: https://docs.allgoodhq.com/use-cases/email-builder/feature-real-time-editing
## Making Changes
Make quick changes to your campaigns through simple chat commands. Mary understands natural language requests and can instantly update your email content without requiring technical expertise.
## Simple Chat Commands
### Content Updates
Modify your campaign content with natural language:
* **"Change the subject line to..."**: Update email subject instantly
* **"Update the event date to..."**: Modify dates and times
* **"Make the headline more engaging"**: Enhance copy for better performance
* **"Add a call-to-action button"**: Insert CTAs where needed
## Real-time Previews
### Instant Preview Generation
See your changes immediately:
* **"Send me a preview"**: Mary generates and sends a preview email
* **"Preview with different subject lines"**: Test multiple options
* **"Send to my test email"**: Get previews in your actual inbox
## Advanced Editing Capabilities
### Content Optimization
Mary can enhance your content for better performance:
* **Engagement Optimization**: Suggest improvements for higher open rates
* **Clarity Enhancement**: Improve readability and comprehension
* **Brand Voice**: Maintain consistent tone across all content
* **Personalization**: Add dynamic content and personalization tokens
The real-time editing feature makes campaign refinement as simple as having a conversation, ensuring your final campaigns perfectly match your vision.
# Update Preheader
Source: https://docs.allgoodhq.com/use-cases/email-builder/feature-update-preheader
## Constraints
Preheader is unsupported with tokens from Marketo ([https://experienceleague.adobe.com/en/docs/marketo/using/product-docs/email-marketing/general/email-editor-2/email-editor-v2-0-overview](https://experienceleague.adobe.com/en/docs/marketo/using/product-docs/email-marketing/general/email-editor-2/email-editor-v2-0-overview))
# How Mary updates Preheader
There are two ways to support the Preheader update
1. Use static preheader
1. No change required, Mary will read Preheader section on your brief doc and update the Email metadata directly.
2. Use tokenized preheader
1. Add preheader content on top of the email template. This is the common practice to place an invisible element on top of an email. So this content won’t be visible in the actual email. However, it is still visible as preview (preheader) text.
```html theme={null}
{{my.Preheader-Title}} - {{my.Preheader-Description}}
```
*Example: Tokenized preheader HTML code*
1. Add tokens for the preheader, for above example, “**Preheader-Title**” and “**Preheader-Description**”
2. Mary will update the tokens from the brief doc.
# Overview
Source: https://docs.allgoodhq.com/use-cases/email-builder/index
Email Builder enables campaign creation with no Marketo experience required. Focus on simple repetitive campaigns that follow predictable patterns, with Mary handling the technical complexity while you focus on content and strategy.
***
## Get Email Builder Setup
Follow the [quick setup guide](/use-cases/email-builder/quick-setup) to prepare templates, integrations, and tokens.
Use [Tokenize your emails](/use-cases/email-builder/tokenize-your-emails) to make templates dynamic and reusable.
Align your team with the [Campaign brief playbook](/use-cases/email-builder/prepare-the-campaign-brief).
***
## Launch a campaign using Email Builder
* [Launch a campaign](/use-cases/email-builder/launch-a-campaign-in-allgood) — end-to-end walkthrough inside allGood.
* [Launch with Asana](/use-cases/email-builder/launch-a-campaign-with-asana) — coordinate campaign work from Asana.
* [Launch with Workfront](/use-cases/email-builder/launch-a-campaign-with-workfront) — operationalize launches alongside Workfront projects.
### Features
There are several features available in Email Builder that enhance its functionality and user experience. Explore:
* [Real-time editing with Mary](/use-cases/email-builder/feature-real-time-editing)
* [Add Mary instructions](/use-cases/email-builder/feature-add-mary-instructions)
* [Email layout optimization](/use-cases/email-builder/feature-email-layout-optimization)
* [Update preheader](/use-cases/email-builder/feature-update-preheader)
# Launch a Campaign in allGood
Source: https://docs.allgoodhq.com/use-cases/email-builder/launch-a-campaign-in-allgood
This comprehensive guide will walk you through the process of launching a marketing campaign in allGood with the Email
Builder system. Once Mary has been configured to build your campaign, follow these steps to automate your campaign
creation process.
## Prerequisites
Before beginning, ensure you have completed the following:
* Email Builder setup has been successfully configured
* A valid Campaign Brief has been prepared (refer to "Preparing the Campaign Brief" guide)
* Program Name and campaign details are finalized and ready for implementation
## Step-by-Step Guide
* Click "**Start Email Builder**" in the allGood platform and upload the Campaign Brief
* For Google Docs, select the file from your Google Drive or paste the link to the file
* For Google Drive, you will need to authorize allGood to access your Google Drive the first time you use it
* If you paste a link to a Google Doc, make sure your Google Integration is set up correctly and the file is shared
with the allGood service account
* For Word docx, upload the file directly
* Once the file is uploaded, Mary will go ahead and build your campaign automatically!
* Here's what Mary will do:
* Clone the program
* Update the tokens in the new program
* Update the email layout if necessary
* Send a test email to the specified address
If Mary encounters any issues, she will ask for your help and you can provide the necessary information
Once Mary has built the campaign, you can make manual updates.
**Make updates through built-in UI**
#### Content section
Click "**View/Edit Content**" on the right sidebar. And you can see "**Edit Content**" popup and directly make changes
to the tokens.
#### Content - Images section
The images section is right below the content section. You can see all the uploaded images found in the campaign brief
doc.
You can click on each image and preview the actual image.
Now you can also edit the image. Let's click the "**Edit**" button.
#### Preview Email Drafts section
This section lists all the emails within the program.
* You can click the "**Preview**" button and it will open up your Marketo email preview screen.
* You can check the emails you want to preview and click the "**Send**" button to send the draft emails.
**Make updates through Mary**
* Some examples of manual updates include:
* Updating the email layout
* Making changes to the content
* Sending a test email to another address
* You can simply ask Mary to make these changes for you, and she will do her best to help
# Launch a Campaign via Asana
Source: https://docs.allgoodhq.com/use-cases/email-builder/launch-a-campaign-with-asana
This comprehensive guide will walk you through the process of launching a marketing campaign using Asana integration with the Email Builder system. Once Mary has been configured to build your campaigns, follow these steps to automate your campaign creation process.
## Prerequisites
Before beginning, ensure you have completed the following:
* Email Builder setup has been successfully configured
* A valid Campaign Brief has been prepared (refer to "[Preparing the Campaign Brief](./prepare-the-campaign-brief.mdx)" guide)
* Program Name and campaign details are finalized and ready for implementation
* Asana integration is successfully configured [allGood-Asana Setup guide](../../integrations/asana.mdx)
## Step-by-Step Process
1. **Attach Campaign Brief File**
* Navigate to your Asana task
* Upload your prepared campaign brief document as an attachment
* Ensure the file is properly formatted and contains all required campaign details
2. **Add Mary as Collaborator**
* In the task settings, add Mary to the collaborators list
* This action triggers Mary to begin processing your campaign request
* **Important: Mary must be added as a collaborator AFTER the campaign brief is attached**
Once Mary is added as a collaborator, the system automatically begins processing your request:
* Mary will post an initial comment in the Asana task
* A link will be provided in the comment directing you to the campaign worksheet
* The worksheet name will automatically match your Asana task name for easy reference
When Mary requires additional information, clarification, or approvals:
1. **Provide Detailed Responses with "@Mary" mention.**
* Use "**@Mary**" mention in Asana comments
Verify you received the sample email
* Sometimes the preview email is delayed for a few minutes.
* In some instances, the email could be marked as spam. Check your spam folder.
* You can also comment "**@Mary** send sample emails to \<[youremail@company.com](mailto:youremail@company.com)>"
Upon successful completion of your campaign development:
1. **Review Final Output**
* Mary will confirm completion in both Asana and allGood platforms
* All completed tasks will be clearly marked with completion status
* A distinctive logo indicates messages originating from Asana
2. **Access Your Campaign**
* A direct link to your newly created email program in Marketo will be provided
* The worksheet will inherit the name of the new email program
## Best Practices
### File Management
* Always attach campaign briefs before adding Mary as a collaborator
* Use clear, descriptive file names for easy identification
* Ensure campaign briefs are complete and properly formatted
### Communication
* Be specific and detailed in your responses to minimize revision cycles
* Use @Mary mentions in Asana for all communication directed to the system
* Monitor both Asana and allGood platforms for updates and requests
### Organization
* Maintain consistent task naming conventions for easy tracking
* Keep all campaign-related communications within the designated task
* Regularly check completion status and follow provided links for final deliverables
## Support
For additional assistance or technical issues, refer to the comprehensive documentation library or contact the support team through the allGood platform.
## Frequently Asked Questions
Yes, any team member with access to the task can interact with Mary by using @Mary in comments.
Yes, assigning Mary to the task automatically adds her to the collaborators list. Mary only requires collaborator access, allowing you to maintain your preferred organizational structure for task assignments.
The campaign brief must be attached BEFORE adding Mary as a collaborator. Mary processes task information immediately upon being added to the collaboration list. If you attach the file after adding Mary, you must remove and re-add her as a collaborator to trigger proper processing.
All conversations and campaign details remain accessible through the allGood platform. Navigate through the worksheet link to view comprehensive communication history, task progress, and campaign deliverables.
You can request reasonable adjustments throughout the campaign development process. All revision requests should be clearly communicated through either the allGood interface or Asana comments using @Mary.
# Launch a Campaign via Workfront
Source: https://docs.allgoodhq.com/use-cases/email-builder/launch-a-campaign-with-workfront
This comprehensive guide will walk you through the process of launching a marketing campaign using Workfront integration with the Email Builder system. Once Mary has been configured to build your campaigns, follow these steps to automate your campaign creation process through your Workfront project management workflow.
## Prerequisites
Before beginning, ensure you have completed the following:
* Email Builder setup has been successfully configured
* A valid Campaign Brief has been prepared (refer to "[Preparing the Campaign Brief](./prepare-the-campaign-brief.mdx)" guide)
* Program Name and campaign details are finalized and ready for implementation
* Workfront integration is successfully configured [allGood - Workfront Setup guide](../../integrations/workfront.mdx)
## Step-by-Step Process
1. **Attach Campaign Brief Document**
* Navigate to your Workfront task or subtask
* In the Documents section, upload your prepared campaign brief
* Ensure the file is properly formatted and contains all required campaign details
* Verify the document appears in the task's document library
2. **Add Mary as Task Assignee**
* On the same page, add Mary as the assignee
* This action triggers Mary to begin processing your campaign request
* **Important: Mary must be assigned AFTER the campaign brief document is attached**
Once Mary is assigned to the task, the system automatically begins processing your request:
* Mary will post an initial comment in the Workfront task
* A link will be provided in the comment directing you to the campaign worksheet
* The worksheet name will automatically match your Workfront task name for easy reference
When Mary requires additional information, clarification, or approvals:
1. **Provide Detailed Responses with "@Mary" mention.**
* Use Workfront's "**@Mary**" mention feature in comments
Verify you received the sample email
* Sometimes the preview email is delayed for a few minutes.
* In some instances, the email could be marked as spam. Check your spam folder.
* You can also comment "**@Mary** send sample emails to \<[youremail@company.com](mailto:youremail@company.com)>"
Upon successful completion of your email build:
1. **Review Final Output**
* Mary will confirm completion in both Workfront and allGood platforms
* All completed tasks will be marked with completion status
* A distinctive logo indicates messages originating from Workfront
2. **Access Your Campaign**
* A direct link to your newly created email program in Marketo will be provided
* The worksheet will inherit the name of the new email program
## Best Practices
### File Management
* Always attach campaign briefs before assigning Mary
* Use clear, descriptive file names for easy identification
* Ensure campaign briefs are complete and properly formatted
### Communication
* Be specific and detailed in your responses to minimize revision cycles
* Use **@Mary** mentions in Workfront for all communication directed to the system
* Monitor both Workfront and allGood platforms for updates and requests
### Organization
* Maintain consistent task naming conventions for easy tracking
* Keep all campaign-related communications within the designated task
* Regularly check completion status and follow provided links for final deliverables
## Support
For additional assistance or technical issues, refer to the comprehensive documentation library or contact the support team through the allGood platform.
## Frequently Asked Questions
Yes, any team member with access to the Workfront task can interact with Mary by using @Mary in task updates or comments.
The campaign brief must be uploaded BEFORE assigning Mary to the task. Mary processes task information immediately upon being added. If you upload the file after assigning Mary, you must un-assign her from the task and re-assign her to trigger proper processing.
All conversations and campaign details remain accessible through the allGood platform. Navigate through the worksheet link to view comprehensive communication history, task progress, and campaign deliverables.
You can request reasonable revisions throughout the campaign development process. All revision requests should be clearly communicated through either the allGood interface or Workfront comments using **@Mary**.
# Prepare the Campaign Brief
Source: https://docs.allgoodhq.com/use-cases/email-builder/prepare-the-campaign-brief
## Overview
Campaign brief is a document that contains Campaign information to run a new Marketo Program. This includes Template
Program information to be cloned, new program name, and the folder name. Also, specify all the token information in the
program that Mary will automatically update within the program.
allGood will provide a sample template Campaign brief. But the format is not restricted to the sample as long as it
contains the necessary information.
# Supported Format
There are two formats supported.
* Upload MS Word docx(.docx)
* Google Docs
* Via Direct link
* Via download as **MS Word docx** and upload the file
* Make sure your Google integration user is accessible with the doc by **anyone with the link** or **shared with the
user**
* Check out more details for Google Setup [allGood - Google Setup Guide](../../integrations/google.mdx)
# Campaign Brief components
## Program Details
Program details must include:
* The name of the program to be cloned
* The name of the new program
* The name of folder you would like the new program to be cloned into
## Email Content
List out all tokens in 2-column table format with their respective token names in Marketo.
* (optional) We recommend you split up the tokens into two categories:
* Email Basics and Email Content
## Content Formatting
Mary will pass any of the formatting of the content over to the email
* Don’t be shy when adding multiple types of formatting to one token
* As long as the token is a Rich Text token, Mary will be able to add the correct formatting
| Formatting | Supported | Example |
| ----------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| Bold | Yes | **Bold text** |
| Italic | Yes | *Italic text* |
| Link | Yes | Click [here](https://allgoodhq.com) for more information |
| List | Yes (Bullet and Numbered) | - Bullet list 1
- Bullet list 2
- Bullet list 3
1. Numbered list 1
2. Numbered list 2
3. Numbered list 3 |
| Underline | Yes | Underlined text |
| Strikethrough | Yes | ~~Strikethrough~~ |
| Special Character | Yes | © ® ™ |
| Indent | Yes (Only 1-level indent) | Single indent works (~~Nested indent does not work~~) |
| Alignment | No \* | Aligning center is not supported |
| Line height | No \* | Custom line-height is not supported |
| Color | No \* | This is not supported |
| Highlight color | No \* | This is not supported |
| Font size | No \* | This is not supported |
| Font style | No \* | This is not supported |
| Emojis | No \* | 😀 is not supported |
*Table: Supported Content formatting*
> **Inline CSS Support**
>
> NOTE: While text styling such as font size, color, and alignment are not directly supported, you can still specify
> inline CSS in the content. For example, to change the font size, you can use
> `Your Text Here`.
>
> However, please note that not all email clients may render
> inline CSS consistently, so it's advisable to test the email across different clients to ensure the desired appearance.
If you are interested in formatting that is unsupported or not in the list above, please drop us a message, and we can
look into how Mary can learn new formatting skills.
## Handling Images
Images are supported with **Text** tokens and directly uploaded into your Marketo assets. Note that **The Image token is
not supported.**
### Token naming convention
To tell Mary to process image properly, make sure to have “**image-URL**” in the name of the tokens explicitly, for
example
* Header-image-URL
* Banner-image-URL
* Footer-image-URL
### Add images
There are two ways to fill out images in your token
* Add image URL
* Make sure the image URL is publicly accessible
* Embed image
* You can directly embed an image in the image URL
### Specify image dimensions
Mary will follow the image dimensions in the token and transform the image with the dimensions before uploading the
image.
### Specify File name
By default, Mary uploads images in Marketo following this rule.
* Public URL is provided
* If the image file name is on the URL, Mary will upload the image with the name.
* For
example - [https://cdn.prod.website-files.com/6537ecf8dd6837236ee1b763/671928c38a76da7c1f729de7\_8408aba1e79257bb7eeefff1117c6e1e\_maryv2-p-1080.png](https://cdn.prod.website-files.com/6537ecf8dd6837236ee1b763/671928c38a76da7c1f729de7_8408aba1e79257bb7eeefff1117c6e1e_maryv2-p-1080.png)
* File name would be “**671928c38a76da7c1f729de7\_8408aba1e79257bb7eeefff1117c6e1e\_maryv2-p-1080.png**”
* If the image file name is not identifiable, Mary will upload the image with this naming convention
* **\\_\\_\.png**
* For example) 1131\_Image-URL2\_V3FKDPDA.png
* Embeded image is provided
* Mary will upload the image with this naming convention
* **\\_\\_\.png**
* For example) 1131\_Image-URL2\_V3FKDPDA.png
This is annoying to manage randomly created images in your Marketo assets. Mary supports a specific file name by adding
**File name: \.**
Then Mary will follow with the file name instead of the default behavior above.
### Where can I find the images uploaded in my Marketo?
You can find all the images uploaded In your Marketo -> Design Studio -> Images and Files
## Advanced: Add Mary Instructions
You can tell Mary how you want to process your tokens.
There are some use cases:
* Append UTM parameters in every links
* Remove “https\://” or specific text in the brief doc.
* Validate specific token values
Learn more on [Feature: Add Mary Instructions](./feature-add-mary-instructions.md)
## Advanced: Email Layout Optimization
Learn more on [Feature: Email Layout Optimization](./feature-email-layout-optimization.md)
# Getting Started with Email Builder
Source: https://docs.allgoodhq.com/use-cases/email-builder/quick-setup
## Overview
Email Builder automates Marketo program cloning by creating new programs, updating tokens, and verifying results. You can manage token updates directly or import them from campaign briefs, then send sample emails to confirm everything looks correct.
This eliminates the manual work of cloning programs, filling individual tokens, and handling image uploads/resizing.
## Prerequisites
* An [Integration with Marketo](/integrations/marketo) has already been setup.
## How it works
*Diagram: Overview of how Email Builder works.*
## Step-by-Step Guide
For this quick start, we will use a sample template program and sample campaign brief to start.
* allGood will create a sample template program with a sample email. Checkout program in Marketo -> Marketing Activities -> Search for "**NL - YYYY.MM.DD - allGood Customer Newsletter**".
* allGood will provide a Campaign Brief template, which will contain Program Details and Tokens for the program
* Copy the brief doc into your Google drive.
* In "Program Details", fill out the template program to clone, as well as the new program name and folder to clone into
* The sample campaign brief already have basic sample content
* Update any content such as subject and diescription
* Utilize text formatting abilities within the document (refer to [the Preparing the Campaign Brief for more details](./prepare-the-campaign-brief.md))
* Sign in to [allGoodhq.app](https://allgoodhq.app)
* In the "**Home**" screen, click "**Start Email Builder**". This will guide you to the Worksheet screen.
* Click "**From link**" button
* Paste the Campaign brief url into the link
* Click "**Import**" button
* Mary will start building your program from the template program
* Verify you received the sample email
* Sometimes the preview email is delayed for a few minutes.
* In some instances, the email could be marked as spam. Check your spam folder.
* You can also click "**Preview**" button to see the preview email in Marketo
You have successfully built a new email with Mary! You can learn more details in the next steps.
Next steps:
* [Tokenize your emails](./tokenize-your-emails.md)
* [Prepare a Campaign brief doc](./prepare-the-campaign-brief.md)
* [Launch a campaign with allGood](./launch-a-campaign-in-allgood.md)
* [Launch a campaign with Asana](./launch-a-campaign-with-asana.md)
* [Launch a campaign with Workfront](./launch-a-campaign-with-workfront.md)
Learn more about additional features
* [Real-time editing with Mary](./feature-real-time-editing.md)
* [Add Mary Instructions](./feature-add-mary-instructions.md)
* [Email Layout Optimization](./feature-email-layout-optimization.md)
* [Update Preheader](./feature-update-preheader.md)
# Tokenize Your Emails
Source: https://docs.allgoodhq.com/use-cases/email-builder/tokenize-your-emails
## Creating Program Tokens
1. Navigate to the **My Tokens** tab in your template program
2. Create your tokens. Any text you would like formatted from your briefing doc needs to be a **Rich Text token** type and any URL or Image must be a standard **Text token** type.
**NOTE:** Other token types are not supported.
**NOTE**
* Marketo will not let you save your tokens with empty values.
* Please input some filler text as a dummy value to save and close your tokens. Mary will overwrite these filler values. (a simple dash does the job)
# Tokens to your Email(s)
## Insert Tokens
* Add each of your tokens where you’d like Mary to populate the content.
## Image and URL tokens must be placed directly in modules
**NOTE**
To tell Mary to process the image properly, make sure to have “**image-URL**” in the name of the tokens explicitly, for example
* Header-image-URL
* Banner-image-URL
* Footer-image-URL
## Preheader
Preheader is unsupported with tokens from Marketo ([https://experienceleague.adobe.com/en/docs/marketo/using/product-docs/email-marketing/general/email-editor-2/email-editor-v2-0-overview](https://experienceleague.adobe.com/en/docs/marketo/using/product-docs/email-marketing/general/email-editor-2/email-editor-v2-0-overview))
Mary only supports Preheader with static content. Learn more about it on [Feature: Update Preheader](./feature-update-preheader.mdx)
# Advanced Enrichment Strategies
Source: https://docs.allgoodhq.com/use-cases/enrichment/advanced-strategies
## Multi-Step Enrichment Workflows
### Sequential Provider Strategy
Stack enrichment steps to maximize hit rates while controlling costs:
```
Step 1: Basic Enrichment (ZoomInfo)
↓
Step 2: Advanced Enrichment (allGood system)
```
**How it works:**
1. First step checks your preferred provider (e.g., ZoomInfo)
2. Second step fills remaining gaps using allGood's advanced system
3. Only leads with missing data after step 1 get processed in step 2
**Benefits:**
* Maximizes use of existing data provider subscriptions
* Advanced enrichment only runs when needed (cost control)
* Higher overall completion rates
### Targeted Enrichment by Lead Segment
Create different enrichment profiles for different lead types:
**Enterprise Leads Profile**
* Advanced mode with all data elements enabled
* Comprehensive field set including phone numbers
* Always enrich (even overwrite existing data)
* Custom instructions: "Focus on finding executive assistants and decision makers"
**SMB Leads Profile**
* Basic mode with cost-effective provider
* Essential fields only (no phone discovery)
* Only when missing data
* Custom instructions: "Prioritize direct contact information"
**Event Attendee Profile**
* Advanced mode with professional email focus
* Event-specific metadata fields
* Custom instructions: "Use event context to validate company information"
## Advanced Configuration Techniques
### Dynamic Field Instructions
Use specific instructions for different field types:
**LinkedIn URL Field**
```
Instructions: Only accept LinkedIn profiles that match the exact name and company.
Verify the profile is active and recently updated.
```
**Email Field**
```
Instructions: Prioritize work email addresses ending in company domains.
Avoid generic emails like info@company.com or sales@company.com.
```
**Job Title Field**
```
Instructions: Standardize job titles using common formats.
Focus on finding specific roles rather than generic titles like 'Manager'.
```
### Smart Overwrite Rules
Configure when to overwrite existing data:
**Always Overwrite Fields**
* Phone numbers (often outdated)
* Job titles (frequently change)
* LinkedIn URLs (for verification)
**Never Overwrite Fields**
* Names (usually accurate in source data)
* Email addresses (if from recent form fills)
* Custom fields with manual input
**Conditional Overwrite**
* Company names (only if current data looks incomplete)
* Industries (only if current data is generic)
### Advanced Custom Instructions
**Industry-Specific Enrichment**
```
For technology companies:
- Focus on finding engineering and product roles
- Prioritize GitHub and Stack Overflow profiles
- Use company funding stage to validate seniority levels
For healthcare leads:
- Verify professional licenses where applicable
- Focus on institutional email addresses
- Skip personal contact information for compliance
```
**Role-Based Processing**
```
For C-level executives:
- Always find LinkedIn profiles for validation
- Look for recent news mentions or company announcements
- Find executive assistant contact information when available
For individual contributors:
- Focus on direct contact information
- Skip phone number discovery unless specifically needed
- Prioritize professional social media profiles
```
## Quality Control and Validation
### Confidence Scoring Setup
Configure metadata fields to track data quality:
**Enrichment Confidence**
```
Field: enrichment_confidence_score
Instructions: Rate the confidence level of enriched data from 1-10,
where 10 means all fields were found with high accuracy from primary sources.
```
**Source Attribution**
```
Field: primary_data_source
Instructions: Record which data provider supplied the majority of enriched information.
```
**Match Quality**
```
Field: linkedin_match_quality
Instructions: Rate how well the LinkedIn profile matches the input data (exact, likely, possible).
```
### Data Validation Rules
Use custom instructions for validation:
**Email Validation**
```
Verify email addresses follow these rules:
- Must be from the lead's company domain when possible
- Avoid role-based emails (sales@, info@, support@)
- Check for common typos in domain names
- Flag personal emails for potential replacement
```
**Company Validation**
```
Validate company information by:
- Confirming company size matches industry expectations
- Verifying company location against other data points
- Checking that industry classification is specific, not generic
- Flagging potential duplicate or subsidiary relationships
```
## Cost Optimization Strategies
### Smart Phone Discovery
Instead of enabling phone discovery for all leads, use targeted approaches:
**High-Value Leads Only**
* Create separate profiles for leads above certain revenue thresholds
* Use conditional logic based on lead scoring
* Focus on decision-makers and C-level contacts
**Campaign-Specific Discovery**
* Enable phone discovery only for outbound calling campaigns
* Disable for email-only nurture campaigns
* Use different profiles based on campaign type
### Provider Cost Management
**Credit Monitoring**
```
Field: api_credits_used
Instructions: Track estimated API credits consumed during enrichment
to monitor costs and optimize provider usage.
```
**Provider Selection Logic**
```
Use this provider priority order:
1. Free/low-cost sources first (LinkedIn public data, company websites)
2. Mid-tier providers for standard business information
3. Premium providers only for high-value leads or missing critical data
```
### Batch Processing Optimization
**Lead Prioritization**
* Process highest-value leads first
* Batch similar lead types together
* Schedule bulk enrichment during off-peak hours
**Incremental Enrichment**
* Start with basic fields for all leads
* Add advanced fields only for qualified leads
* Use lead progression to trigger more comprehensive enrichment
## Next Steps
* **A/B Testing**: Compare different enrichment strategies with sample lead sets
* **Integration Planning**: Connect enriched data to your CRM and marketing automation
* **Advanced Analytics**: Set up reporting to measure enrichment ROI
* **Continuous Optimization**: Regular review and adjustment of enrichment profiles
## Troubleshooting
Track these metrics to optimize your enrichment strategy:
**Hit Rate Metrics**
* Overall completion percentage by provider
* Field-specific success rates
* Cost per successful enrichment
**Quality Metrics**
* Data accuracy validation scores
* Manual review feedback integration
* Downstream campaign performance correlation
- Solution: Add company domain validation
- Use multiple search variations (Full name + company, Email domain + name)
- Implement fuzzy matching for similar company names
* Solution: Implement source priority rules
* Cross-validate critical fields across multiple providers
* Use recency signals to prefer newer information
* Solution: Tighten matching criteria in custom instructions
* Add validation steps for critical fields
* Implement manual review workflows for uncertain matches
Log the reasoning for each field enrichment decision, including which sources were checked and why specific data was chosen or rejected.
Record response times, success rates, and data quality for each provider used during enrichment.
# Frequently Asked Questions
Source: https://docs.allgoodhq.com/use-cases/enrichment/faq
## General Questions
**Basic enrichment** uses a single data provider to perform one lookup per lead. You choose the specific provider (like ZoomInfo or Clearbit) and lookup method. It's cost-effective and predictable.
**Advanced enrichment** uses allGood's intelligent system that searches the web first to find LinkedIn profiles, then tries multiple data providers automatically to maximize hit rates and data quality.
Yes! This is actually a recommended strategy. Set up a workflow with Basic enrichment first (using your preferred provider), then Advanced enrichment second to fill in any remaining gaps. This maximizes your existing provider subscriptions while ensuring comprehensive coverage.
Enrichment costs vary by provider and data elements:
* **Basic mode**: Depends on your selected provider's pricing
* **Advanced mode**: Uses allGood's provider network with usage-based pricing
* **Phone/Email discovery**: Adds significant cost but improves contact rates
* **LinkedIn-only enrichment**: Most cost-effective option in Advanced mode
Enable expensive features like phone discovery only when needed for specific campaigns.
**Standard contact fields**: Name, Email, Job Title, Company, LinkedIn URL, Phone
**Company information**: Industry, Employee Count, Revenue, Location, Website
**Contact details**: Address, City, State, Country, Social profiles
**Custom fields**: Any field you define, with specific instructions for what to find
Data accuracy depends on several factors:
* **LinkedIn profiles**: Highest accuracy when found, as professionals maintain their own data
* **Multiple provider validation**: Advanced mode cross-checks sources for better accuracy
* **Recency**: Newer data from active sources is typically more accurate
* **Matching criteria**: Stricter matching rules improve accuracy but may reduce hit rates
Use metadata fields to track confidence scores and validate critical data manually.
## Technical Questions
Advanced enrichment uses web search to find LinkedIn profiles by:
1. Searching for "FirstName LastName Company" variations
2. Validating profile matches against input data
3. Extracting professional information from the profile
4. Using the profile as a foundation for additional data provider lookups
allGood's Advanced enrichment system:
* **Prioritizes LinkedIn data** as the most reliable source
* **Uses recency signals** to prefer newer information
* **Cross-validates** critical fields across sources
* **Applies custom instructions** to resolve conflicts
* **Tracks source attribution** in metadata fields for transparency
**Basic mode**: You select the specific provider and lookup method
**Advanced mode**: allGood manages provider selection automatically, but you can:
* Use custom instructions to specify preferences
* Exclude certain data types or sources
* Set quality thresholds that influence provider selection
The overwrite setting is configured per field:
**Overwrite disabled**: Only fills empty/missing fields, preserves existing data
**Overwrite enabled**: Replaces existing data with enriched information
**Best practice**: Enable overwrite for frequently outdated fields (job titles, phone numbers) and disable for stable fields (names, company names).
## Setup and Configuration
1. Go to **Settings > Enrichment**
2. Click **Create Enrichment Profile**
3. Configure mode, fields, and instructions
4. Save with a descriptive name
5. Attach to different Skills or Flow steps as needed
Create multiple profiles for different scenarios (high-value leads vs. bulk processing).
Metadata fields store information about the enrichment process itself, not about the lead. Useful examples:
* **Enrichment Date**: When the data was enriched
* **Primary Source**: Which provider supplied most data
* **Confidence Score**: How reliable the enriched data is
* **LinkedIn Found**: Whether a LinkedIn profile was located
This helps with quality control, troubleshooting, and campaign optimization.
Good custom instructions are specific and actionable:
**Bad - Vague**: "Find good data"
**Good - Specific**: "Only enrich technology companies with 50+ employees. Focus on finding work email addresses, not personal ones."
**Bad - Too restrictive**: "Only use data from the past 30 days"
**Good - Balanced**: "Prefer recent data but accept older information if it's the only source available"
Yes! Always test with a small sample first:
1. Create your enrichment profile
2. Upload a small test file (10-20 leads)
3. Run the enrichment step
4. Review results and adjust configuration
5. Scale up to your full dataset
## Troubleshooting
Common causes and solutions:
**Input data quality issues**
* Ensure names are properly formatted
* Check for typos in company names
* Verify email addresses are accurate
**Overly restrictive matching**
* Review custom instructions for overly specific criteria
* Consider enabling "fuzzy matching" for company names
* Add LinkedIn URL as a field to improve matching accuracy
**Provider coverage gaps**
* Switch to Advanced mode for better provider coverage
* Try different lookup methods in Basic mode
* Check if your lead segments are well-covered by your chosen provider
**Phone/email discovery enabled**
* These features significantly increase costs
* Disable if not needed for current campaign
* Use targeted profiles that enable these features selectively
**Always enrich setting**
* Processes leads even with complete data
* Switch to "Only when missing data" for cost control
* Use separate profiles for validation vs. completion
**Advanced mode on large datasets**
* Uses multiple providers automatically
* Consider Basic mode for budget-conscious bulk processing
* Use sequential enrichment (Basic first, then Advanced)
**Matching errors**
* Tighten matching criteria in custom instructions
* Add validation fields like LinkedIn URL
* Enable manual review for high-value leads
**Outdated source data**
* Providers may have stale information
* Use multiple sources for validation
* Implement confidence scoring to flag uncertain data
**Name conflicts**
* Common names may match wrong people
* Add company domain validation
* Include more identifying information in matching
1. **Add specific field instructions**
```
Job Title Instructions: Only accept C-level titles (CEO, CTO, CFO, CMO).
Reject generic titles like "Manager" or "Associate".
```
2. **Enable field-level overwrite selectively**
* Disable overwrite for fields getting wrong data
* Only fill when the field is truly empty
3. **Add validation metadata**
```
Field: job_title_confidence
Instructions: Rate confidence in job title accuracy from 1-10
```
4. **Use custom validation logic**
```
Instructions: Cross-check job title against LinkedIn profile.
Flag mismatches for manual review.
```
## Best Practices
**Use Advanced enrichment when:**
* Data quality is more important than cost
* You have incomplete lead databases
* You need maximum hit rates
* LinkedIn profiles are important for your use case
**Use Basic enrichment when:**
* You have a preferred data provider
* Cost control is critical
* You need predictable provider sourcing
* You're processing large volumes of similar leads
**Quarterly refreshes** for:
* Job titles (change frequently)
* Company information (growth, acquisitions)
* Contact information (phone, email changes)
**Annual reviews** for:
* Name and basic demographics
* Industry classifications
* Location data
**Event-triggered enrichment** for:
* New leads from campaigns
* Lead status changes (qualification, opportunity)
* Account expansion activities
**Essential fields for all profiles:**
* LinkedIn URL (improves matching accuracy)
* Email (for professional contact discovery)
* Job Title (for persona targeting)
* Company (for account intelligence)
**Optional fields based on use case:**
* Phone (only if doing outbound calling)
* Industry/Company size (for segmentation)
* Location (for territory assignment)
**Always include metadata:**
* Enrichment date
* Primary data source
* Match confidence level
1. **Regular profile optimization** based on performance metrics
2. **Feedback loops** from sales teams about data accuracy
3. **A/B testing** of different enrichment strategies
4. **Quality scoring** and manual review workflows
5. **Source performance monitoring** to identify declining providers
## Getting Help
If you need additional assistance:
* **Documentation**: Review the setup guide and advanced strategies
* **Support Team**: Contact support for provider-specific issues
* **Best Practices**: Schedule a consultation for optimization recommendations
* **Community**: Join user discussions about enrichment strategies
# Overview
Source: https://docs.allgoodhq.com/use-cases/enrichment/index
## Overview
Lead enrichment automatically fills missing contact information by finding data from LinkedIn, web searches, and third-party data providers. allGood's enrichment system helps you complete incomplete lead records, validate existing data, and enhance your contact database for better campaign targeting.
## How It Works
### Basic Enrichment Mode
Basic mode uses a single data provider to perform one lookup per lead. This approach is:
* **Cost-effective** - Uses one provider per enrichment step
* **Predictable** - Clear data sourcing from a specific provider
* **Configurable** - Choose from providers like ZoomInfo, Clearbit, or LinkedIn
Perfect for when you have a preferred data provider or want to control costs while still filling in missing lead information.
### Advanced Enrichment Mode
Advanced mode uses allGood's intelligent enrichment system that:
* **Searches LinkedIn first** - Finds the lead's LinkedIn profile through web search
* **Uses multiple providers** - Automatically tries different data sources to maximize hit rates
* **Validates results** - Ensures data accuracy by cross-referencing sources
* **Finds professional contacts** - Locates work emails and phone numbers when needed
Best for maximizing data quality and completion rates when working with incomplete lead databases.
## Common Use Cases
### Sequential Enrichment Strategy
Stack multiple enrichment steps to create a fallback strategy:
1. **First step**: Basic enrichment with ZoomInfo
2. **Second step**: Advanced enrichment to fill remaining gaps
This approach checks your preferred provider first, then uses allGood's advanced system for anything still missing.
### Event Lead Processing
After collecting leads from events or webinars:
* **Fill incomplete registrations** - Many attendees provide minimal information
* **Professional contact discovery** - Find work emails instead of personal ones
* **Company intelligence** - Add missing company and job title data for better follow-up
### Database Hygiene Projects
Clean and enhance existing contact databases:
* **Complete missing fields** - Fill gaps in historical data
* **Validate existing information** - Confirm accuracy of current records
* **Professional contact updates** - Replace personal emails with business ones
## Configuration Options
### Field Selection
Choose which fields to enrich:
* **Standard fields**: Name, Email, Job Title, Company, LinkedIn URL
* **Contact details**: Phone numbers, addresses, social profiles
* **Company data**: Industry, employee count, revenue, location
### Overwrite Settings
Control whether to overwrite existing data:
* **Always overwrite** - Replace existing data with enriched information
* **Preserve existing data** - Only fill empty fields
* **Field-specific rules** - Different handling per field type
### When to Enrich
**Always enrich**: Process every lead regardless of data completeness
**Only when missing data**: Skip leads that already have complete information
### Data Element Preferences (Advanced Mode)
**Professional Email Discovery**:
* Enable to find work email addresses
* Automatically replaces personal emails (Gmail, Hotmail, etc.)
* Uses specialized email finding providers
**Phone Number Discovery**:
* Enable to find contact phone numbers
* Searches multiple providers for coverage
* Adds significant cost but improves contact rates
### Custom Instructions
Provide specific guidance for the enrichment process:
```text theme={null}
Only enrich leads from technology companies.
Prioritize finding LinkedIn profiles for all C-level executives.
Avoid using data from leads in the healthcare industry.
Focus on finding professional email addresses for sales roles.
```
## Best Practices
### Cost Management
* Use basic mode for budget-conscious projects
* Enable phone/email discovery selectively based on campaign needs
* Set up sequential enrichment to balance cost and coverage
### Data Quality
* Always include LinkedIn URL as a field - it's a reliable unique identifier
* Use custom instructions to specify data quality requirements
* Set up validation rules for critical fields
### Privacy Compliance
* Review data sources for compliance with regional regulations
* Configure consent tracking for enriched data where required
* Implement data retention policies for enriched information
## Next Steps
* **Set up your first enrichment**: Create an enrichment profile in Settings
* **Configure data providers**: Connect your preferred third-party data sources
* **Create enrichment workflows**: Build multi-step enrichment processes
* **Monitor performance**: Track hit rates and data quality metrics
# Enrichment Setup Guide
Source: https://docs.allgoodhq.com/use-cases/enrichment/setup-guide
## Creating Your First Enrichment Profile
Enrichment profiles are reusable configurations that define how to enrich your leads. You can attach these profiles to Skills and Flow steps across different workflows.
1. Navigate to **Settings** in the main menu
2. Click **Enrichment** to view your enrichment profiles
3. Click **Create Enrichment Profile** to start
**Advanced Enrichment** (Recommended)
* Uses allGood-managed web search and multiple data providers
* Higher hit rates and data quality
* Automatically finds LinkedIn profiles first
* Best for comprehensive lead enrichment
**Basic Enrichment**
* Single data provider lookup
* Lower cost per enrichment
* Predictable data sourcing
* Best when you have a preferred provider
**Always**
* Enriches every lead, even if data is already complete
* Good for data validation and updating existing records
* Higher cost but ensures freshest information
**Only when missing data** (Recommended)
* Only enriches leads with empty fields
* More cost-effective for partial datasets
* Skips leads that are already complete
If you chose Basic Enrichment:
1. **Select Provider**: Choose from available data sources
* ZoomInfo: Business contact database
* LinkedIn: Professional profile data
* Clearbit: Company and contact information
2. **Choose Lookup Method**: Select how to find leads
* By email address (most reliable)
* By name and company
* By LinkedIn URL
**Professional Email Discovery**
* ✅ Enable for B2B campaigns requiring work contacts
* Uses specialized email finding providers
* Replaces personal emails automatically
**Phone Number Discovery**
* Enable only when phone outreach is critical
* Significantly increases enrichment costs
* Searches across multiple phone number providers
Choose which fields should be enriched:
**Essential Fields**
* LinkedIn URL (highly recommended for unique identification)
* Email (if you need professional contacts)
* Job Title
* Company
**Additional Fields**
* First Name / Last Name
* Phone (only if phone discovery is enabled)
* Industry
* Company size/employee count
* Location (City, State, Country)
**Field Configuration Options**
* **Instructions**: Specific guidance for each field
* **Overwrite**: Whether to replace existing data
Metadata fields store information about the enrichment process itself:
**Useful Metadata Fields**
* **Enrichment Source**: Which provider found the data
* **Confidence Score**: How confident the system is in the data
* **LinkedIn Profile Found**: Whether a LinkedIn profile was located
* **Enrichment Date**: When the enrichment occurred
Provide specific guidance for the enrichment agent:
**Example Instructions**
```
Focus on technology companies with 100+ employees.
Only use LinkedIn data for C-level executives.
Prioritize finding professional email addresses over phone numbers.
Skip enrichment for leads from educational institutions.
```
1. **Name your profile** with something descriptive like "Standard B2B Enrichment"
2. **Add a description** explaining when to use this profile
3. **Save** the configuration
4. **Test** with a small sample of leads first
## Using Your Enrichment Profile
### In Worksheets
1. Add an "Advanced Enrichment" step to your workflow
2. Select your enrichment profile from the dropdown
3. Run a test with sample data
### In Skills
1. When configuring agent skills, attach your enrichment profile
2. The agent will use these settings automatically during execution
### Multiple Profiles Strategy
Create different profiles for different scenarios:
**High-Value Leads Profile**
* Advanced mode with email and phone discovery
* Comprehensive field enrichment
* Always enrich (even if data exists)
**Bulk Processing Profile**
* Basic mode with preferred provider
* Essential fields only
* Only when missing data
**Event Leads Profile**
* Advanced mode focused on professional contacts
* Custom instructions for event context
* Metadata tracking for event attribution
## Next Steps
* **Monitor Performance**: Track enrichment hit rates and costs
* **Optimize Profiles**: Adjust settings based on results
* **Scale Up**: Apply successful profiles across more workflows
* **Advanced Features**: Explore custom field mappings and validation rules
## Troubleshooting
* Add LinkedIn URL as a field (improves matching accuracy)
* Use Advanced mode for better provider coverage
* Check custom instructions for overly restrictive criteria
* Switch to Basic mode for budget control
* Disable phone number discovery
* Use "Only when missing data" setting
* Enable overwrite for fields that need updating
* Add validation metadata fields
* Use custom instructions to specify quality requirements
* Check data provider API key configuration
* Verify you have sufficient credits with the provider
* Try switching to a different lookup method
# Act-On Actions
Source: https://docs.allgoodhq.com/use-cases/erm/act-on-actions
What Mary does after she classifies a reply — Act-On contact syncs, marketing list adds, and native opt-outs.
**Actions** are what Mary *does* once she's classified a reply and pulled out any [extracted data](/use-cases/erm/data-extraction). They run automatically the moment a match is confirmed, so by the time an email shows up in the [Messages](/use-cases/erm/untitled-page-1) feed, the downstream work in Act-On is already done.
Actions are configured per category. A reply that lands in `Unsubscribe` runs one set of actions; one that lands in `Left Company` runs another.
## Available action types
### Forward Email
Forward the classified reply to another email address. This is the go-to action when a reply needs a human — for example, routing a `Human Request` reply to your shared sales inbox, or looping a specific rep in on `Out-Of-Office` replies for accounts they own.
Forward Email is a **generic action** and works the same way regardless of which marketing automation platform you're connected to.
| Field | What it does |
| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `To` | Destination email address. Accepts tokens (e.g., `{{ owner.email }}`). |
| `Subject` | Subject line for the forwarded message. Defaults to `Fwd: {{ subject }}`. |
| `Message` | Optional custom message body. Supports **Markdown** formatting and token insertion via **Insert Data**. Leave empty to use the default forwarding template. |
| `Original Email` | Controls how the original email is included in the forward — see below. |
The `Original Email` dropdown controls what happens with the source message:
| Option | Behavior |
| ---------------- | ------------------------------------------------------------------------- |
| `Include Inline` | Original message body is appended directly beneath your message |
| `Include Quoted` | Original message is included as a quoted reply — the familiar default |
| `Don't Include` | Forward only contains the message you wrote; the original body is dropped |
Under **Advanced**:
| Field | What it does |
| --------------- | -------------------------------------------------------------------------------------------------------------------- |
| `Message Style` | Rendering style for the forwarded email. `AllGood Branded` uses the allGood template; other styles may be available. |
| `CC` | Additional addresses to CC on the forward. Accepts tokens. |
| `Reply-To` | Override the reply-to address so recipient replies land somewhere other than the original sender. |
| `From Name` | Display name shown in the recipient's inbox (e.g., "Support Team" instead of the raw address). |
### Add to Worksheet
Push the sender into an allGood worksheet, optionally running it through the worksheet's flow steps. This is how you take a classified reply and hand it off to another allGood workflow — for example, adding a `Human Request` sender to a follow-up worksheet that triages and routes them, or pushing extracted replacement contacts from `Left Company` replies into a new-lead worksheet.
Add to Worksheet is a **generic action** and works the same way regardless of which marketing automation platform you're connected to.
| Field | What it does |
| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Worksheet` | The worksheet to add the contact to. Search by name to pick from your existing worksheets. |
| `Include all email data` | When checked, attaches the full email content (subject, body, from, headers) to the worksheet row. Useful when downstream flow steps need access to the raw reply. |
| `Fields` | Map worksheet fields to values or tokens. Left column is the worksheet field name; right column is the value or token to write. Click **+ Add Field** to add more mappings. |
Under **Advanced**:
| Field | What it does |
| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Behavior` | Choose whether Mary just adds the contact to the worksheet, or adds and immediately runs them through the worksheet's flow steps (`Add to Worksheet + Run Flow`). |
| `Include source metadata` | Attaches metadata about where the entry originated (which ERM configuration, category, classification rationale, etc.) so downstream steps can reference it. |
| `Only If` | Standard [conditional expression](#conditional-actions) that must evaluate to `true` for the action to run. Use to fan out behavior within a single category. |
### Sync Contact to Act-On
Create or update a contact in an Act-On **marketing list**, identified by the sender's email address. Mary writes the contact into the list you select, creating it if it doesn't exist yet and updating it if it does — both in a single call.
Act-On writes are **list-scoped**: every sync targets a specific marketing list rather than a global contact table. Pick the list from the **Marketing List** dropdown, which is populated from the contact lists in your Act-On account.
You can set:
* **Static values** — e.g., `Unsubscribed = true`
* **Dynamic values** — tokens that resolve at runtime from Mary's classification or [extracted data](/use-cases/erm/data-extraction), e.g., `Unsubscribe Reason = [allGood] {{ classification }}: {{ rationale }}`
Each row in the **field map** pairs an Act-On list **column** with a value or token. Use the field picker to choose from the columns on the selected list — the keys are the column names exactly as they appear in Act-On (e.g., `First Name`, `Company`), not internal API names. The email address is always included automatically — it's the lookup key.
There's no sync-mode dropdown. Act-On's list-record endpoint always upserts (create-or-update) in one call, so the sync both creates the contact when it's missing and updates it when it already exists.
Common tokens you can reference:
| Token | What it resolves to |
| ---------------------------------- | ---------------------------------------------------------------------------------------- |
| `{{ classification }}` | The category Mary assigned (e.g., `Unsubscribe`) |
| `{{ rationale }}` | Mary's plain-English reasoning for the classification |
| `{{ from.address }}` | The sender's email address |
| `{{ from.name }}` | The sender's display name |
| `{{ extractedFields[""] }}` | Any field defined in [Data Extraction](/use-cases/erm/data-extraction) for that category |
| `{{ enriched[""] }}` | Any field produced by an enrichment step earlier in the pipeline |
### Add to Act-On List
Add the sender to a specific Act-On marketing list. Mary writes the contact into the list you select from the **Marketing List** dropdown.
Like the sync action, this **upserts** by email — it creates the contact on the list if they aren't there yet and leaves an existing record in place otherwise. Because of that, you don't need to sync the contact first: adding to a list will never fail just because the contact was missing.
### Unsubscribe in Act-On
Opt the sender out of marketing email in Act-On. This is the cleanest way to honor an opt-out, because it records the suppression in Act-On directly rather than just flipping a field on a list.
The opt-out is keyed on the email address and is idempotent — Mary doesn't need to look the contact up first, so an unsubscribe is always honored.
Under **Advanced**, you can set a **Subscription Category**:
| Field | Behavior |
| ------------------------------- | ------------------------------------------------------------------------------------------------------ |
| Blank (default) | Account-level opt-out — the sender is suppressed from all marketing email. |
| A category (e.g. `Newsletters`) | Scopes the opt-out to a single Act-On subscription category, leaving the contact subscribed to others. |
Because the opt-out doesn't require a prior lookup, there's no **skip if not found** toggle on this action — it applies the suppression by email regardless of whether the contact already exists on a list.
## Example: Unsubscribe actions
Here's the action chain a typical `Unsubscribe` category would run:
Honor the opt-out so the suppression is recorded in Act-On and respected on future sends. Leave **Subscription Category** blank for an account-level opt-out.
Record the reason on the contact for the audit trail. Because the sync upserts, it also guarantees the contact is on your suppression list.
| Field | Value |
| -------------------- | ------------------------------------------------- |
| `Unsubscribed` | `true` |
| `Unsubscribe Reason` | `[allGood] {{ classification }}: {{ rationale }}` |
The `{{ rationale }}` token is particularly useful here — it gives your ops team a human-readable audit trail directly on the contact record explaining *why* Mary marked someone as unsubscribed.
## Stacking and reordering actions
You can configure multiple actions per category, and they run in the order they're listed. Use the up/down arrows on each action row to reorder them. Click **+ Add Action** to add more.
Order matters mainly for **field dependencies** — if a later action references a field set by an earlier action, make sure the order reflects that dependency.
Unlike some platforms, Act-On's **Add to Act-On List** and **Sync Contact to Act-On** both upsert by email, so you don't need to order a sync before a list-add to make sure the contact exists — either action will create it.
## Conditional actions
Every action supports an **only-if** condition — a token expression that must evaluate to `true` for the action to run. This lets you fan out behavior within a single category. For example, only add to a "Hot Leads" list when an extracted `intent` field is `high`, while still running the rest of the chain for everyone.
Act-On actions don't expose a **skip if not found** toggle. None of them do a prior contact lookup — syncs and list-adds upsert by email, and unsubscribes apply by email — so there's no "missing contact" case to skip or error on.
## Fetching contact data (optional)
If you want to reference a sender's existing Act-On fields inside your action templates — for example, writing their `Owner` or `Region` into a forward — add a **Fetch Act-On Contact** step to the category's data pipeline. It looks the contact up by email and exposes the record to later templates:
| Token | What it resolves to |
| ---------------------------------- | --------------------------------------- |
| `{{ actOnContact.email }}` | The fetched contact's email address |
| `{{ actOnContact["FIELD_NAME"] }}` | Any field on the fetched Act-On contact |
**Fetch Act-On Contact** is the only piece of Act-On that needs an **Account ID**. Set it on the Act-On integration (**Settings → Integrations → Act-On**) — the fetcher can't look contacts up without it. None of the actions above require it.
## Best practices
* **Use the `[allGood]` prefix in audit fields.** Following the example above (`Unsubscribe Reason = [allGood] ...`) makes it easy to see at a glance which records were touched by Mary versus a human or another system.
* **Use the list's column names, and pick from the field picker.** The field-map keys must match the columns on the selected marketing list exactly. The picker lists them for you so you don't have to guess — a column name that doesn't exist on the list will fail at execution time.
* **Prefer the native unsubscribe.** For opt-outs, use **Unsubscribe in Act-On** rather than just setting a field on a list — it records the suppression in Act-On so it's honored on future sends.
* **Pick the right list up front.** Every sync and list-add targets one marketing list. If you suppress and report out of a dedicated list (e.g. `Unsubscribed by Mary`), point both the sync and the add at it.
* **Test the full chain, not just the classification.** The [Test Suite](/use-cases/erm/test-suite) validates categorization and extraction; once those pass, sanity-check the actions against a sandbox Act-On account before going live.
# Categories
Source: https://docs.allgoodhq.com/use-cases/erm/categories
Define the buckets Mary uses to classify every incoming reply — and the plain-English prompts that teach her how to recognize them.
A **category** is a bucket that an incoming reply can fall into. You give it a name and write a plain-English prompt that tells Mary how to recognize it. When an email arrives, Mary reads the body, subject, and metadata, compares it against every category you've defined, and picks the best match.
Categories are the foundation of every reply management workflow — they're the layer that everything else ([data extraction](/use-cases/erm/data-extraction) and [actions](/use-cases/erm/actions)) hangs off of.
## Default categories
Every workspace ships with a starting set of categories that cover the most common reply types. You can customize the prompts, rename them, or delete them entirely.
| Category | What it captures |
| ----------------- | ---------------------------------------------------------------------- |
| **Unsubscribe** | Real people actively asking to be removed from your list |
| **Bounce** | Delivery failure notifications |
| **Left Company** | Auto-replies indicating the recipient no longer works there |
| **Human Request** | Genuine replies from a person who wants a response |
| **Changed Email** | Notifications that the person's email address has changed |
| **Out-Of-Office** | Temporary unavailability messages |
| **Auto Reply** | Generic automated responses (e.g., "Thanks, we received your message") |
| **Spam** | Irrelevant or junk messages |
| **Other** | Anything that doesn't fit another category |
## Writing a good category prompt
The prompt is the most important part of each category. Mary reads it literally, so the more specific and clear you are, the more accurately she'll classify. A strong prompt does two things: it tells Mary **what to look for** and **what to rule out**.
> *"Real people asking to be removed from our email list. Look for phrases like 'please remove me,' 'stop emailing me,' or 'why am I still getting these emails.' Be careful — don't count emails that just have 'unsubscribe' in the footer, those are usually spam."*
Notice how this prompt tells Mary both what to look for **and** what to explicitly rule out. That kind of nuance matters — without the second sentence, promotional emails with unsubscribe footers could be miscategorized.
> *"Automatic replies saying the person doesn't work at that company anymore. Messages like 'John no longer works here' or 'This employee has left the organization.' No new contact info is provided."*
This prompt also distinguishes Left Company from a similar-looking scenario — because if a replacement contact *is* mentioned, that's worth noting separately in the [data extraction](/use-cases/erm/data-extraction) step.
> *"Automatic responses indicating that the recipient is currently unavailable. Common phrases include 'out of office,' 'on vacation,' or 'will return on \[date].' These are temporary — the person will be back."*
The final sentence ("the person will be back") is a conceptual cue for Mary that helps her distinguish this from Left Company, where the person is gone permanently.
### Tips for writing prompts that hold up
* **Lead with the positive case.** Open with what Mary *should* match, in the phrasing she's likely to see in real emails.
* **Name the false positives.** If a similar-looking reply belongs in a different category, call it out explicitly. Mary will use that contrast to disambiguate.
* **Quote the phrases.** Specific example phrases ("please remove me," "no longer works here") give Mary concrete anchors to look for.
* **Keep it short.** Two or three sentences is usually enough. Long prompts dilute the signal.
## Adding a new category
The default set covers the common cases, but if your workflow has a reply type that doesn't fit — say, "Requesting Pricing" or "Meeting Reschedule" — you can add a category of your own.
Open a new category form from the Categories & Actions page.
Use a short, descriptive name. This name will appear in Messages, Search, and your action configuration.
Describe the reply type in plain English, following the patterns above. Lead with the positive case, name the false positives, and quote example phrases.
Before relying on the category in production, add a few cases to the [Test Suite](/use-cases/erm/test-suite) — both positives you expect to match and negatives that shouldn't.
Treat each category like a piece of routing logic in a smart campaign: validate it with real examples before you let it run against live traffic. The [Test Suite](/use-cases/erm/test-suite) is built for exactly this.
***
# Data Extraction
Source: https://docs.allgoodhq.com/use-cases/erm/data-extraction
Pull structured fields out of incoming replies so you can use them in downstream Marketo updates and list adds.
Classifying a reply tells you *what kind* of email it is. **Data Extraction** tells you *what's in it*. For some categories — Left Company, Out-Of-Office, Changed Email — the body of the reply contains information you'll want to use downstream: a replacement contact, a return date, a new email address. Data Extraction is how Mary pulls those values out as named fields.
Once extracted, those values become variables you can reference in your [Actions](/use-cases/erm/actions) — for example, creating a new Marketo lead using the extracted `newContactEmail`.
## How extraction works
For each category, you define a list of fields. Each field has:
* **A field name** — the variable name you'll reference in actions (e.g., `newContactEmail`)
* **A description** — a plain-English explanation of what the field contains, which Mary uses to find it in the email
When a reply matches the category, Mary reads the email and tries to populate each field. If a field isn't present and you haven't marked it as required, Mary leaves it blank.
## Example configurations
### Left Company
When a reply tells you the recipient has left the company, you often want to capture the replacement contact's details so you can route them into your nurture flow.
| Field name | Description |
| ----------------- | --------------------------------------------------- |
| `newContactEmail` | Email address of a replacement contact, if provided |
| `newContactName` | Name of a replacement contact, if provided |
### Out-Of-Office
For OOO replies, the most useful piece of data is when the person is coming back — so you can pause outreach until then.
| Field name | Description |
| ------------ | -------------------------------------------- |
| `returnDate` | The date the person will return, if provided |
### Changed Email
For "I have a new email" replies, capture the new address so you can update the lead record.
| Field name | Description |
| ---------- | ------------------------------ |
| `newEmail` | The person's new email address |
## Required vs. optional fields
Each field can be marked as **Required** or left as optional.
Mark a field as **Required** if the email must contain that data to be processed. If a required field can't be found, the email will be flagged for review rather than processed automatically — preventing partial or broken downstream actions.
Use **Required** when the field is load-bearing for an action — for example, if your "Changed Email" category is wired up to update the lead's primary email, you want the extraction to be all-or-nothing.
Leave the field **optional** when the data is nice-to-have but not blocking — for example, the return date on an OOO. If Mary can't find it, you probably still want the email classified and logged.
## Using extracted values in actions
Once a value is extracted, it's available as a variable in the [Actions](/use-cases/erm/actions) configuration for that category. Reference it with the standard token syntax — for example, `{{ newContactEmail }}` — anywhere the action accepts a dynamic value.
This is how the full chain comes together: a reply gets classified, fields get pulled, and those values flow directly into the Marketo updates and list adds you've configured.
Before relying on an extraction in production, add the case to the [Test Suite](/use-cases/erm/test-suite) with an extraction check. Use **Exact** matching for structured values (dates, emails) and **Semantic** matching for free-text fields the model may paraphrase.
# Migrating from Drift
Source: https://docs.allgoodhq.com/use-cases/erm/drift-migration
Connect your Drift (SiftRock) account to allGood and start your email-reply management migration.
This guide walks you through connecting your Drift (SiftRock) account to allGood and starting your migration. It takes just a few minutes.
**Before you start**—you'll need the following:
* Your **Drift username (email) and password** — the same ones you use to sign in at `email.drift.com`.
* Access to allGood **Settings** with admin permissions.
## Migration steps
In allGood, go to **Settings** and select the **Integrations** tab.
Under **Migration**, locate the **Drift** integration.
Open the Drift integration and enter your **Drift username (email)** and **password**, then click **Create integration**.
Your credentials are stored securely (encrypted) and are used only to read your Drift configuration.
Wait for the confirmation that the **integration is connected**.
Back in **Settings → Integrations**, find the **Drift** integration again and click **Edit settings**. Then click **Begin migration**.
allGood will start pulling your Drift configuration. This can take a moment — you'll see a "Fetching your Drift configuration…" message while it runs.
When the migration finishes, you'll see a **summary of your Drift instance** — including your configured skills and what each one does.
Once you've completed these steps, **let the allGood team know**. We'll take it from there and reach back out to finish your migration.
**Questions or something not working?** Reach out to the allGood team and we'll help you through it.
# Eloqua Actions
Source: https://docs.allgoodhq.com/use-cases/erm/eloqua-actions
What Mary does after she classifies a reply — Eloqua contact updates, shared list adds, and native unsubscribes.
**Actions** are what Mary *does* once she's classified a reply and pulled out any [extracted data](/use-cases/erm/data-extraction). They run automatically the moment a match is confirmed, so by the time an email shows up in the [Messages](/use-cases/erm/messages) feed, the downstream work in Eloqua is already done.
Actions are configured per category. A reply that lands in `Unsubscribe` runs one set of actions; one that lands in `Left Company` runs another.
## Available action types
### Forward Email
Forward the classified reply to another email address. This is the go-to action when a reply needs a human — for example, routing a `Human Request` reply to your shared sales inbox, or looping a specific rep in on `Out-Of-Office` replies for accounts they own.
Forward Email is a **generic action** and works the same way regardless of which marketing automation platform you're connected to.
| Field | What it does |
| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `To` | Destination email address. Accepts tokens (e.g., `{{ owner.email }}`). |
| `Subject` | Subject line for the forwarded message. Defaults to `Fwd: {{ subject }}`. |
| `Message` | Optional custom message body. Supports **Markdown** formatting and token insertion via **Insert Data**. Leave empty to use the default forwarding template. |
| `Original Email` | Controls how the original email is included in the forward — see below. |
The `Original Email` dropdown controls what happens with the source message:
| Option | Behavior |
| ---------------- | ------------------------------------------------------------------------- |
| `Include Inline` | Original message body is appended directly beneath your message |
| `Include Quoted` | Original message is included as a quoted reply — the familiar default |
| `Don't Include` | Forward only contains the message you wrote; the original body is dropped |
Under **Advanced**:
| Field | What it does |
| --------------- | -------------------------------------------------------------------------------------------------------------------- |
| `Message Style` | Rendering style for the forwarded email. `AllGood Branded` uses the allGood template; other styles may be available. |
| `CC` | Additional addresses to CC on the forward. Accepts tokens. |
| `Reply-To` | Override the reply-to address so recipient replies land somewhere other than the original sender. |
| `From Name` | Display name shown in the recipient's inbox (e.g., "Support Team" instead of the raw address). |
### Add to Worksheet
Push the sender into an allGood worksheet, optionally running it through the worksheet's flow steps. This is how you take a classified reply and hand it off to another allGood workflow — for example, adding a `Human Request` sender to a follow-up worksheet that triages and routes them, or pushing extracted replacement contacts from `Left Company` replies into a new-lead worksheet.
Add to Worksheet is a **generic action** and works the same way regardless of which marketing automation platform you're connected to.
| Field | What it does |
| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Worksheet` | The worksheet to add the contact to. Search by name to pick from your existing worksheets. |
| `Include all email data` | When checked, attaches the full email content (subject, body, from, headers) to the worksheet row. Useful when downstream flow steps need access to the raw reply. |
| `Fields` | Map worksheet fields to values or tokens. Left column is the worksheet field name; right column is the value or token to write. Click **+ Add Field** to add more mappings. |
Under **Advanced**:
| Field | What it does |
| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Behavior` | Choose whether Mary just adds the contact to the worksheet, or adds and immediately runs them through the worksheet's flow steps (`Add to Worksheet + Run Flow`). |
| `Include source metadata` | Attaches metadata about where the entry originated (which ERM configuration, category, classification rationale, etc.) so downstream steps can reference it. |
| `Only If` | Standard [conditional expression](#conditional-actions) that must evaluate to `true` for the action to run. Use to fan out behavior within a single category. |
### Sync Contact to Eloqua
Create or update a contact record in Eloqua, identified by the sender's email address. Mary looks the contact up by email, then creates or updates it depending on the sync mode you choose.
You can set:
* **Static values** — e.g., `leadStatus = Subscriber`
* **Dynamic values** — tokens that resolve at runtime from Mary's classification or [extracted data](/use-cases/erm/data-extraction), e.g., `leadStatus = [allGood] {{ classification }}`
Each row in the **field map** pairs an Eloqua contact field's internal name with a value or token. The email address is always included automatically — it's the lookup key.
You also choose a **sync mode** under the advanced tab:
| Mode | Behavior |
| ------------------ | ----------------------------------------------------------------------- |
| `Create or Update` | Update the contact if it exists, otherwise create it (the safe default) |
| `Create Only` | Create a new contact; fail if one already exists for that email |
| `Update Only` | Update an existing contact; fail (or skip) if no contact is found |
Common tokens you can reference:
| Token | What it resolves to |
| ---------------------------------- | ---------------------------------------------------------------------------------------- |
| `{{ classification }}` | The category Mary assigned (e.g., `Unsubscribe`) |
| `{{ rationale }}` | Mary's plain-English reasoning for the classification |
| `{{ from.address }}` | The sender's email address |
| `{{ from.name }}` | The sender's display name |
| `{{ extractedFields[""] }}` | Any field defined in [Data Extraction](/use-cases/erm/data-extraction) for that category |
### Add to Eloqua Shared List
Add the sender's contact to a specific Eloqua shared list. Mary looks the contact up by email and adds them to the list you select. The list is identified by ID, and allGood will display the list name for confirmation once you've picked it from the shared lists in your Eloqua instance.
When adding a contact to an Eloqua shared list, the contact must already exist in Eloqua. If it might not, add a **Sync Contact to Eloqua** action *before* the **Add to Eloqua Shared List** action — the sync (in `Create or Update` mode) will create the contact if it doesn't exist.
### Unsubscribe in Eloqua
Opt the sender out of email in Eloqua. Mary looks the contact up by email and sets their subscription status to unsubscribed (`isSubscribed = false`). This is the cleanest way to honor an opt-out, because it uses Eloqua's native subscription status rather than just flipping a custom field.
If the contact isn't found in Eloqua, this action skips quietly by default. You can flip this behavior with the **skip if not found** toggle if you'd rather treat a missing contact as a hard error.
## Example: Unsubscribe actions
Here's the action chain a typical `Unsubscribe` category would run:
Honor the opt-out using the Unsubscribe in Eloqua action so the suppression is respected everywhere
Record the reason on the contact for the audit trail. Using `Create or Update` mode also guarantees the contact exists before the later steps run.
| Field | Value |
| --------------- | ------------------------------------------------- |
| `leadStatus` | `Unqualified` |
| `allgoodReason` | `[allGood] {{ classification }}: {{ rationale }}` |
Drop the contact into the Mary-managed unsubscribe list for downstream reporting and suppression.
| Field | Value |
| ------------- | ---------------------------------- |
| Email address | `{{ from.address }}` |
| List | `Unsubscribed by Mary` (ID: 19044) |
The `{{ rationale }}` token is particularly useful here — it gives your ops team a human-readable audit trail directly on the contact record explaining *why* Mary marked someone as unsubscribed.
## Stacking and reordering actions
You can configure multiple actions per category, and they run in the order they're listed. Use the up/down arrows on each action row to reorder them. Click **+ Add Action** to add more.
Order matters in two cases:
* **Dependent actions.** If an `Add to Shared List` depends on the contact existing, put `Sync Contact to Eloqua` (in `Create or Update` mode) first.
* **Field dependencies.** If a later action references a field set by an earlier action, make sure the order reflects that dependency.
## Conditional actions
Every action supports an **only-if** condition — a token expression that must evaluate to `true` for the action to run. This lets you fan out behavior within a single category. For example, only add to a "Hot Leads" list when an extracted `intent` field is `high`, while still running the rest of the chain for everyone.
Actions that look a contact up by email also expose a **skip if not found** toggle, which controls whether a missing contact is treated as a quiet skip or a hard error.
## Best practices
* **Use the `[allGood]` prefix in audit fields.** Following the example above (`allgoodReason = [allGood] ...`) makes it easy to see at a glance which records were touched by Mary versus a human or another system.
* **Use field *internal* names, not labels.** The field map keys must be Eloqua's internal contact field names, not the friendly labels shown elsewhere in the UI. A field name that doesn't exist will fail at execution time.
* **Prefer the native unsubscribe.** For opt-outs, use **Unsubscribe in Eloqua** rather than just setting a custom field — it updates Eloqua's subscription status so suppression is honored everywhere.
* **Test the full chain, not just the classification.** The [Test Suite](/use-cases/erm/test-suite) validates categorization and extraction; once those pass, sanity-check the actions in a sandbox Eloqua instance before going live.
* **Watch the order when adding to lists.** Most shared-list add failures we see are contacts that didn't exist yet. Lead with a **Sync Contact to Eloqua** in `Create or Update` mode to be safe.
# Enrichment
Source: https://docs.allgoodhq.com/use-cases/erm/enrichment
Fill in the details an incoming reply doesn't contain — job title, company, LinkedIn URL — so your downstream actions have the full picture.
Classifying a reply tells you *what kind* of email it is. [Data Extraction](/use-cases/erm/data-extraction) tells you *what's in it*. **Enrichment** goes one step further: it looks the contact up across third-party data providers and fills in the fields the email itself never mentioned — things like job title, company, or LinkedIn URL.
Enrichment runs as a dedicated step in the pipeline, after extraction and before your [Actions](/use-cases/erm/actions):
> Classify → Fetch → Extract → **Enrich** → Actions
Once the contact is enriched, those values become variables you can reference in that category's actions — for example, setting a Marketo `Title` field from the enriched job title, or creating a brand-new lead for a replacement contact with their company already filled in.
Enrichment is **optional and configured per category**. A reply that lands in `Left Company` might enrich a newly-extracted contact; one that lands in `Unsubscribe` needs no enrichment at all.
This page covers wiring enrichment into a Reply Management category. For help building or tuning the **enrichment profile** itself — picking Basic vs. Advanced mode, choosing data providers, and deciding which fields to look for — start with the [Enrichment Setup Guide](/use-cases/enrichment/setup-guide), or read [Lead Enrichment](/use-cases/enrichment/index) for how enrichment works across allGood.
## Adding enrichment to a category
Navigate to **Reply Management → Categories & Actions**, then click **Enrich** on the category row to open the enrichment panel. The panel has two parts: **who** to enrich (the enrichment input) and **which profile** to enrich them with.
By default, Mary enriches the person who sent the reply. Point the input somewhere else to enrich a different contact — see [Enrichment input](#enrichment-input-who-to-enrich) below.
Pick a profile from the list, or click **Create New Profile**. The profile decides *how* enrichment runs — which data providers to use and which fields to look for.
Your enrichment configuration is saved with the rest of the category. Click **Save & Publish** on the Categories & Actions page when you're ready to push it live.
Reference the results in that category's [Actions](/use-cases/erm/actions) with `{{ enriched["Field"] }}`.
To turn enrichment off for a category, open the panel and click **Remove enrichment from *\[category]***.
## Enrichment input (who to enrich)
The **Enrichment Input** section controls *whose* details Mary looks up. By default she enriches the person who sent the email — the input ships pre-set to the sender's address.
To enrich **someone other than the sender** — most commonly a new contact mentioned in the reply — click **+ Add Field** and map one or more fields to a value from the email. Each row is a pair:
* **Field** — what the value *is*, in enrichment's vocabulary (`Email`, `First Name`, `Last Name`, `LinkedIn URL`, `Company`)
* **Value** — where to find it, as a token. This can reference the sender (`{{ from.address }}`), an [extracted field](/use-cases/erm/data-extraction) (`{{ extractedFields["newContactEmail"] }}`), or fetched CRM data
**Map only what you actually have.** There's no required set of fields — a single `Email` row is a perfectly valid input, and often it's all a reply gives you. Add more rows only when the reply reliably contains more; each extra field gives enrichment another signal to match on, but a blank one costs you nothing.
The **Field** name matters — it tells Mary what each value represents so she can run the right lookups (an `Email` drives email-based lookups, a `LinkedIn URL` drives LinkedIn lookups, and so on). Stick to the suggested names so the value is actually used.
Leave the input untouched. Mary enriches whoever sent the reply.
| Field | Value |
| ------- | -------------------- |
| `Email` | `{{ from.address }}` |
In a `Left Company` category, you might [extract](/use-cases/erm/data-extraction) a replacement contact's details, then enrich *them* instead of the sender.
| Field | Value |
| ------------ | ------------------------------------------ |
| `Email` | `{{ extractedFields["newContactEmail"] }}` |
| `First Name` | `{{ extractedFields["newFirstName"] }}` |
| `Last Name` | `{{ extractedFields["newLastName"] }}` |
Plenty of replies name a replacement contact by email address and nothing else. That's enough — map the email on its own and let enrichment fill in the name, title, and company.
| Field | Value |
| ------- | ------------------------------------------ |
| `Email` | `{{ extractedFields["newContactEmail"] }}` |
When enriching an extracted contact, mark the extract field as **Required** (or add an **only runs if** condition to the downstream action) so you don't act on a half-empty record when the reply didn't actually name a replacement.
## Choosing an enrichment profile
An **enrichment profile** is a reusable recipe for *how* to enrich a contact — which data providers to use, which fields to look for, and when to skip. The same profile can be shared across many categories, and across other parts of allGood such as [List Upload](/use-cases/list-upload/features/enrich).
From the enrichment panel you can:
* **Select a profile** — click any profile in the list to use it for this category. The selected profile is highlighted, and each row shows whether it's an **Advanced** or **Basic** profile plus how many categories already use it.
* **Create a new profile** — click **Create New Profile** to spin one up and open it for editing.
* **Edit a profile** — click **Edit** on any profile to change its fields, providers, and run conditions.
| Badge | What it means |
| -------------------------- | ------------------------------------------------------------------------------------------------------------- |
| **Advanced** | Searches the web for a LinkedIn profile first, then tries multiple providers automatically. Higher hit rates. |
| **Basic** | A single lookup against one provider you choose. Cheaper and more predictable. |
| **Used by *n* categories** | How many Reply Management categories already point at this profile. |
| **Not used by ERM yet** | The profile exists in your workspace but no category uses it — it may still be in use elsewhere in allGood. |
Because profiles are shared, editing one affects **every** category, skill, and flow step that uses it. Check the usage count on the row before you change a profile's internals — if only one category should change, create a new profile instead.
Configuring a profile's internals — enrichment mode, the fields to find, provider lookups, and when-to-run rules — is covered in the [Enrichment Setup Guide](/use-cases/enrichment/setup-guide). See [Lead Enrichment](/use-cases/enrichment/index) for how enrichment works more broadly.
## Using enriched values in actions
Once a contact is enriched, each field the profile produced is available as a variable in that category's [Actions](/use-cases/erm/actions). Reference it with the `enriched` token:
```
{{ enriched["First Name"] }}
{{ enriched["Last Name"] }}
{{ enriched["Job Title"] }}
{{ enriched["Company"] }}
{{ enriched["LinkedIn URL"] }}
```
You don't have to type these from memory — open the `{}` token picker on any action field and choose **Enriched Fields** to see everything the enrichment step produces.
This is how the chain comes together: a reply is classified, a contact's identity is assembled (sender or extracted), Mary enriches it, and those values flow straight into your Marketo updates, list adds, or new-lead creation.
## Example: enrich a replacement contact from a "Left Company" reply
A common pattern: someone has left, the reply names their replacement, and you want to create that replacement as a fully-enriched lead in Marketo.
In the `Left Company` category's [Data Extraction](/use-cases/erm/data-extraction), capture the replacement's details.
| Field name | Description |
| ----------------- | --------------------------------------------------- |
| `newContactEmail` | Email address of a replacement contact, if provided |
| `newFirstName` | First name of a replacement contact, if provided |
| `newLastName` | Last name of a replacement contact, if provided |
In the enrichment panel, point the input at the extracted contact and pick a profile — here, one built for new contacts rather than the workspace default.
| Field | Value |
| ------------ | ------------------------------------------ |
| `Email` | `{{ extractedFields["newContactEmail"] }}` |
| `First Name` | `{{ extractedFields["newFirstName"] }}` |
| `Last Name` | `{{ extractedFields["newLastName"] }}` |
Only `Email` is needed here — drop the name rows if your replies don't reliably include them, and enrichment will resolve the name itself.
Add a **Sync Lead to Marketo** action (`Create or Update`) that identifies the lead by the extracted email and fills the rest from the enriched values.
| Marketo field | Value |
| ------------- | -------------------------------- |
| `company` | `{{ enriched["Company"] }}` |
| `title` | `{{ enriched["Job Title"] }}` |
| `LinkedIn__c` | `{{ enriched["LinkedIn URL"] }}` |
## How enrichment behaves
* **Skipped when not configured.** Categories without an enrichment profile skip the step entirely — no credits consumed.
* **Skipped when there's nothing to enrich.** If the input resolves to no contact — for example, no replacement email was extracted — enrichment is skipped for that reply.
* **Blank fields, not errors.** If enrichment runs but finds no match, the `enriched` fields come through empty rather than failing the reply. Downstream actions still run, so guard anything load-bearing with an **only runs if** condition.
* **The profile decides when to run.** A profile can be set to only enrich when data is missing, so Mary won't burn credits re-fetching fields you already have. See the [Enrichment Setup Guide](/use-cases/enrichment/setup-guide).
* **Every run is traceable.** Open a reply in [Messages](/use-cases/erm/messages) to see the enrichment result — which providers were tried, what was found, and the full agent run.
Validate enrichment the same way you validate everything else in Reply Management: add the case to the [Test Suite](/use-cases/erm/test-suite) so you can confirm the right contact gets enriched before the configuration goes live.
# Getting Started with Email Reply Management
Source: https://docs.allgoodhq.com/use-cases/erm/getting-started
Go from zero to a working inbox in a few steps.
Mary reads every reply that lands in your marketing inbox, sorts it into a category, and takes the action you've told her to take — automatically, 24/7. Here's how to go from zero to a working inbox in a few steps.
We recommend reading the entire guide before starting any of the steps.
## Step 1a: Connect your inbox
Start working with your IT team to point your marketing Reply-To email addresses at allGood. This step may take time so we recommend kicking this off as soon as possible.
* Docs: [Hosted Mailbox + Custom Domains](/integrations/email/hosted-mailbox)
## Step 1b: Set up your integration user
At the same time, begin the process for setting up your integration user. Depending on your organization structure, you may also need to work with your IT team for this. While your IT team is setting up the hosted mailbox, start the set-up in allGood — once you have the integration user, go ahead and connect it in allGood.
* Docs: [Marketo Integration](/integrations/marketo) · [HubSpot Integration](/integrations/hubspot) · [Salesforce Integration](/integrations/salesforce/erm)
## Step 2: Hop into allGood and start with what's already built
**Review the Default Categories.** Every workspace comes with 7 out-of-the-box categories, already trained and ready to run — no setup required: Unsubscribe, Out of Office, Spam, Bounce, Sales Request, Left Company, and Other. Each one comes with sensible default actions already wired up, so you get value from day one.
* Read: [Email Reply Management, Ready on Day One](https://allgoodhq.com/blog/email-reply-management-day-one)
* Docs: [Categories](/use-cases/erm/categories)
**Migrating off Drift Email?** You don't need to rebuild anything. Connect your Drift account and allGood automatically reads your existing setup and recreates it — every rule, route, and action — as a working allGood configuration.
* Read: [Drift Email Is Ending. Migrating to allGood Takes Minutes.](https://allgoodhq.com/blog/drift-to-allgood-migration)
* Docs: [Migrating from Drift](/use-cases/erm/drift-migration)
## Step 3: Make it yours (optional)
The defaults cover the common cases, but you can rename categories, edit their definitions, or add your own for whatever your team sees in its inbox. A clear definition is the single biggest lever for accurate classification.
* Read: [Best Practices for Writing Category Definitions in ERM](https://allgoodhq.com/blog/erm-category-definitions)
* Docs: [Setting Up or Altering a Category](/use-cases/erm/setting-up-or-altering-a-category) · [Data Extraction](/use-cases/erm/data-extraction)
## Step 4: Turn categories into automations
Every category can trigger real actions in your MAP or CRM — updating a record, adding someone to a list, forwarding a hot lead to sales.
A few ideas to get you started: suppress leads while they're out of office, auto-create a new contact when someone leaves their company, or log the reason behind every unsubscribe.
* Read: [3 Email Reply Automations You Can Build in allGood](https://allgoodhq.com/blog/build-with-erm)
* Docs: [Marketo Actions](/use-cases/erm/marketo-actions) · [HubSpot Actions](/use-cases/erm/hubspot-actions) · [Eloqua Actions](/use-cases/erm/eloqua-actions) · [Salesforce Actions](/use-cases/erm/salesforce-actions)
## Step 5: Test before it touches real replies
Once you've finalized your configuration and before live emails start flowing through (be sure to coordinate with IT on this), use our Test Suite to validate your set-up.
The Test Suite lets you check categorizations and extracted fields against real reply examples — so you catch a broken definition in testing, not in your inbox.
* Read: [Introducing the Email Reply Management Test Suite](https://allgoodhq.com/blog/erm-test-suite)
* Docs: [Test Suite](/use-cases/erm/test-suite)
## Keep an eye on things
Once you've finished testing and you're happy with your set-up, give IT the green light to start sending emails into allGood.
Once live, the [Messages](/use-cases/erm/messages) view shows every reply Mary has processed, the category she assigned, and her reasoning for the call — the fastest way to spot-check a category after a change.
## Go deeper
The full technical rundown of how an email gets processed, start to finish.
Have any more questions? Reach out to [support@allgoodhq.com](mailto:support@allgoodhq.com)
# HubSpot Actions
Source: https://docs.allgoodhq.com/use-cases/erm/hubspot-actions
What Mary does after she classifies a reply — HubSpot contact updates, static segment adds, and native unsubscribes.
**Actions** are what Mary *does* once she's classified a reply and pulled out any [extracted data](/use-cases/erm/data-extraction). They run automatically the moment a match is confirmed, so by the time an email shows up in the [Messages](/use-cases/erm/messages) feed, the downstream work in HubSpot is already done.
Actions are configured per category. A reply that lands in `Unsubscribe` runs one set of actions; one that lands in `Left Company` runs another.
## Available action types
### Forward Email
Forward the classified reply to another email address. This is the go-to action when a reply needs a human — for example, routing a `Human Request` reply to your shared sales inbox, or looping a specific rep in on `Out-Of-Office` replies for accounts they own.
Forward Email is a **generic action** and works the same way regardless of which marketing automation platform you're connected to.
| Field | What it does |
| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `To` | Destination email address. Accepts tokens (e.g., `{{ owner.email }}`). |
| `Subject` | Subject line for the forwarded message. Defaults to `Fwd: {{ subject }}`. |
| `Message` | Optional custom message body. Supports **Markdown** formatting and token insertion via **Insert Data**. Leave empty to use the default forwarding template. |
| `Original Email` | Controls how the original email is included in the forward — see below. |
The `Original Email` dropdown controls what happens with the source message:
| Option | Behavior |
| ---------------- | ------------------------------------------------------------------------- |
| `Include Inline` | Original message body is appended directly beneath your message |
| `Include Quoted` | Original message is included as a quoted reply — the familiar default |
| `Don't Include` | Forward only contains the message you wrote; the original body is dropped |
Under **Advanced**:
| Field | What it does |
| --------------- | -------------------------------------------------------------------------------------------------------------------- |
| `Message Style` | Rendering style for the forwarded email. `AllGood Branded` uses the allGood template; other styles may be available. |
| `CC` | Additional addresses to CC on the forward. Accepts tokens. |
| `Reply-To` | Override the reply-to address so recipient replies land somewhere other than the original sender. |
| `From Name` | Display name shown in the recipient's inbox (e.g., "Support Team" instead of the raw address). |
### Add to Worksheet
Push the sender into an allGood worksheet, optionally running it through the worksheet's flow steps. This is how you take a classified reply and hand it off to another allGood workflow — for example, adding a `Human Request` sender to a follow-up worksheet that triages and routes them, or pushing extracted replacement contacts from `Left Company` replies into a new-lead worksheet.
Add to Worksheet is a **generic action** and works the same way regardless of which marketing automation platform you're connected to.
| Field | What it does |
| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Worksheet` | The worksheet to add the contact to. Search by name to pick from your existing worksheets. |
| `Include all email data` | When checked, attaches the full email content (subject, body, from, headers) to the worksheet row. Useful when downstream flow steps need access to the raw reply. |
| `Fields` | Map worksheet fields to values or tokens. Left column is the worksheet field name; right column is the value or token to write. Click **+ Add Field** to add more mappings. |
Under **Advanced**:
| Field | What it does |
| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Behavior` | Choose whether Mary just adds the contact to the worksheet, or adds and immediately runs them through the worksheet's flow steps (`Add to Worksheet + Run Flow`). |
| `Include source metadata` | Attaches metadata about where the entry originated (which ERM configuration, category, classification rationale, etc.) so downstream steps can reference it. |
| `Only If` | Standard [conditional expression](#conditional-actions) that must evaluate to `true` for the action to run. Use to fan out behavior within a single category. |
### Sync Contact to HubSpot
Create or update a contact record in HubSpot, identified by the sender's email address. Mary looks the contact up by email, then creates or updates it depending on the sync mode you choose.
You can set:
* **Static values** — e.g., `lifecyclestage = subscriber`
* **Dynamic values** — tokens that resolve at runtime from Mary's classification or [extracted data](/use-cases/erm/data-extraction), e.g., `hs_lead_status = [allGood] {{ classification }}`
Each row in the **field map** pairs a HubSpot contact property's internal name (the same name you see in HubSpot **Settings → Properties**) with a value or token. The `email` property is always included automatically — it's the lookup key.
You also choose a **sync mode** under the advanced tab:
| Mode | Behavior |
| ------------------ | ----------------------------------------------------------------------- |
| `Create or Update` | Update the contact if it exists, otherwise create it (the safe default) |
| `Create Only` | Create a new contact; fail if one already exists for that email |
| `Update Only` | Update an existing contact; fail (or skip) if no contact is found |
Common tokens you can reference:
| Token | What it resolves to |
| ---------------------------------- | ---------------------------------------------------------------------------------------- |
| `{{ classification }}` | The category Mary assigned (e.g., `Unsubscribe`) |
| `{{ rationale }}` | Mary's plain-English reasoning for the classification |
| `{{ from.address }}` | The sender's email address |
| `{{ from.name }}` | The sender's display name |
| `{{ extractedFields[""] }}` | Any field defined in [Data Extraction](/use-cases/erm/data-extraction) for that category |
### Add to HubSpot Static Segment
Add the sender's contact to a specific HubSpot static segment (static list). Mary looks the contact up by email and adds them to the segment you select. The segment is identified by ID, and allGood will display the segment name for confirmation once you've picked it from the list of static segments in your HubSpot instance.
When adding a contact to a HubSpot static segment, the contact must already
exist in HubSpot. If it might not, add a **Sync Contact to HubSpot** action
*before* the **Add to HubSpot Static Segment** action — the sync (in `Create
or Update` mode) will create the contact if it doesn't exist.
### Unsubscribe in HubSpot
Opt the sender out of all marketing email in HubSpot. Mary looks the contact up by email and sets their subscription status to unsubscribed-from-all. This is the cleanest way to honor an opt-out, because it uses HubSpot's native subscription preferences rather than just flipping a property.
If the contact isn't found in HubSpot, this action skips quietly by default.
You can flip this behavior with the **skip if not found** toggle if you'd
rather treat a missing contact as a hard error.
## Example: Unsubscribe actions
Here's the action chain a typical `Unsubscribe` category would run:
Honor the opt-out using the Unsubscribe in Hubspot action so the suppression is respected everywhere
Record the reason on the contact for the audit trail. Using `Create or Update` mode also guarantees the contact exists before the later steps run.
| Field | Value |
| ---------------- | ------------------------------------------------- |
| `hs_lead_status` | `UNQUALIFIED` |
| `allgood_reason` | `[allGood] {{ classification }}: {{ rationale }}` |
Drop the contact into the Mary-managed unsubscribe segment for downstream reporting and suppression.
| Field | Value |
| ------------- | ---------------------------------- |
| Email address | `{{ from.address }}` |
| Segment | `Unsubscribed by Mary` (ID: 19044) |
The `{{ rationale }}` token is particularly useful here — it gives your ops team a human-readable audit trail directly on the contact record explaining *why* Mary marked someone as unsubscribed.
## Stacking and reordering actions
You can configure multiple actions per category, and they run in the order they're listed. Use the up/down arrows on each action row to reorder them. Click **+ Add Action** to add more.
Order matters in two cases:
* **Dependent actions.** If an `Add to Static Segment` depends on the contact existing, put `Sync Contact to HubSpot` (in `Create or Update` mode) first.
* **Field dependencies.** If a later action references a field set by an earlier action, make sure the order reflects that dependency.
## Conditional actions
Every action supports an **only-if** condition — a token expression that must evaluate to `true` for the action to run. This lets you fan out behavior within a single category. For example, only add to a "Hot Leads" segment when an extracted `intent` field is `high`, while still running the rest of the chain for everyone.
Actions that look a contact up by email also expose a **skip if not found** toggle, which controls whether a missing contact is treated as a quiet skip or a hard error.
## Best practices
* **Use the `[allGood]` prefix in audit fields.** Following the example above (`allgood_reason = [allGood] ...`) makes it easy to see at a glance which records were touched by Mary versus a human or another system.
* **Use property *internal* names, not labels.** The field map keys must be HubSpot's internal property names (found in **Settings → Properties**), not the friendly labels shown elsewhere in the UI. A property name that doesn't exist will fail at execution time.
* **Prefer the native unsubscribe.** For opt-outs, use **Unsubscribe in HubSpot** rather than just setting a property — it updates HubSpot's subscription preferences so suppression is honored everywhere.
* **Test the full chain, not just the classification.** The [Test Suite](/use-cases/erm/test-suite) validates categorization and extraction; once those pass, sanity-check the actions in a sandbox HubSpot instance before going live.
* **Watch the order when adding to segments.** Most static-segment add failures we see are contacts that didn't exist yet. Lead with a **Sync Contact to HubSpot** in `Create or Update` mode to be safe.
# Marketo Actions
Source: https://docs.allgoodhq.com/use-cases/erm/marketo-actions
What Mary does after she classifies a reply — Marketo updates, static list adds, and more.
**Actions** are what Mary *does* once she's classified a reply and pulled out any [extracted data](/use-cases/erm/data-extraction). They run automatically the moment a match is confirmed, so by the time an email shows up in the [Messages](/use-cases/erm/messages) feed, the downstream work in Marketo is already done.
Actions are configured per category. A reply that lands in `Unsubscribe` runs one set of actions; one that lands in `Left Company` runs another.
## Available action types
### Forward Email
Forward the classified reply to another email address. This is the go-to action when a reply needs a human — for example, routing a `Human Request` reply to your shared sales inbox, or looping a specific rep in on `Out-Of-Office` replies for accounts they own.
Forward Email is a **generic action** and works the same way regardless of which marketing automation platform you're connected to.
| Field | What it does |
| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `To` | Destination email address. Accepts tokens (e.g., `{{ owner.email }}`). |
| `Subject` | Subject line for the forwarded message. Defaults to `Fwd: {{ subject }}`. |
| `Message` | Optional custom message body. Supports **Markdown** formatting and token insertion via **Insert Data**. Leave empty to use the default forwarding template. |
| `Original Email` | Controls how the original email is included in the forward — see below. |
The `Original Email` dropdown controls what happens with the source message:
| Option | Behavior |
| ---------------- | ------------------------------------------------------------------------- |
| `Include Inline` | Original message body is appended directly beneath your message |
| `Include Quoted` | Original message is included as a quoted reply — the familiar default |
| `Don't Include` | Forward only contains the message you wrote; the original body is dropped |
Under **Advanced**:
| Field | What it does |
| --------------- | -------------------------------------------------------------------------------------------------------------------- |
| `Message Style` | Rendering style for the forwarded email. `AllGood Branded` uses the allGood template; other styles may be available. |
| `CC` | Additional addresses to CC on the forward. Accepts tokens. |
| `Reply-To` | Override the reply-to address so recipient replies land somewhere other than the original sender. |
| `From Name` | Display name shown in the recipient's inbox (e.g., "Support Team" instead of the raw address). |
### Add to Worksheet
Push the sender into an allGood worksheet, optionally running it through the worksheet's flow steps. This is how you take a classified reply and hand it off to another allGood workflow — for example, adding a `Human Request` sender to a follow-up worksheet that triages and routes them, or pushing extracted replacement contacts from `Left Company` replies into a new-lead worksheet.
Add to Worksheet is a **generic action** and works the same way regardless of which marketing automation platform you're connected to.
| Field | What it does |
| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Worksheet` | The worksheet to add the contact to. Search by name to pick from your existing worksheets. |
| `Include all email data` | When checked, attaches the full email content (subject, body, from, headers) to the worksheet row. Useful when downstream flow steps need access to the raw reply. |
| `Fields` | Map worksheet fields to values or tokens. Left column is the worksheet field name; right column is the value or token to write. Click **+ Add Field** to add more mappings. |
Under **Advanced**:
| Field | What it does |
| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Behavior` | Choose whether Mary just adds the contact to the worksheet, or adds and immediately runs them through the worksheet's flow steps (`Add to Worksheet + Run Flow`). |
| `Include source metadata` | Attaches metadata about where the entry originated (which ERM configuration, category, classification rationale, etc.) so downstream steps can reference it. |
| `Only If` | Standard [conditional expression](#conditional-actions) that must evaluate to `true` for the action to run. Use to fan out behavior within a single category. |
### Sync Lead to Marketo
Create or update a lead record in Marketo, identified by the sender's email address. Mary looks the lead up by email, then creates or updates it depending on the sync mode you choose.
You can set:
* **Static values** — e.g., `unsubscribed = true`
* **Dynamic values** — tokens that resolve at runtime from Mary's classification or [extracted data](/use-cases/erm/data-extraction), e.g., `unsubscribedReason = [allGood] {{ classification }}: {{ rationale }}`
Each row in the **field map** pairs a Marketo lead field's internal name (the same name you see in Marketo **Admin → Field Management**) with a value or token. The email address is always included automatically — it's the lookup key.
You also choose a **sync mode** under the advanced tab:
| Mode | Behavior |
| ------------------ | -------------------------------------------------------------------- |
| `Create or Update` | Update the lead if it exists, otherwise create it (the safe default) |
| `Create Only` | Create a new lead; fail if one already exists for that email |
| `Update Only` | Update an existing lead; fail (or skip) if no lead is found |
Common tokens you can reference:
| Token | What it resolves to |
| ---------------------------------- | ---------------------------------------------------------------------------------------- |
| `{{ classification }}` | The category Mary assigned (e.g., `Unsubscribe`) |
| `{{ rationale }}` | Mary's plain-English reasoning for the classification |
| `{{ from.address }}` | The sender's email address |
| `{{ from.name }}` | The sender's display name |
| `{{ extractedFields[""] }}` | Any field defined in [Data Extraction](/use-cases/erm/data-extraction) for that category |
### Add to Marketo Static List
Add the sender's lead to a specific Marketo static list. Mary looks the lead up by email and adds them to the list you select. The list is identified by ID, and allGood will display the list name for confirmation once you've picked it from the static lists in your Marketo instance.
When adding a lead to a Marketo static list, the lead must already exist in Marketo. If it might not, add a **Sync Lead to Marketo** action *before* the **Add to Marketo Static List** action — the sync (in `Create or Update` mode) will create the lead if it doesn't exist. allGood will warn you if this ordering is wrong.
## Example: Unsubscribe actions
Here's the action chain a typical `Unsubscribe` category would run:
Mark the lead as unsubscribed and record the reason for the audit trail. Using `Create or Update` mode also guarantees the lead exists before the next step runs.
| Field | Value |
| -------------------- | ------------------------------------------------- |
| `unsubscribed` | `true` |
| `unsubscribedReason` | `[allGood] {{ classification }}: {{ rationale }}` |
Drop the lead into the Mary-managed unsubscribe list for downstream reporting and suppression.
| Field | Value |
| ------------- | ---------------------------------- |
| Email address | `{{ from.address }}` |
| List | `Unsubscribed by Mary` (ID: 19044) |
The `{{ rationale }}` token is particularly useful here — it gives your ops team a human-readable audit trail directly on the lead record explaining *why* Mary marked someone as unsubscribed.
## Stacking and reordering actions
You can configure multiple actions per category, and they run in the order they're listed. Use the up/down arrows on each action row to reorder them. Click **+ Add Action** to add more.
Order matters in two cases:
* **Dependent actions.** If an `Add to Static List` depends on the lead existing, put `Sync Lead to Marketo` (in `Create or Update` mode) first.
* **Field dependencies.** If a later action references a field set by an earlier action, make sure the order reflects that dependency.
## Conditional actions
Every action supports an **only-if** condition — a token expression that must evaluate to `true` for the action to run. This lets you fan out behavior within a single category. For example, only add to a "Hot Leads" list when an extracted `intent` field is `high`, while still running the rest of the chain for everyone.
Actions that look a lead up by email also expose a **skip if not found** toggle, which controls whether a missing lead is treated as a quiet skip or a hard error.
## Best practices
* **Use the `[allGood]` prefix in audit fields.** Following the example above (`unsubscribedReason = [allGood] ...`) makes it easy to see at a glance which records were touched by Mary versus a human or another system.
* **Use field *internal* names, not labels.** The field map keys must be Marketo's internal field names (found in **Admin → Field Management**), not the friendly labels shown elsewhere in the UI. A field name that doesn't exist will fail at execution time.
* **Test the full chain, not just the classification.** The [Test Suite](/use-cases/erm/test-suite) validates categorization and extraction; once those pass, sanity-check the actions in a sandbox Marketo instance before going live.
* **Watch the order when adding to lists.** Most static-list add failures we see are leads that didn't exist yet. Lead with a **Sync Lead to Marketo** in `Create or Update` mode to be safe.
# Messages
Source: https://docs.allgoodhq.com/use-cases/erm/messages
A live view of every email Mary has processed — with full reasoning behind each classification.
The **Messages** page is your operational view into everything Mary has handled. It shows every processed reply, the category she assigned, and — if you click in — exactly *why* she classified it that way and what actions she fired.
This is where you go when you want to confirm the system is working, debug a specific reply, or audit a category's behavior after a prompt change.
## The message feed
Processed emails are displayed as cards showing:
* The email **subject line**
* The sender's **name and email address**
* The **category** Mary assigned (e.g., `→ Human Request`)
Cards are listed newest-first by default.
## Filtering by category
Use the tab bar at the top to slice the feed by category. Click **Unsubscribe** to see only unsubscribe replies, **Bounce** for bounces, and so on. **Recents** shows the most recently processed emails regardless of category.
Filtering is the fastest way to spot-check a category after you've edited its prompt — open the tab, scan the recent matches, and confirm they all look right.
## Inspecting an individual email
Click any message card to open the detailed view. The detail panel is structured around the full processing pipeline, so you can see exactly what happened at each step.
The top of the panel shows:
* The full **email body** as it arrived
* The **classification** Mary assigned and her **plain-English reasoning** for why she made that call
Below that, expandable sections walk through the rest of the pipeline:
| Section | What it shows |
| ------------------- | ----------------------------------------------------------------------------------------------------------- |
| **Classify Email** | Mary's full reasoning for the category she chose |
| **Extract Fields** | The values Mary pulled from the email body (if [extraction](/use-cases/erm/data-extraction) was configured) |
| **Fetch Data** | Any data retrieved from external systems (e.g., Marketo) before extraction |
| **Execute Actions** | Which [actions](/use-cases/erm/actions) ran and their outcomes (success / failure / details) |
| **Original Email** | The raw email as it arrived, headers and all |
This view is the single best debugging tool when something looks off — you can see Mary's reasoning, the values she extracted, and the result of every action she fired, all in one place.
## Re-running a misclassified email
If you spot an email that was classified incorrectly, you don't have to wait for a similar reply to arrive again to test your fix. Click **Re-run** on the detail view and Mary will reprocess the email using your current category configuration.
This is the standard workflow for tightening up a category prompt:
Spot it in the feed or via [Search](/use-cases/erm/search).
Edit the [category](/use-cases/erm/categories) that should have caught it — or the one that incorrectly caught it.
Open the message and click **Re-run**. Confirm the new classification is correct.
Add the email to the [Test Suite](/use-cases/erm/test-suite) as a regression check so the fix can't quietly break later.
Re-runs use your current configuration, so they're also a quick way to retroactively reclassify a backlog of emails after a category change — open them one by one and re-run.
# Overview
Source: https://docs.allgoodhq.com/use-cases/erm/overview
Mary reads, classifies, and acts on every reply that lands in your marketing inbox — automatically.
When you send marketing emails, replies come back. Lots of them. Unsubscribes, out-of-office messages, people who've changed jobs, bounce notifications, genuine sales inquiries — and a mountain of spam. Sorting through all of this manually is tedious and error-prone.
**Mary's Email Reply Management (ERM)** handles this automatically. Every reply that arrives in your configured inbox is read and classified by Mary's AI. Based on the category it falls into, Mary can extract key pieces of information from the email and then trigger downstream actions — like updating a Marketo record, adding someone to a static list, or creating a new contact.
## The three building blocks
The whole system is built around three concepts you configure yourself:
Define the buckets replies fall into. Give each one a name and a plain-English prompt describing how Mary should recognize it.
Tell Mary which fields to pull from emails in a given category — replacement contacts, return dates, new email addresses, and more.
Configure what happens automatically after classification — syncing Marketo fields, adding to static lists, and more.
## How an email gets processed
When a reply hits your inbox, here's exactly what happens:
The reply lands in your dedicated allGood inbox address (e.g., `8IEJ8ZOP@parse.allgoodhq.app`). Every message sent to this address is automatically picked up and queued for processing.
Mary reads the full email — subject line, body, and metadata — and compares it against the categories you've defined. She picks the best match based on the description you wrote for each category.
Mary reads the full email — subject line, body, and metadata — and compares it against the categories you've defined. She picks the best match based on the description you wrote for each category.
If you've set up data extraction for that category, Mary pulls specific pieces of information out of the email — for example, a replacement contact's name and email address from a "Left Company" auto-reply.
Mary reads the full email — subject line, body, and metadata — and compares it against the [categories](/use-cases/erm/categories) you've defined. She picks the best match based on the description you wrote for each category.
If you've set up data extraction for that category, Mary pulls specific pieces of information out of the email — for example, a replacement contact's name and email address from a "Left Company" auto-reply.
With the email classified and data in hand, Mary fires the actions you've configured for that category — updating a Marketo lead, adding someone to a static list, and so on.
If you've set up [data extraction](/use-cases/erm/data-extraction) for that category, Mary pulls specific pieces of information out of the email — for example, a replacement contact's name and email from a "Left Company" auto-reply.
With the email classified and data in hand, Mary fires the actions you've configured for that category — updating a Marketo lead, adding someone to a static list, and so on.
With the email classified and data in hand, Mary fires the [actions](/use-cases/erm/actions) you've configured for that category — updating a Marketo lead, adding someone to a static list, and so on.
## Where to next
Define how Mary recognizes a reply type.
Pull structured data out of incoming replies.
Trigger Marketo updates and list adds automatically.
Validate categorizations and extractions with the Test Suite.
See every reply Mary has handled and why she classified it the way she did.
Find specific emails across every category and field.
# Salesforce Actions
Source: https://docs.allgoodhq.com/use-cases/erm/salesforce-actions
What Mary does after she classifies a reply — Salesforce contact/lead updates, campaign adds, and native unsubscribes.
**Actions** are what Mary *does* once she's classified a reply and pulled out any [extracted data](/use-cases/erm/data-extraction). They run automatically the moment a match is confirmed, so by the time an email shows up in the [Messages](/use-cases/erm/messages) feed, the downstream work in Salesforce is already done.
Actions are configured per category. A reply that lands in `Unsubscribe` runs one set of actions; one that lands in `Left Company` runs another.
## Available action types
### Forward Email
Forward the classified reply to another email address. This is the go-to action when a reply needs a human — for example, routing a `Human Request` reply to your shared sales inbox, or looping a specific rep in on `Out-Of-Office` replies for accounts they own.
Forward Email is a **generic action** and works the same way regardless of which marketing automation platform you're connected to.
| Field | What it does |
| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `To` | Destination email address. Accepts tokens (e.g., `{{ owner.email }}`). |
| `Subject` | Subject line for the forwarded message. Defaults to `Fwd: {{ subject }}`. |
| `Message` | Optional custom message body. Supports **Markdown** formatting and token insertion via **Insert Data**. Leave empty to use the default forwarding template. |
| `Original Email` | Controls how the original email is included in the forward — see below. |
The `Original Email` dropdown controls what happens with the source message:
| Option | Behavior |
| ---------------- | ------------------------------------------------------------------------- |
| `Include Inline` | Original message body is appended directly beneath your message |
| `Include Quoted` | Original message is included as a quoted reply — the familiar default |
| `Don't Include` | Forward only contains the message you wrote; the original body is dropped |
Under **Advanced**:
| Field | What it does |
| --------------- | -------------------------------------------------------------------------------------------------------------------- |
| `Message Style` | Rendering style for the forwarded email. `AllGood Branded` uses the allGood template; other styles may be available. |
| `CC` | Additional addresses to CC on the forward. Accepts tokens. |
| `Reply-To` | Override the reply-to address so recipient replies land somewhere other than the original sender. |
| `From Name` | Display name shown in the recipient's inbox (e.g., "Support Team" instead of the raw address). |
### Add to Worksheet
Push the sender into an allGood worksheet, optionally running it through the worksheet's flow steps. This is how you take a classified reply and hand it off to another allGood workflow — for example, adding a `Human Request` sender to a follow-up worksheet that triages and routes them, or pushing extracted replacement contacts from `Left Company` replies into a new-lead worksheet.
Add to Worksheet is a **generic action** and works the same way regardless of which marketing automation platform you're connected to.
| Field | What it does |
| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Worksheet` | The worksheet to add the contact to. Search by name to pick from your existing worksheets. |
| `Include all email data` | When checked, attaches the full email content (subject, body, from, headers) to the worksheet row. Useful when downstream flow steps need access to the raw reply. |
| `Fields` | Map worksheet fields to values or tokens. Left column is the worksheet field name; right column is the value or token to write. Click **+ Add Field** to add more mappings. |
Under **Advanced**:
| Field | What it does |
| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Behavior` | Choose whether Mary just adds the contact to the worksheet, or adds and immediately runs them through the worksheet's flow steps (`Add to Worksheet + Run Flow`). |
| `Include source metadata` | Attaches metadata about where the entry originated (which ERM configuration, category, classification rationale, etc.) so downstream steps can reference it. |
| `Only If` | Standard [conditional expression](#conditional-actions) that must evaluate to `true` for the action to run. Use to fan out behavior within a single category. |
### Sync Contact/Lead to Salesforce
Create or update a record in Salesforce, identified by the sender's email address. Mary looks the record up by email — preferring a **Contact**, then falling back to a **Lead** — then creates or updates it depending on the sync mode you choose.
You can set:
* **Static values** — e.g., `leadStatus = Unqualified`
* **Dynamic values** — tokens that resolve at runtime from Mary's classification or [extracted data](/use-cases/erm/data-extraction), e.g., `allgood_reason = [allGood] {{ classification }}`
Each row in the **field map** pairs a Salesforce field's API name with a value or token. The email address is always included automatically — it's the lookup key.
You also choose a **sync mode** under the advanced tab:
| Mode | Behavior |
| ------------------ | ---------------------------------------------------------------------- |
| `Create or Update` | Update the record if it exists, otherwise create it (the safe default) |
| `Create Only` | Create a new record; fail if one already exists for that email |
| `Update Only` | Update an existing record; fail (or skip) if no record is found |
Common tokens you can reference:
| Token | What it resolves to |
| ---------------------------------- | ---------------------------------------------------------------------------------------- |
| `{{ classification }}` | The category Mary assigned (e.g., `Unsubscribe`) |
| `{{ rationale }}` | Mary's plain-English reasoning for the classification |
| `{{ from.address }}` | The sender's email address |
| `{{ from.name }}` | The sender's display name |
| `{{ extractedFields[""] }}` | Any field defined in [Data Extraction](/use-cases/erm/data-extraction) for that category |
### Add to Salesforce Campaign
Add the sender to a specific Salesforce campaign as a campaign member. Mary looks the record up by email and adds them to the campaign you specify. The campaign is identified by its **Campaign ID** — the 15- or 18-character Salesforce Campaign record ID.
When adding someone to a Salesforce campaign, the Contact or Lead must already exist in Salesforce. If it might not, add a **Sync Contact/Lead to Salesforce** action *before* the **Add to Salesforce Campaign** action — the sync (in `Create or Update` mode) will create the record if it doesn't exist.
### Unsubscribe in Salesforce
Opt the sender out of email in Salesforce. Mary looks the record up by email — preferring a **Contact**, then falling back to a **Lead** — and sets their email opt-out status. This is the cleanest way to honor an opt-out, because it uses Salesforce's native email opt-out field rather than just flipping a custom field.
If the record isn't found in Salesforce, this action skips quietly by default. You can flip this behavior with the **skip if not found** toggle if you'd rather treat a missing record as a hard error.
## Example: Unsubscribe actions
Here's the action chain a typical `Unsubscribe` category would run:
Honor the opt-out using the Unsubscribe in Salesforce action so the suppression is respected everywhere.
Record the reason on the record for the audit trail. Using `Create or Update` mode also guarantees the record exists before the later steps run.
| Field | Value |
| ---------------- | ------------------------------------------------- |
| `leadStatus` | `Unqualified` |
| `allgood_reason` | `[allGood] {{ classification }}: {{ rationale }}` |
Drop the record into the Mary-managed unsubscribe campaign for downstream reporting and suppression.
| Field | Value |
| ------------- | -------------------- |
| Email address | `{{ from.address }}` |
| Campaign ID | `701dL00002GXH2OQAX` |
The `{{ rationale }}` token is particularly useful here — it gives your ops team a human-readable audit trail directly on the record explaining *why* Mary marked someone as unsubscribed.
## Stacking and reordering actions
You can configure multiple actions per category, and they run in the order they're listed. Use the up/down arrows on each action row to reorder them. Click **+ Add Action** to add more.
Order matters in two cases:
* **Dependent actions.** If an `Add to Salesforce Campaign` depends on the record existing, put `Sync Contact/Lead to Salesforce` (in `Create or Update` mode) first.
* **Field dependencies.** If a later action references a field set by an earlier action, make sure the order reflects that dependency.
## Conditional actions
Every action supports an **only-if** condition — a token expression that must evaluate to `true` for the action to run. This lets you fan out behavior within a single category. For example, only add to a "Hot Leads" campaign when an extracted `intent` field is `high`, while still running the rest of the chain for everyone.
Actions that look a record up by email also expose a **skip if not found** toggle, which controls whether a missing record is treated as a quiet skip or a hard error.
## Best practices
* **Use the `[allGood]` prefix in audit fields.** Following the example above (`allgood_reason = [allGood] ...`) makes it easy to see at a glance which records were touched by Mary versus a human or another system.
* **Use field *API* names, not labels.** The field map keys must be Salesforce's API field names, not the friendly labels shown elsewhere in the UI. A field name that doesn't exist will fail at execution time.
* **Prefer the native unsubscribe.** For opt-outs, use **Unsubscribe in Salesforce** rather than just setting a custom field — it updates Salesforce's native email opt-out so suppression is honored everywhere.
* **Test the full chain, not just the classification.** The [Test Suite](/use-cases/erm/test-suite) validates categorization and extraction; once those pass, sanity-check the actions in a sandbox Salesforce instance before going live.
* **Watch the order when adding to campaigns.** Most campaign-add failures we see are records that didn't exist yet. Lead with a **Sync Contact/Lead to Salesforce** in `Create or Update` mode to be safe.
# Search
Source: https://docs.allgoodhq.com/use-cases/erm/search
Find specific emails across every processed reply — by sender, body content, category, or any extracted field.
The **Search** page lets you find specific emails across every reply Mary has processed. It's the fastest way to confirm a specific contact's reply was picked up, debug a category that doesn't look right, or audit how Mary handled a particular sender.
## How to search
By default, search runs across all indexed fields at once — drop in a keyword, sender name, or phrase and you'll see every email it appears in.
For more targeted queries, use the dropdown to scope your search to a single field.
## Searchable fields
| Field | What you can search |
| ----------------- | ----------------------------------------------------------- |
| `Category` | Filter by classification (e.g., all `Unsubscribe` emails) |
| `from` | Find emails from a specific sender address |
| `body` | Search the full text of the email body |
| `cc` | Find emails where a specific address was CC'd |
| `newContactEmail` | Find emails where a replacement contact email was extracted |
| `newContactName` | Find emails where a replacement contact name was extracted |
| `newEmail` | Find emails where a new email address was extracted |
| `returnDate` | Find Out-Of-Office emails with a specific return date |
| `received_at` | Search by when the email was received |
| `metadata` | Search across message metadata |
Results appear as cards just like the [Messages](/use-cases/erm/messages) feed, and you can click into any result to view the full processing detail.
## Common debugging patterns
A few search workflows that come up regularly:
* **"Did this person's reply get processed?"** Search `from` for the sender's email. If nothing comes up, the reply never reached Mary — check your inbox forwarding rules.
* **"Why was this reply classified that way?"** Find the email, click into it, and review Mary's reasoning in the **Classify Email** section of the detail view.
* **"Is this category over-firing?"** Filter by `Category` and skim the matches. If you see replies that shouldn't be there, tighten the [category prompt](/use-cases/erm/categories) to rule them out — and add the misclassified examples to the [Test Suite](/use-cases/erm/test-suite) as regression checks.
* **"Where did we route the replacements from last quarter's left-company replies?"** Search `newContactEmail` with a date range on `received_at` to pull every extracted replacement contact.
When you find a misclassified email through Search, open it and use the **Re-run** button in the [Messages](/use-cases/erm/messages) detail view to reprocess it against your current configuration — no need to wait for a similar reply to come in.
# Setting Up or Altering a Category
Source: https://docs.allgoodhq.com/use-cases/erm/setting-up-or-altering-a-category
A technical walkthrough for allGood admins on how to configure email categories, extract data, and define automated actions in Reply Management.
## Overview
Reply Management gives you full control over how incoming emails are classified and acted on. You can work from the out-of-the-box (OOTB) categories that come pre-configured, edit them to fit your use case, or build entirely new categorizations and workflows from scratch.
Every category workflow is made up of three parts:
Tell Mary what kind of email belongs in this category by giving her a name and a plain-English prompt.
Optionally define fields for Mary to extract from matched emails, and configure any data fetches from external systems like Marketo.
Configure what happens automatically once an email is classified — forwarding, syncing to Marketo, adding to a static list, or requesting a campaign.
***
## Part 1: Configuring the Category
Navigate to **Reply Management → Categories & Actions**, then either click an existing category to edit it or click **+ Add Category** to create a new one.
### Category Name
The category name is a label for your own reference — it appears in the UI and in the Messages view, but it has no effect on how Mary classifies emails. Name it whatever is clear and meaningful to your team (e.g., "Unsubscribe", "Left Company", "Human Request").
### Prompt
The prompt is the most important part of the category. **Everything else in the workflow depends on Mary classifying the email correctly, and the prompt is how she makes that call.**
Write it in plain English — describe the kind of email you want Mary to route into this category. Be as specific as you can, including:
* The signals or phrases that indicate a match
* Any edge cases or look-alikes she should *not* classify here
**Example:**
> *"Automatic replies saying the person doesn't work at that company anymore. Messages like 'John no longer works here' or 'This employee has left the organization.' No new contact info is provided."*
**Prompt writing tip:** LLMs understand LLM-style instructions best. Before finalizing a prompt, paste it into ChatGPT, Claude or Gemini and test it against a few sample emails. Iterating your prompt through an LLM first can noticeably improve classification reliability before you ever hand it off to Mary.
### Advanced Settings — Category Type
The **Advanced** section is intended for allGood admins. Incorrect category type configuration can affect how emails are routed and how credits are consumed.
The **Category Type** dropdown lets you assign a technical email type to a category. When set, Mary will **automatically route emails** that carry matching headers from your email provider into this category — completely bypassing the AI classification prompt. This saves tokens and speeds up processing for email types that are deterministic.
For example: if you set the Category Type to **"Auto Response"**, any incoming email whose mail server headers flag it as an auto-response will be routed directly into this category without consuming a classification credit.
Available category types map to standard email header classifications (e.g., Auto Response, Bounce). Use this when you have a category that captures a well-defined, header-identifiable email type.
***
## Part 2: Extracting Data from the Email
Once an email is classified, Mary can extract specific pieces of information from the email body before any actions run. This is configured in the **Data & Fields** panel, accessible by clicking **Extract Data** on a category row.
### Adding Extract Fields
This adds a new field definition to the category.
Give the field a programmatic name — this is the variable name you'll reference in actions later. Use camelCase for consistency (e.g., `newContactEmail`, `returnDate`).
Write a plain-English description of the value to extract. Be specific about what you want and when it might not be present.
**Example:** `"Email address of a replacement contact, if provided"`
If the field is essential for downstream actions to work correctly, check **Required**. If a required field can't be found in the email, the item will be flagged for review rather than processed automatically.
You can add as many fields as needed per category.
### Fetching Data from Marketo
If your actions need information from Marketo that isn't in the email itself (e.g., lead owner, current lifecycle stage, or any other CRM field), you can pull that data before the action runs.
1. Click **+ Add Fetcher** and select **Fetch Marketo Lead**
2. Configure how the lead should be looked up — typically by **Email address**
3. Select the Marketo fields you want fetched and made available to downstream actions
#### Advanced Fetcher Options
The fetcher **Advanced** settings are for allGood admins.
The **Advanced** tab on the fetcher lets you define conditional fetch logic — for example, only fetch the Marketo lead if the email subject equals "I'm Interested". This prevents unnecessary API calls for emails where the data isn't needed.
You can also configure the **behavior when a lead is not found in Marketo**:
| Option | Behavior |
| --------------------------------------- | -------------------------------------------------------------------------- |
| **Continue processing with empty data** | The workflow proceeds; fields that required the Marketo data will be empty |
| **Stop processing and flag for review** | The item is held back and marked for manual review |
***
## Part 3: Configuring Actions
Actions are the downstream automations that fire once an email has been classified (and data extracted). Click **Actions** on any category row to open the actions panel, then click **+ Add Action** and select from the following four action types.
***
### Forward Email
Forwards the classified email to a specified recipient.
| Field | Description |
| -------------------------- | ------------------------------------------------------- |
| **To address** | The email address to forward to |
| **Subject** | Subject line for the forwarded email |
| **Message** | Optional message to include above the forwarded content |
| **Include original email** | Choose: Quoted, Inline, or Excluded |
| Option | Description |
| ----------------- | ----------------------------------------------- |
| **Message style** | Controls how the forwarded message is formatted |
| **CC** | Add CC recipients to the forwarded email |
| **Reply-to** | Override the reply-to address |
| **From name** | Set the display name for the sender |
***
### Sync Lead to Marketo
Updates one or more fields on a Marketo lead record when an email is classified.
| Field | Description |
| -------------- | ---------------------------------------------------------------------------------------------------------------- |
| **Field name** | The Marketo field to update |
| **Value** | The value to set — can be a static value or a dynamic variable (e.g., `{{ classification }}`, `{{ rationale }}`) |
Click **+ Add Field** to update multiple Marketo fields in a single action.
| Option | Description |
| --------------------- | ----------------------------------------------------------------------------- |
| **Identify lead by** | The email address field used to look up the lead in Marketo |
| **Sync action** | Choose: **Create or Update**, **Create Only**, or **Update Only** |
| **Skip if not found** | For Update Only mode — skip rather than error if the lead doesn't exist |
| **Only runs if** | Conditional logic — e.g., only sync if `classification` equals `"interested"` |
***
### Add to Marketo Static List
Adds a lead to a Marketo static list when an email is classified.
| Field | Description |
| ----------------- | ------------------------------------------------------------ |
| **Email address** | The address to add — typically `{{ from.address }}` |
| **Static List** | The target list, entered as a Marketo list ID or Marketo URL |
The lead must already exist in Marketo before it can be added to a static list. If there's any chance the lead doesn't exist yet, add a **Sync Lead to Marketo** action before this one to ensure the record is created first.
| Option | Description |
| -------------------------- | --------------------------------------------------------------------------- |
| **Skip if lead not found** | Check to skip silently if the lead doesn't exist in Marketo |
| **Only runs if** | Conditional logic — e.g., only add if `classification` equals `"Subscribe"` |
***
### Request Campaign
Triggers a Marketo campaign request for the classified lead.
| Field | Description |
| ----------------- | -------------------------------------------------------------------- |
| **Email address** | The address used to identify the lead when requesting the campaign |
| **Campaign** | The target campaign, entered as a Marketo campaign ID or Marketo URL |
| Option | Description |
| -------------------------- | ------------------------------------------------------------------------------- |
| **Skip if lead not found** | Check to skip silently if the lead doesn't exist in Marketo |
| **Only runs if** | Conditional logic — e.g., only request if `classification` equals `"Subscribe"` |
***
### Add to Worksheet
Adds a new item to another allGood worksheet when an email is classified. Optionally triggers the worksheet's flow to process the item automatically.
| Field | Description |
| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Worksheet Ident** | The identifier of the target worksheet to add items to |
| **Include original email item** | When checked, all fields from the original email (subject, body, from, to, classification, rationale, and extracted fields) are included in the new worksheet item |
| **Fields** | Map of field names to template values for setting fields on the new item. These override any fields included from the original email item |
| Option | Description |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Behavior** | Choose: **Add to Worksheet + Run Flow** (default) to add the item and immediately execute the worksheet's flow, or **Add to Worksheet** to add the item without triggering execution |
| **Only runs if** | Conditional logic — e.g., only add if `classification` equals `"Interested"` |
***
## Saving and Publishing
Once you've configured your category, extracted fields, and actions, click **OK** to save your changes. When you're ready to push the configuration live, click **Save & Publish** at the top right of the Categories & Actions page.
Publishing updates your live configuration immediately. All incoming emails processed after publishing will use the updated category rules.
# Settings
Source: https://docs.allgoodhq.com/use-cases/erm/settings
Top-level configuration for your Email Reply Management setup.
The **Settings** page is where you configure the top-level details of your Email Reply Management workspace. It's intentionally lightweight — most of the day-to-day configuration lives in [Categories](/use-cases/erm/categories), [Data Extraction](/use-cases/erm/data-extraction), and [Actions](/use-cases/erm/actions).
## Configuration Name
Give your reply management setup a descriptive name — for example, `Motive Email Categorization` or `EMEA Outbound – Reply Routing`. This name appears in the sidebar and helps identify the configuration when you have multiple Reply Management setups running side-by-side.
If you run separate ERM configurations for different brands, regions, or business units, name them in a way that makes the scope obvious at a glance. A naming pattern like ` –
## When to create a new configuration vs. add a category
A common question is whether a new use case warrants a brand-new ERM configuration or just a new [category](/use-cases/erm/categories) inside the existing one. A rough rule of thumb:
* **Add a category** when the new use case still receives replies in the same inbox and you want them processed alongside everything else.
* **Create a new configuration** when the inbox, ownership, or downstream Marketo instance is different — for example, a separate brand or a regional ops team running their own setup.
# Test Suite
Source: https://docs.allgoodhq.com/use-cases/erm/test-suite
## Validate email categorizations, data extractions, and downstream actions before they touch production traffic.
The ERM Test Suite is the QA layer for your Email Reply Management workflows. Use it to verify that incoming replies are categorized correctly, that the right fields are extracted, and that your skills behave as expected, before any of it runs against live inbound mail.
Every workspace ships with a baseline suite covering the out-of-the-box categorizations. From there, you can layer in custom tests for the scenarios the baseline doesn't cover: edge cases, custom skills your team has built, or regression checks for categorizations you've previously seen drift.
Treat the suite like a smart campaign QA checklist. Add a test the first time you encounter an edge case in production; that way the next time something similar comes through, you'll catch it pre-deploy instead of in the inbox.
## When to use the test suite
* **Before (or after) promoting a new skill to production.** Confirm that any new or modified categorization handles your common reply patterns.
* **After a model or prompt change.** Re-run the full suite to surface regressions in previously passing categorizations.
* **When debugging a misclassification.** Reproduce the offending email as a test case, then iterate against it without touching live data.
* **As part of a recurring health check.** Run the suite on a cadence to catch drift in OOTB categorizations.
## Test suite overview
The landing page surfaces the state of every test in your workspace and lets you slice the list by status or categorization
### Filters
Narrow the list down to what you're working on:
### Test list columns
| Column | What it shows |
| --------------------- | -------------------------------------------------------------------------------------------------------------------- |
| **Name** | The label you gave the test. Use a convention that scales (e.g. `OOO – multi-day absence`, `Bounce – mailbox full`). |
| **Expected category** | The categorization the test asserts against. |
| **Checks** | Whether the test asserts categorization only, or also validates extracted fields. |
| **Status** | Pass / fail indicator from the most recent run. |
## Creating a test
Open the test creation form from the test suite landing page.
Give the test a descriptive, scannable name and paste the email body you want the system to evaluate. Treat the body the way it will arrive in production — keep signatures, quoted history, and formatting intact if those are part of what makes the case representative.
These fields are optional, but they're worth filling in when the categorization could plausibly depend on them — for example, when an alias is part of the routing logic or when the sender domain is a signal.
The subject does affect classification. If you're testing a category where the subject is a strong signal (auto-replies, bounces, "Re:" threading), set it explicitly.
Want to confirm a categorization is robust? Duplicate the test with the same body but different subjects. If results diverge, you've found a fragility worth flagging.
For skills that pull structured data out of replies, add one check per field you want to validate:
* **Field name** — the extracted field you're asserting against
* **Expected value** — the value you expect to be returned
* **Comparison type** — `Exact` or `Semantic`
**Exact** matches the expected value verbatim against what was extracted. Use it for structured values where wording is stable — dates, dollar amounts, order numbers, statuses.
**Semantic** matches on meaning rather than wording. Use it for free-text fields where the model may paraphrase — reasons, intents, summarized requests. A semantic check on `reason = "out of office"` will pass on `"away from the office until Monday"`.
Save the test, then execute it from one of two places:
* **Run All Tests** at the top of the suite — useful after a model change or before a release
* The **Run** button on the test row — useful while iterating on a single case
Review your tests by clicking into them. Edit, Rerun, Debug and Delete Tests.
## Best practices
* **One assertion per test where possible.** If a test fails, you want to know exactly which behavior broke. Bundling six extraction checks into one case makes triage harder.
* **Mirror production inputs.** Real replies have signatures, disclaimers, and forwarded threads. Stripping them out makes tests pass that wouldn't pass in the wild.
* **Cover the negatives.** Don't only test the categories you expect to hit — test cases that *shouldn't* match a category to make sure the skill isn't over-firing.
* **Re-run after every change.** Treat the suite as your release gate: prompt edits, skill changes, and new categorizations should all be followed by a full run.
# Asana Upload Guide
Source: https://docs.allgoodhq.com/use-cases/list-upload/data-import-guides/guide-asana
Connect list processing to Asana task management workflows for enhanced project coordination and team collaboration.
## Overview
The Asana integration transforms list upload into a collaborative project management workflow. Tasks are automatically created for each stage of processing, team members are notified of progress, and results are tracked through project timelines.
## Prerequisites
* Completed [setup and prerequisites](/use-cases/list-upload/setup)
* [Asana Webhook Setup](/integrations/asana)
* Template structure defined
* Processing features selected
### File Upload Workflow
1. Team member uploads CSV file through allGood interface
2. Asana task automatically created in "Uploaded" section
3. Task description includes:
* File details (name, size, record count)
* Processing options selected
* Estimated completion time
* Team member assignments
1. Task moves to "In Progress" section when processing begins
2. Progress updates posted as task comments
3. Processing stages tracked as subtasks
4. Team notifications sent at key milestones
### Quality Review Process
**Automated Quality Check**:
1. Task moves to "Quality Review" when processing completes
2. Quality metrics attached as task comments
3. Processed data file attached to task
4. Quality reviewer assigned automatically
**Review Workflow**:
* Review data quality metrics
* Spot-check sample records
* Approve or request corrections
* Add review comments and recommendations
### Approval and Sync
**Approval Process**:
1. Approved tasks move to "Approved" section
2. Sync process initiated automatically or manually
3. Sync progress tracked in task comments
4. Completion notifications sent to stakeholders
**Final Steps**:
1. Task moves to "Synced" section upon completion
2. Final metrics and results attached
3. Project completion notification sent
4. Task archived after retention period
## Next Steps
After configuring Asana integration:
1. **Train Team Members**: Ensure everyone understands the workflow
2. **Test Processing**: Upload sample files to verify integration
3. **Optimize Templates**: Refine task templates based on usage
For alternative project management approaches:
* [Native Mode](/use-cases/list-upload/data-import-guides/guide-direct) - Direct allGood interface
* [Workfront Integration](/use-cases/list-upload/data-import-guides/guide-workfront) - Enterprise project management
For detailed feature information:
* [Processing Features](/use-cases/list-upload/features) - Available data processing and enrichment features
# Native Upload Guide
Source: https://docs.allgoodhq.com/use-cases/list-upload/data-import-guides/guide-direct
**Target Audience**: Field Marketing, Event Marketing, and Campaign Users\
**Prerequisites**: Marketing Operations team has completed initial setup and integration configuration
## Overview
The List Upload feature allows you to process dirty CSV contact lists directly through allGood's AI-driven platform. Upload your file, and Mary (our AI agent) will guide you through cleaning, enriching, and uploading your contacts to the right destination in your marketing automation system.
## Getting Started
1. Log into allGood
2. Navigate to the Home Page
3. Select "List Upload" from the available options
4. Click "Go" to start the process
1. A chat window will open with Mary, your AI processing agent
2. Mary will ask you to provide a file
3. Upload your CSV file containing your contact list
4. Mary will begin processing immediately
Mary will analyze your file and may ask questions about:
* **Field Mapping**: Which columns contain first name, last name, email, etc.
* **Data Requirements**: What information is required vs optional
* **Destination Setup**: Where to upload the processed contacts
* **Campaign Details**: Program names, campaign member statuses, etc.
Mary will provide feedback on:
* Data quality issues found
* Enrichment opportunities
* Processing steps applied
* Final destination for your contacts
## What Mary Can Do For You
### Data Cleaning & Standardization
* **Job Title Standardization**: Fix spelling, capitalization, remove commas, translate to English
* **Phone Number Formatting**: Convert to E.164 standard (+\[country]\[area]\[local])
* **Location Data**: Standardize countries, states, and postal codes
* **Industry Alignment**: Normalize industry fields to standard categories
* **Syntax Cleanup**: Fix categorical data spelling and formatting
### Data Enrichment
* **Missing Information**: Fetch missing lead details from third-party providers
* **Job Function Categorization**: Classify roles (Product, Engineering, Data Science, etc.)
* **Job Level Assignment**: Assign hierarchy levels (CxO, VP, Director, Manager, IC)
* **Job Role Mapping**: Map to prioritized roles (SOC, DevOps, Security, etc.)
### Platform Integration
* **Marketo**: Create or update programs, manage campaign member statuses
* **HubSpot**: Create or update contact lists, manage contact properties
* **CRM Integration**: Ensure clean data flows to your CRM system
## Common Scenarios
### Event Attendee Processing
Upload attendee lists from webinars, trade shows, or conferences with automatic:
* Duplicate detection and removal
* Job title and company enrichment
* Proper campaign member status assignment
* Integration with event programs
### Lead Import from Trade Shows
Process lead capture forms with:
* Data validation and cleanup
* Company and contact enrichment
* Lead scoring preparation
* Campaign assignment
### Campaign Member Updates
Update existing campaign members with:
* New contact information
* Updated job titles or companies
* Changed engagement statuses
* Additional demographic data
## Tips for Success
### Preparing Your CSV
* Include as many fields as possible (first name, last name, email, company, job title)
* Use clear column headers
* Include any metadata about the list source or campaign
* Don't worry about data quality - Mary will handle the cleanup
### During Processing
* Be specific about your campaign requirements
* Provide context about the list source (event, campaign, etc.)
* Ask questions if you're unsure about any step
* Review Mary's suggestions before final upload
### After Processing
* Verify contacts appeared in your marketing automation system
* Check campaign member statuses are correct
* Confirm data flowed properly to your CRM
* Save any processing preferences for future uploads
## Expected Outcomes
After successful processing, you should see:
* ✅ Clean, standardized contact data
* ✅ Enriched job titles, companies, and contact information
* ✅ Contacts properly uploaded to your marketing automation system
* ✅ Correct campaign member statuses assigned
* ✅ Data ready for CRM integration
## Need Help?
If you encounter issues during processing:
1. Check the [FAQ](/use-cases/list-upload/faq) for common solutions
2. Ensure your Marketing Ops team has completed the [Setup](/use-cases/list-upload/setup)
3. Contact your Marketing Operations team for configuration assistance
## Next Steps
Once your list is processed, you can:
* Create nurture campaigns in your marketing automation system
* Set up lead scoring rules
* Configure CRM sync settings
* Plan follow-up campaigns based on engagement
# Workfront Upload Guide
Source: https://docs.allgoodhq.com/use-cases/list-upload/data-import-guides/guide-workfront
Integrate list uploads with Workfront project workflows for enterprise-level project management, resource planning, and campaign coordination.
## Overview
The Workfront integration connects list upload processing with enterprise project management workflows, enabling sophisticated campaign coordination, resource allocation, and stakeholder communication across large marketing organizations.
## Prerequisites
**Workfront Requirements**:
* Workfront Pro or Enterprise account
* Project management permissions
* API access enabled
* Custom forms and fields configured
**AllGood Setup**:
* Completed [setup and prerequisites](/use-cases/list-upload/setup)
* [Configured Workfront Integration](/integrations/workfront)
* Template structure defined
* Processing features selected
## Workflow Process
### Project Creation Workflow
1. Marketing manager creates campaign project from template
2. Project automatically configured with list processing tasks
3. Team members assigned based on campaign type
4. Timeline established with processing milestones
1. Team member initiates list upload task
2. CSV file uploaded through allGood interface
3. Processing options configured based on campaign requirements
4. Task status updated to "In Progress"
### Processing and Approval
**Processing Workflow**:
1. List processing begins automatically
2. Progress updates posted to project timeline
3. Quality metrics tracked in custom form
4. Stakeholders notified of key milestones
**Approval Process**:
1. Processed list requires approval before sync
2. Quality reviewer assigned automatically
After configuring Workfront integration:
1. **Train Team Members**: Comprehensive training on new workflows
For alternative project management approaches:
* [Direct Mode](/use-cases/list-upload/data-import-guides/guide-direct) - Direct allGood interface
* [Asana Integration](/use-cases/list-upload/data-import-guides/guide-asana) - Simplified task management
For detailed feature information:
* [Processing Features](/use-cases/list-upload/features) - Available data processing and enrichment features
# Frequently Asked Questions
Source: https://docs.allgoodhq.com/use-cases/list-upload/faq
## Getting Started
CSV files are the primary supported format. Excel files should be converted to CSV before upload.
allGood can handle CSV files with thousands of contacts. If you have an extremely large file (50,000+ contacts), consider splitting it into smaller batches for optimal performance.
You need access to the List Upload feature, which is typically granted by your Marketing Operations team. You'll also need the proper integrations (Marketo, HubSpot) configured.
## Field Mapping & Data Requirements
At minimum, you need:
* **Email address** (required for all platforms)
* **First Name** and **Last Name** (highly recommended)
* **Company** (recommended for B2B scenarios)
Additional fields like job title, phone, and location improve data quality and enrichment opportunities.
Mary will automatically map common variations. For example, "First Name", "FirstName", "fname", and "Given Name" will all be recognized as first name fields. You can also specify mappings during the conversation.
Mary will check your system's requirements and let you know which fields are needed. Each platform (Marketo, HubSpot) has different field requirements that are automatically validated.
Extra columns are fine - Mary will identify and map the relevant fields while ignoring unnecessary columns.
## Data Cleaning & Enrichment
Mary will analyze your data and suggest enrichment opportunities. Common scenarios include:
* Missing job titles or company information
* Incomplete contact details
* Non-standardized job titles or company names
* Missing location data
allGood offers several enrichment capabilities:
* **Basic Enrichment**: Missing contact information from third-party providers
* **Job Function Categorization**: Engineering, Product, Data Science, etc.
* **Job Level Assignment**: CxO, VP, Director, Manager, Individual Contributor
* **Job Role Mapping**: SOC, DevOps, Security, Platform, etc.
* **Data Standardization**: Phone numbers, addresses, industry alignment
Yes, Mary will discuss enrichment options with you and you can choose which steps to apply based on your campaign needs and data quality requirements.
allGood uses multiple data sources and validation techniques to ensure high accuracy. However, you should always review enriched data before final campaign deployment.
## Platform Integration
This depends on your marketing automation system:
* **Marketo**: Use when you need program creation, campaign member management, and complex event workflows
* **HubSpot**: Use for contact list management and simpler lead nurturing campaigns
* **Plain**: Use for basic CSV processing without platform-specific integration
* **Marketo**: Program-centric workflow with program cloning, folder management, and complex campaign member statuses
* **HubSpot**: List-centric workflow focused on contact list creation and management
* **Processing complexity**: Marketo supports more complex metadata and program structures
Yes, you can process the same CSV for different platforms, but you'll need to run separate uploads for each destination system.
## Campaign & Program Management
You can provide program information in your CSV metadata or specify it during the conversation with Mary. Options include:
* Creating a new program
* Adding to an existing program
* Cloning from a template program
Campaign member statuses track contact engagement levels (e.g., "Registered", "Attended", "No Show" for webinars). Mary will ask about the appropriate status for your campaign type and validate against your system configuration.
Mary will help you decide based on your campaign goals:
* **New programs**: For new campaigns or events
* **Existing programs**: When adding contacts to ongoing campaigns
* **Template cloning**: For standardized campaign types
## Data Quality & Validation
Mary will detect duplicates and ask how you want to handle them - typically by keeping the most complete record or merging information.
Mary will check for existing contacts and provide options:
* Update existing contact information
* Skip duplicates
* Add to additional campaigns/lists
* Create new records with updated information
Mary will identify validation issues and suggest corrections:
* Invalid email formats
* Missing required fields
* Data format inconsistencies
* System-specific validation failures
## Processing & Performance
Processing time depends on list size and complexity:
* Small lists (100-1,000 contacts): 2-5 minutes
* Medium lists (1,000-10,000 contacts): 5-15 minutes
* Large lists (10,000+ contacts): 15-30 minutes
It's recommended to process one list at a time to ensure proper attention to each upload and avoid system overload.
Mary will provide specific error information and suggest solutions. Common fixes include:
* Correcting data format issues
* Providing missing required information
* Adjusting system configurations
* Retrying with smaller batches
## Troubleshooting
Try these solutions:
1. Use standard header names (First Name, Last Name, Email, Company)
2. Remove special characters from headers
3. Specify the mapping directly in your conversation with Mary
4. Check that your CSV is properly formatted
Check these common issues:
1. Verify the correct destination program/list was specified
2. Ensure you have proper permissions in your marketing automation system
3. Check that the integration is properly configured
4. Look for error messages in the processing feedback
Mary will provide confirmation including:
* Number of contacts processed
* Destination program/list information
* Any errors or warnings
* Next steps for campaign activation
Contact your Marketing Operations team immediately. While there's no automatic revert function, they can help remove incorrectly uploaded contacts from your system.
## Best Practices
Follow these guidelines:
1. Include as many relevant fields as possible
2. Use clear, standard column headers
3. Clean up obvious data errors beforehand
4. Include metadata about the list source
5. Test with a small sample first
Use enrichment when:
* You have incomplete contact information
* Job titles need standardization
* You want to improve lead scoring accuracy
* Data came from events or forms with limited fields
This depends on your campaign frequency:
* Event-based: After each event or registration deadline
* Campaign-based: As part of campaign preparation
* Ongoing: Regular intervals based on lead generation
## Getting Help
1. **During processing**: Ask Mary directly in the chat
2. **Setup issues**: Contact your Marketing Operations team
3. **Integration problems**: Check your system integration documentation
4. **General questions**: Refer to this FAQ or the setup guide
Contact your Marketing Operations team who can work with allGood support to request enhancements or configuration changes.
# Data Cleaning and Enrichment
Source: https://docs.allgoodhq.com/use-cases/list-upload/features/index
allGood's List Upload includes a comprehensive library of pre-built data processing steps that automatically clean, standardize, and enrich your contact data. These AI-powered processes ensure your marketing data is consistent, accurate, and ready for campaign deployment.
## Core Enrichment
* [Data enrichment](/use-cases/list-upload/features/enrich) — fetch missing lead information from Scrapin, Waterfall.io, and other providers to fill job title, company, email, and location gaps.
## Job-Related Processing
* [Job function categorization](/use-cases/list-upload/features/job-function) — standardize job titles into Product, Engineering, Marketing, Sales, and other core functions.
* [Job level assignment](/use-cases/list-upload/features/job-level) — map titles to CxO, VP, Director, Manager, IC, and more.
* [Job level assignment (enriched)](/use-cases/list-upload/features/job-level-enriched) — improved hierarchy detection when enriched titles are available.
* [Job role mapping](/use-cases/list-upload/features/job-role) — align titles with prioritized technical roles like SOC or Incident Response.
* [Job role mapping (enriched)](/use-cases/list-upload/features/job-role-enriched) — use enriched titles for more precise role placement.
* [Job title standardization](/use-cases/list-upload/features/job-title-fix) — fix spelling, punctuation, capitalization, and translations.
## Data Standardization
* [Full name splitting](/use-cases/list-upload/features/name-split) — break full names into first/last components.
* [Phone number formatting](/use-cases/list-upload/features/phone-number-fix) — convert phone numbers to E.164.
* [Syntax standardization](/use-cases/list-upload/features/syntax-fix) — clean categorical values and translations.
* [Location standardization](/use-cases/list-upload/features/country-state-fix) — normalize countries, states, and postal codes.
* [Industry normalization](/use-cases/list-upload/features/industry-alignment) — align industries to standard categories.
## How Pre-Built Steps Work
### Automatic Detection
Mary automatically analyzes your CSV data and recommends appropriate processing steps based on:
* Data quality issues detected
* Missing information that can be enriched
* Inconsistencies in formatting or categorization
* Your campaign requirements and goals
### Intelligent Processing
Each step uses AI-powered algorithms to:
* Identify patterns in your data
* Apply standardization rules
* Enrich missing information
* Validate and clean existing data
* Ensure compatibility with your marketing automation system
### Customizable Application
You can choose which steps to apply based on:
* Your specific data quality needs
* Campaign requirements
* Time constraints
* Data privacy considerations
## Benefits of Pre-Built Steps
### Improved Data Quality
* Consistent formatting across all contact fields
* Reduced data entry errors and inconsistencies
* Enhanced lead scoring accuracy
* Better campaign segmentation capabilities
### Time Savings
* Automated processing eliminates manual data cleanup
* Reduced time from list upload to campaign launch
* Fewer errors requiring manual correction
* Streamlined campaign preparation workflows
### Enhanced Targeting
* Better lead segmentation through standardized categories
* Improved personalization with enriched data
* More accurate account-based marketing targeting
* Enhanced lead scoring and qualification
## Getting Started
To use pre-built steps:
1. Upload your CSV file through the List Upload interface
2. Mary will analyze your data and recommend appropriate steps
3. Review and approve the suggested processing steps
4. Monitor the processing progress and results
5. Review the cleaned and enriched data before final upload
## Next Steps
* Review the [Setup Guide](/use-cases/list-upload/setup) for configuration options
* Explore individual feature pages above for detailed information on each processing step
# Overview
Source: https://docs.allgoodhq.com/use-cases/list-upload/index
Automate CSV list processing and lead management with allGood's AI-driven platform. Upload contact lists, extract metadata, and seamlessly integrate with your marketing automation systems including Marketo, HubSpot, and more.
## Get Setup
* [Setup](/use-cases/list-upload/setup) — configure templates, features, and sync requirements.
* [FAQ](/use-cases/list-upload/faq) — answers to the most common operational and troubleshooting questions.
***
## List Presenting Guides
Determine how you want to upload your lists to Mary. Choose a guide based on your preferred method of list processing, whether directly in allGood or through integrated platforms like Asana or Workfront.
* [Native mode](/use-cases/list-upload/data-import-guides/guide-direct) — process CSV lists directly inside allGood.
* [Asana integration](/use-cases/list-upload/data-import-guides/guide-asana) — configure a task-driven workflow.
* [Workfront integration](/use-cases/list-upload/data-import-guides/guide-workfront) — orchestrate uploads through Workfront projects.
***
## List Processing Features
Explore the powerful data processing features available in allGood for list uploads. These features help you clean, standardize, and enrich your contact data to ensure high-quality marketing lists.
* [Data cleaning and enrichment](/use-cases/list-upload/features/) — review every automation step that can be applied during processing.
***
## Sync Back Guides
Learn how to configure field syncing and data flow back to your marketing automation platforms after processing lists in allGood. This ensures that your clean and enriched data is automatically updated in your systems.
* [HubSpot sync-back](/use-cases/list-upload/sync-back-guides/sync-back-hubspot) — configure outbound updates to HubSpot.
* [Marketo sync-back](/use-cases/list-upload/sync-back-guides/sync-back-marketo) — set up field mapping and data synchronization with Marketo.
# Marketo Auto-Activate Smart Campaigns
Source: https://docs.allgoodhq.com/use-cases/list-upload/marketo/smart_campaigns
## Now Live!
Smart campaign activation is now live! To add smart campaign activation to your list upload flow, [***reach out to support or to your allGood engineers via slack to set it up!***](mailto:support@allgoodhq.com)
Mary can automate more than just the list upload itself. When cloning a new program for your lists, smart campaigns still need to be activated. That extra step is no longer manual—Mary can now automatically complete that task for you!
## How It Works
After cloning the new program (or identifying your existing program) that is being used for list upload, Mary will check it for all smart campaigns contained in the program whose names start with the prefix `[AUTO]` and activate them.
## Setup
There are two things that you must setup in Marketo such that Mary can properly activate the smart campaign.
You need to confirm that the Smart Campaigns are valid for activation in Marketo.
A valid smart campaign
* ... is a Trigger Smart Campaign *(i.e. has at least one trigger in the Smart List)*
* ... has at least one flow step
If you add attempt to activate a smart campaign that isn't valid, **Mary** will return an error indicating which smart campaign(s) she was not able to activate and why.
In that case you will have to go into Marketo and manually fix the smart campaign.
Depending on your program, you might not want to automatically activate all smart campaigns in the program. To resolve this ambiguity, you must add the prefix `[AUTO]` to the name of any triggered smart campaign you want Mary to activate.
That's all! Once the feature is enabled by the allGood team for your environment, Mary will be able to activate your smart campaigns after cloning the program with the automatic markers.
# Setup Guide
Source: https://docs.allgoodhq.com/use-cases/list-upload/setup
## Overview
This guide walks through the complete setup process for List Upload, enabling your marketing teams to process CSV contact lists efficiently. Proper setup ensures smooth data processing, accurate enrichment, and seamless integration with your marketing automation platform.
***
## Prerequisites
### Required Integrations
Before configuring List Upload, ensure you have completed the integration setup for your chosen platform:
* **Marketo Integration**: [Marketo Setup Guide](/integrations/marketo)
* **HubSpot Integration**: [HubSpot Setup Guide](/integrations/hubspot)
### System Requirements
* allGood platform access with appropriate permissions
* Marketing automation system admin access
* API credentials configured for your chosen platform
* User permissions configured for marketing team members
***
## Platform-Specific Configuration
### Marketo Setup
#### Program Template Configuration
1. **Create Program Templates**
* Set up standard program templates for common use cases (webinars, events, campaigns)
* Configure proper folder structure and naming conventions
* Establish channel configurations for different campaign types
2. **Folder Structure Setup**
* Create destination folders for different campaign types
* Establish naming conventions for programs and folders
* Configure folder permissions for proper access control
3. **Campaign Member Status Configuration**
* Define standard member statuses for different event types:
* **Webinars**: Registered, Attended, No Show, On Demand
* **Trade Shows**: Registered, Attended, Hot Lead, Follow Up
* **Events**: Registered, Attended, Cancelled, Waitlisted
* Ensure status progressions are properly configured
* Test status assignments to prevent data conflicts
#### Marketo-Specific Requirements
* **Program Cloning**: Verify template programs can be cloned successfully
* **API Permissions**: Ensure API user has program creation and management permissions
* **Field Mapping**: Configure custom field mappings for your organization's data structure
### HubSpot Setup
#### Contact List Configuration
1. **List Structure Setup**
* Create standard list categories for different campaign types
* Establish naming conventions for contact lists
* Configure list permissions and access controls
2. **Contact Property Configuration**
* Map standard contact properties to your data fields
* Create custom properties for campaign-specific data
* Configure property groups for better organization
3. **Workflow Integration**
* Set up workflows to trigger when contacts are added to lists
* Configure lead scoring workflows for enriched data
* Establish nurture workflows for different list types
#### HubSpot-Specific Requirements
* **List Management**: Verify list creation and contact assignment permissions
* **Contact Management**: Ensure API user can create and update contacts
* **Property Mapping**: Configure custom property mappings for your data structure
***
## Data Processing Configuration
**Dataset syncing** can significantly improve processing efficiency and reduce enrichment costs by leveraging your existing database. Learn more in the [Datasets guide](/integrations/datasets).
### Enrichment Settings
Configure which enrichment processes should be available to your marketing teams:
#### Core Enrichment Options
* **Basic Enrichment**: allGood will conduct it’s own waterfall enrichment
* **Custom Enrichment**: Contact allGood to setup integration with your own enrichment provider to use your own keys and accounts
#### Data Standardization Options
* **Phone Number Formatting**: Enable E.164 standardization
* **Location Standardization**: Configure country/state normalization
* **Industry Alignment**: Set up industry categorization for your business
* **Job Title Standardization**: Enable spelling and format correction
* **Job Function Categorization**: Configure relevant job functions for your industry
* **Job Level Assignment**: Set up hierarchy levels relevant to your organization
* **Job Role Mapping**: Define role priorities for your lead scoring system
### Processing Flow Configuration
1. **Required Fields Definition**
* Define minimum required fields for your campaigns
* Configure validation rules for data quality
* Set up field mapping alternatives and synonyms
***
## And You’re Done!
By completing this guide you should have:
* Your platforms of choice fully integrated with allGood
* For Marketo, your marketing activity types and statuses formalized in a document
* For HubSpot, your campaign types formalized in a document
* Leads/Contacts should have fields for the new standardized data (e.g. Job Role)
* (Optional) If using own enrichment providers, they should be set up as integrations
* Your flow for list upload defined
* What fields you expect to have in your list
* What standardized categories are you fitting them in (e.g. Industries, Job Levels, Job Functions, etc.)
* What fields you want to be populated in your platform
Once you have these ready, reach out to the allGood team to get list uploads ready for you!
# HubSpot Sync Guide
Source: https://docs.allgoodhq.com/use-cases/list-upload/sync-back-guides/sync-back-hubspot
Configure field mapping and data synchronization to automatically sync processed list data back to your HubSpot CRM.
## Overview
The HubSpot sync back integration ensures that your processed list data flows seamlessly into your HubSpot CRM with proper field mapping, contact creation, and activity tracking.
## Prerequisites
**AllGood Setup**:
* Completed [setup and prerequisites](/use-cases/list-upload/setup)
* Template structure defined
* Processing features selected
## Configuration Steps
**Standard Field Mapping**:
| List Field | HubSpot Property | Mapping Type |
| ---------- | -------------------- | ------------------- |
| Email | email | Direct |
| First Name | firstname | Direct |
| Last Name | lastname | Direct |
| Company | company | Company Association |
| Job Title | jobtitle | Direct |
| Phone | phone | Direct |
| Industry | industry | Standardized |
| Location | city, state, country | Split Mapping |
**Custom Property Mapping**:
* Campaign source → Custom property: "Campaign Source"
* Lead score → Custom property: "AI Lead Score"
* Processing date → Custom property: "List Upload Date"
* Data source → Custom property: "Data Source"
**Duplicate Handling**:
* **Primary Match**: Email address (exact match)
* **Secondary Match**: First name + last name + company
* **Action Options**:
* Update existing contact
* Create new contact
* Skip duplicate
**Contact Lifecycle**:
* New contacts → "Lead" lifecycle stage
* Existing contacts → Preserve current stage
* Enriched data → Update without stage change
# Marketo Sync Guide
Source: https://docs.allgoodhq.com/use-cases/list-upload/sync-back-guides/sync-back-marketo
Configure field mapping and data synchronization to automatically sync processed list data back to your Marketo instance.
## Overview
The Marketo sync back integration ensures that your processed list data flows seamlessly into your Marketo database with proper field mapping, lead creation, and program membership management.
## Prerequisites
* Marketo integration setup
* Completed [setup and prerequisites](/use-cases/list-upload/setup)
* Template structure defined
* Processing features selected
## Configure Field Mapping
**Standard Field Mapping**:
| List Field | Marketo Field | Field Type |
| ---------- | -------------------- | ---------- |
| Email | email | System |
| First Name | firstName | System |
| Last Name | lastName | System |
| Company | company | System |
| Job Title | title | System |
| Phone | phone | System |
| Industry | industry | System |
| Location | city, state, country | System |
**Custom Field Mapping**:
* Campaign source → Custom field: "Campaign\_Source\_\_c"
* Lead score → Custom field: "AI\_Lead\_Score\_\_c"
* Processing date → Custom field: "List\_Upload\_Date\_\_c"
* Data source → Custom field: "Data\_Source\_\_c"
* Job function → Custom field: "Job\_Function\_Standardized\_\_c"
**Example**:
# ChatGPT Desktop
Source: https://docs.allgoodhq.com/use-cases/marketo-mcp/chatgpt-desktop
Install the allGood Marketo MCP server as a connector in the classic ChatGPT desktop app so you can work with Marketo directly from a ChatGPT conversation.
The allGood Marketo MCP server brings Mary's Marketo capabilities — looking up programs, emails, forms, and templates, cloning campaigns, uploading assets to Design Studio — directly into the classic ChatGPT desktop app. This setup takes about 5 minutes.
## Before you begin
You'll need:
* The **ChatGPT desktop app** (classic app, macOS or Windows), signed in
* An **allGood account** with access to the Marketo integration
* The allGood Marketo MCP server URL: `https://api.allgoodhq.app/mcp/marketo`
## Steps
1. Open the **ChatGPT desktop app**
2. Click your profile icon and go to **Settings**
3. Select **Plugins** in the left sidebar
1. Scroll to the top and click **Add > Add MCP Server**
2. Fill in the connector details:
* **Name**: `allGood Marketo`
* **Type**: Streamable HTTP
* **MCP Server URL**: `https://api.allgoodhq.app/mcp/marketo`
3. Click **Save**
1. Click **Authenticate** on the new **allGood Marketo** connector
2. A browser window opens and prompts you to log into your allGood account
3. Review the requested permissions and click **Allow**
4. Once authorized, the window closes and the connector shows as **Connected**
1. Start a new chat in ChatGPT
2. Select **allGood Marketo** from the list of available Plugins
3. Test the connection by asking ChatGPT something like:
> "Using allGood Marketo, look up the program details for \[program name]."
If ChatGPT returns Marketo data, the connection is working correctly.
# Claude Desktop
Source: https://docs.allgoodhq.com/use-cases/marketo-mcp/claude-desktop
Install the allGood Marketo MCP server as a custom connector in Claude Desktop so you can work with Marketo directly from a Claude conversation.
The allGood Marketo MCP server brings Mary's Marketo capabilities — looking up programs, emails, forms, and templates, cloning campaigns, uploading assets to Design Studio — directly into Claude Desktop. This setup takes about 5 minutes.
## Before you begin
You'll need:
* **Claude Desktop** installed (macOS or Windows)
* A Claude plan that supports custom connectors (Pro, Max, Team, or Enterprise)
* An **allGood account** with access to the Marketo integration
* The allGood Marketo MCP server URL: `https://api.allgoodhq.app/mcp/marketo`
Custom connectors aren't available on Claude's Free plan, and may need to be enabled by a workspace admin on Team or Enterprise plans.
## Steps
1. Open **Claude Desktop**
2. Click your profile icon in the bottom-left corner and select **Settings**
3. Go to the **Connectors** tab
1. Scroll to the top of the Connectors list and click **Add > Add custom connector**
2. Fill in the connector details:
* **Name**: `allGood Marketo`
* **URL**: `https://api.allgoodhq.app/mcp/marketo`
3. Click **Add**
1. Find **allGood Marketo** in your Connectors list and click **Connect**
2. A browser window opens and prompts you to log into your allGood account
3. Review the requested permissions and click **Allow**
4. Once authorized, the browser window closes and the connector status changes to **Connected**
1. Start a new chat in Claude Desktop
2. Click the tools icon below the message box
3. Confirm **allGood Marketo** is toggled on for this conversation
4. Test the connection by asking Claude something like:
> "Using allGood Marketo, look up the program details for \[program name]."
If Claude returns Marketo data, the connection is working correctly.
## Optional: Allow allGood's API domain for image uploads
This step is only needed if you want to use the Marketo MCP's image upload capability (uploading assets to Design Studio). Everything else — looking up programs, emails, forms, and templates, cloning campaigns — works without it.
Claude restricts which external domains a connector can reach for capabilities like file/image handling. To let Claude upload images to Marketo's Design Studio through the allGood connector, add allGood's API domain to the allowlist:
1. In **Settings**, go to the **Capabilities** tab
2. Find the **Domain allowlist** (sometimes listed under network or connector permissions)
3. Click **Add domain** and enter `api.allgoodhq.app`
4. Save your changes
## Troubleshooting
Check that your browser isn't blocking pop-ups, then retry.
Click **Connect** again and re-authenticate — your allGood session may have expired.
Make sure the connector is toggled on for the current chat (see Step 4) — it's enabled per-conversation, not globally.
Custom connectors require a Claude plan that supports them (Pro, Max, Team, or Enterprise) and may need to be enabled by your workspace admin.
Check **Settings → Capabilities → Domain allowlist** and confirm `api.allgoodhq.app` is listed. If your workspace restricts outbound domains, Claude blocks the image upload until the domain is added — this doesn't affect any other Marketo MCP functionality.
# Overview
Source: https://docs.allgoodhq.com/use-cases/marketo-mcp/index
The allGood Marketo MCP server brings Mary's Marketo capabilities into the AI apps you already use — like Claude Desktop and ChatGPT desktop. Once connected, you can ask the assistant to look up programs, emails, forms, and templates, clone campaigns, and upload assets to Marketo's Design Studio, all from the same chat window.
***
## Get Marketo MCP Connected
Follow the [Claude Desktop guide](/use-cases/marketo-mcp/claude-desktop) to add allGood Marketo as a custom connector.
Follow the [ChatGPT Desktop guide](/use-cases/marketo-mcp/chatgpt-desktop) to add allGood Marketo as a connector under Settings → Plugins.